Я пытаюсь создать минимизирующую функцию L-BFGS для первоначального предположения о симметричной матрице c (чтобы упростить взятие первого гессиана). Я использую язык python, а библиотека, которую нам разрешено использовать, - numpy. Хотя могут быть и другие ошибки, о которых я пока ничего не знаю, я хотел бы помочь решить конкретную ошибку c, в которой моя случайная матрица A (nxn) интерпретируется как 'str'. Спасибо! У меня есть следующий код:
# -*- coding: utf-8 -*-
"""
Created on Sun Feb 23 16:33:22 2020
@author: 12064
"""
n = input("input the dimension of the function : ")
x_row = np.array(x)
x_column = np.transpose(x_row)
A = np.random.randn(n,n)
B = np.transpose(A)
f = np.matmul(B, A)
m = 5
k = 0
alpha = 1
epsilon = 10 ** -4
#define var's
gradf = np.gradient(f)
gradf_at_x = gradf.dot(x)
hessian_0 = np.gradient(gradf)
g[k] = gradf.dot(x[k])
condition_1 = g[k].dot(g[k])
p_T[k] = np.array(n)
p[k] = np.transpose(p_T)
#index an array
memory1 = np.linspace(change_g[k-m], change_g[k])#
memory2 = np.linspace(change_x[k-m], change_x[k])
memory3 = np.linspace(alpha[k-m], alpha[k])
memory4 = np.linspace(p[k-m], p[k])
memory5 = np.linspace(x[k-m], x[k+1])
memory6 = np.linspace(g[k-m], g[k])
def myminimizer(x, f):
if np.sqrt(condition_1) < epsilon:
#magnitude of the gradient (square root of dot product of grad f at x'k) <= epsilon (10^-4)
return x, k
else:
if k < 1:
p[k] = -1 * (hessian_0 * gradf_at_x)
else:
p = -1 * r
omega = f.dot(x[k] + alpha[k]*p[k])
while 1:
alpha = r * alpha
x[k+1] = x[k] + alpha[k] * p[k]
change_x = x[k+1] - x[k]
change_g = g[k+1] - g[k]
q[k] = g[k]
for i in range(k-m, k):
alpha[i] = p[i] * change_x_transpose * q[i]
q = q - alpha[i] * change_g[i]
r = H[k] * q
for i in range (k-m, k):
Beta[i] = p[i] * change_g_transpose[i] * r[i]
r = r + change_x * (alpha[i] - Beta[i]) #check that its Beta[i]
k += 1
if np.sqrt(condition_1) < epsilon:
#magnitude of the gradient (square root of dot product of grad f at x'k) <= epsilon (10^-4)
print ("x, k")
print ("x is your omtimizer of f")
else:
if k < 1:
p[k] = -1 * (hessian_0 * gradf_at_x)
else:
p = -1 * r
omega = f.dot(x[k] + alpha[k]*p[k])
while 1:
alpha = r * alpha
x[k+1] = x[k] + alpha[k] * p[k]
change_x = x[k+1] - x[k]
change_g = g[k+1] - g[k]
q[k] = g[k]
for i in range(k-m, k):
alpha[i] = p[i] * change_x_transpose * q[i]
q = q - alpha[i] * change_g[i]
r = H[k] * q
for i in range (k-m, k):
Beta[i] = p[i] * change_g_transpose[i] * r[i]
r = r + change_x * (alpha[i] - Beta[i]) #check that its Beta[i]
k += 1
#END CODE#
Мое сообщение об ошибке:
runfile('C:/Users/12064/Desktop/Duncan/assignments/ass 4 4realsies.py', wdir='C:/Users/12064/Desktop/Duncan/assignments')
input the dimension of the function : 10
Traceback (most recent call last):
File "<ipython-input-41-e748654944e8>", line 1, in <module>
runfile('C:/Users/12064/Desktop/Duncan/assignments/ass 4 4realsies.py', wdir='C:/Users/12064/Desktop/Duncan/assignments')
File "C:\Users\12064\Anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 827, in runfile
execfile(filename, namespace)
File "C:\Users\12064\Anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 110, in execfile
exec(compile(f.read(), filename, 'exec'), namespace)
File "C:/Users/12064/Desktop/Duncan/assignments/ass 4 4realsies.py", line 11, in <module>
A = np.random.randn(n,n)
File "mtrand.pyx", line 1425, in mtrand.RandomState.randn
File "mtrand.pyx", line 1555, in mtrand.RandomState.standard_normal
File "mtrand.pyx", line 167, in mtrand.cont0_array
TypeError: 'str' object cannot be interpreted as an integer
Любые указания о том, почему матрица, которую я пытаюсь создать, вызывает эту ошибку, будет принята с благодарностью!