Я испытал, что кормление scipy.optimize 1-d матрица (формы (N, 1)) дает разные (неправильные) результаты по сравнению с предоставлением ему одинаковых данных в виде векторов (векторы w
и y
в MVE ниже
import numpy as np
from scipy.optimize import minimize
X = np.array([[ 1.13042959, 0.45915372, 0.8007231 , -1.15704469, 0.42920652],
[ 0.14131009, 0.9257914 , 0.72182141, 0.86906652, -0.32328187],
[-1.40969139, 1.32624329, 0.49157981, 0.2632826 , 1.29010016],
[-0.87733399, -1.55999729, -0.73784827, 0.15161383, 0.11189782],
[-0.94649544, 0.10406324, 0.65316464, -1.37014083, -0.28934968]])
wtrue = np.array([3.14,2.78,-1,0, 1.6180])
y = X.dot(wtrue)
def cost_function(w, X, y):
return np.mean(np.abs(y - X.dot(w)))
# %%
w0 = np.zeros(5)
output = minimize(cost_function, w0, args=(X, y), options={'disp':False, 'maxiter':128})
print('Vector Case:\n', output.x, '\n', output.fun)
# Reshaping w0 and y to (N,1) will 'break things'
w0 = np.zeros(5).reshape(-1,1)
y = y.reshape(-1,1) #This is the problem, only commenting this out will make below work
output = minimize(cost_function, w0, args=(X, y), options={'disp':False, 'maxiter':128})
print('1-d Matrix Case:\n', output.x, '\n', output.fun)
Придает
Vector Case:
[3.13999999e + 00 2.77999996e + 00 -9.99999940e-01 1.79002338e-08,1.61800001e + 00]
1.7211226932545288e-08 // ИСТИНА почти 0
1-й матричный корпус:
[-0,35218177 -0,50008129 0,34958755 -0,42210756 0,79680766]
3.3810648518841924 // НЕПРАВИЛЬНО близко к истинному решению
Кто-нибудь знает, почему решение, использующее 1-d матричные входы, получается «неправильным»?
Я подозреваю, что это где-то на пути b / c .minimize
превращает вектор параметров в реальный вектор, и тогда я знаю, что (2,) + (2,1) дает (2,2) матрицу скорее чем (2,) или (2,1). Это все еще кажется мне «странным», и я хотел бы знать, не упускаю ли я что-то большее здесь.