0

目标函数 我正在尝试进行时空自动回归(STAR)。下面的代码基本上定义了我需要最小化的上述目标函数,其中 Y 是 N×K 矩阵,D 是 N×N 矩阵。

import numpy as np
from sys import exit

def obj_func(Y, D, Phi):

    # check what went wrong
    if not D.shape[0]==D.shape[1]:
        print("D =", D)
        exit()
    if not Y.shape[0]==D.shape[0]:
        print("Y =", Y)
        print("D =", D)
        exit()
    if Y.shape[1]<len(Phi):
        print("Y =", Y)
        print("T =", len(Phi)-1)
        exit()

    T = len(Phi) - 1
    N = Y.shape[0]
    K = Y.shape[1]
    c = Phi[0] * np.ones((N,1))

    loss = 0
    for j in range(T,K):
        y = Y[:,j].reshape((N,1))
        v = y - c 
        for tau in range(1,T+1):
            y = Y[:, j-tau].reshape((N,1))
            v = v - Phi[tau] * D.dot(y)
        loss += np.linalg.norm(v)

    return(loss / (K-T))

优化出错了,所以只添加了第一个块来检查究竟是哪一部分出错了。我scipy.optimize.minimize( )用来最小化目标函数。

from scipy.optimize import minimize

def STAR_pm(Y, D, T):
    phi = np.random.normal(loc=0, scale=5, size=T+1)
    result = minimize(obj_func, x0=phi, args=(Y,D,), )
    if not result.success:
        print("No convergence. Try again.")
        exit()
    return(result.x)

但是,当我运行以下命令时,优化失败并打印出矩阵 D。结果不知何故,Y 已分配给 D,因此 D 不再是 N×N 矩阵。

Y = np.random.randint(0,10, (3,10))
D = np.random.rand(3,3)

STAR_pm(Y, D, T=2)

我觉得很混乱。为什么D完全改变了?这是否发生在其他人身上?有人帮我吗?

4

1 回答 1

0

scipy.optimize.minimize目标函数的第一个参数始终是设计向量。额外的参数是用 args 给出的,它将被称为obj_func(x, *args). 从您的示例中,我假设您的设计向量是Phi,您需要做的就是将目标的签名重写为 obj_func(Phi, Y, D)

于 2020-05-01T20:06:38.597 回答