updated eigvalue solvers
This commit is contained in:
@@ -0,0 +1,106 @@
|
||||
# # Finding eigenvalues of matrices with neural networks.
|
||||
# Script for finding the eigenvectors corresponding to the largest eigenvalue of a matrix with a neural network.
|
||||
|
||||
import tensorflow.compat.v1 as tf
|
||||
tf.disable_v2_behavior()
|
||||
tf.reset_default_graph()
|
||||
# tf.set_random_seed(343)
|
||||
|
||||
# import tensorflow as tf
|
||||
import numpy as np
|
||||
from matplotlib import cm
|
||||
from matplotlib import pyplot as plt
|
||||
from mpl_toolkits.mplot3d import axes3d
|
||||
#from lib import compute_dx_dt
|
||||
|
||||
matrix_size = 6
|
||||
|
||||
A = np.random.random_sample(size=(matrix_size,matrix_size))
|
||||
A = (A.T + A)/2.0
|
||||
start_matrix = A
|
||||
|
||||
eigen_vals, eigen_vecs = np.linalg.eig(A)
|
||||
|
||||
A = tf.convert_to_tensor(A)
|
||||
print("A = ", A)
|
||||
|
||||
x_0 = tf.convert_to_tensor(np.random.random_sample(size = (1,matrix_size)))
|
||||
print("x0 = ", x_0)
|
||||
|
||||
## The construction phase
|
||||
|
||||
num_iter = 10000
|
||||
num_hidden_neurons = [50]
|
||||
num_hidden_layers = np.size(num_hidden_neurons)
|
||||
|
||||
|
||||
with tf.variable_scope('dnn'):
|
||||
|
||||
previous_layer = x_0
|
||||
|
||||
for l in range(num_hidden_layers):
|
||||
current_layer = tf.layers.dense(previous_layer, num_hidden_neurons[l],activation=tf.nn.sigmoid)
|
||||
previous_layer = current_layer
|
||||
|
||||
dnn_output = tf.layers.dense(previous_layer, matrix_size)
|
||||
|
||||
with tf.name_scope('loss'):
|
||||
print("dnn_output = ", dnn_output)
|
||||
|
||||
x_trial = tf.transpose(dnn_output)
|
||||
print("x_trial = ", x_trial)
|
||||
|
||||
temp1 = (tf.tensordot(tf.transpose(x_trial), x_trial, axes=1)*A)
|
||||
temp2 = (1- tf.tensordot(tf.transpose(x_trial), tf.tensordot(A, x_trial, axes=1), axes=1))*np.eye(matrix_size)
|
||||
func = tf.tensordot((temp1-temp2), x_trial, axes=1)
|
||||
|
||||
print(temp1)
|
||||
print(temp2)
|
||||
print(func)
|
||||
|
||||
func = tf.transpose(func)
|
||||
x_trial = tf.transpose(x_trial)
|
||||
|
||||
loss = tf.losses.mean_squared_error(func, x_trial)
|
||||
|
||||
learning_rate = 0.001
|
||||
|
||||
with tf.name_scope('train'):
|
||||
optimizer = tf.train.GradientDescentOptimizer(learning_rate)
|
||||
traning_op = optimizer.minimize(loss)
|
||||
|
||||
init = tf.global_variables_initializer()
|
||||
|
||||
g_dnn = None
|
||||
|
||||
losses = []
|
||||
|
||||
with tf.Session() as sess:
|
||||
init.run()
|
||||
for i in range(num_iter):
|
||||
sess.run(traning_op)
|
||||
|
||||
if i % 100 == 0:
|
||||
l = loss.eval()
|
||||
print("Step:", i, "/",num_iter, "loss: ", l)
|
||||
losses.append(l)
|
||||
|
||||
x_dnn = x_trial.eval()
|
||||
x_dnn = x_dnn.T
|
||||
|
||||
|
||||
# ## Plotting loss over time
|
||||
|
||||
plt.plot(losses[:5])
|
||||
plt.xlabel("Iteration")
|
||||
plt.ylabel("Loss")
|
||||
|
||||
print("Eigenvector NN = \n", (x_dnn/(x_dnn**2).sum()**0.5), "\n")
|
||||
|
||||
eigen_val_nn = x_dnn.T @ (start_matrix @ x_dnn) / (x_dnn.T @ x_dnn)
|
||||
|
||||
print("Eigenvalue NN = \n", eigen_val_nn, "\n \n")
|
||||
print("Eigenvector analytic = \n", eigen_vecs)
|
||||
print("\n")
|
||||
print("Eigenvalues analytic = \n",eigen_vals)
|
||||
|
||||
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user