Почему аргумент матрицы моей целевой функции изменяется, когда я минимизирую его с помощью scipy.optimize.minimize ()? - PullRequest
0 голосов
/ 22 апреля 2020

Objective Function Я пытаюсь выполнить авторегрессию пространства-времени ( STAR ). Приведенный ниже код в основном определяет целевую функцию выше, которую мне нужно минимизировать, где Y - это матрица N-by-K, а D - матрица N-by-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 вообще изменился? Это случилось с кем-то еще? Кто-нибудь поможет мне здесь?

1 Ответ

0 голосов
/ 01 мая 2020

В scipy.optimize.minimize первым аргументом целевой функции всегда является вектор проектирования. Дополнительные аргументы даются с аргументами, они будут называться obj_func(x, *args). Из вашего примера я предполагаю, что ваш вектор дизайна равен Phi. Все, что вам нужно сделать, это переписать сигнатуру вашей цели как obj_func(Phi, Y, D).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...