ошибка при записи функции минимизации L-BFGS в python с использованием numpy - PullRequest
0 голосов
/ 24 февраля 2020

Я пытаюсь создать минимизирующую функцию 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

Любые указания о том, почему матрица, которую я пытаюсь создать, вызывает эту ошибку, будет принята с благодарностью!

1 Ответ

0 голосов
/ 24 февраля 2020

преобразовать входную строку в целое число:

n = int(input("input the dimension of the function : "))
...