我经历过喂scipy。优化1-d矩阵(形状(N,1))会得到不同的(错误的)结果,而以向量的形式给它提供相同的数据(向量是{{1} }和w
在下面的MVE中
y
给予
向量案例: [3.13999999e + 00 2.77999996e + 00 -9.99999940e-01 1.79002338e-08,1.61800001e + 00] 1.7211226932545288e-08 // TRUE几乎为0
1-d矩阵案例: [-0.35218177 -0.50008129 0.34958755 -0.42210756 0.79680766] 3.3810648518841924 //错误无处接近真实解决方案
有人知道为什么使用一维矩阵输入的解决方案“错误”吗?
我怀疑这是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)
沿某处的b / c将参数向量变成实际向量,然后我知道(2,)+(2,1)给出(2,2)矩阵而不是(2,)或(2,1)。这仍然让我感到“怪异”,我想知道我是否在这里缺少更大的要点。
答案 0 :(得分:1)
In [300]: y
Out[300]: array([ 4.7197293 , 1.7725223 , 0.85632763, -6.17272225, -3.8040323 ])
In [301]: w0
Out[301]: array([0., 0., 0., 0., 0.])
In [302]: cost_function(w0,X,y)
Out[302]: 3.465066756332
最初更改y
的形状不会改变成本:
In [306]: cost_function(w0,X,y.reshape(-1,1))
Out[306]: 3.4650667563320003
现在获得解决方案: 在[308]中:输出= optimize.minimize(cost_function,w0,args =(X,y),options = {'disp':False ...:,'maxiter':128})
In [310]: output.x
Out[310]:
array([ 3.14000001e+00, 2.77999999e+00, -9.99999962e-01, -5.58139763e-08,
1.61799993e+00])
将成本评估为最佳x
In [311]: cost_function(output.x,X,y)
Out[311]: 7.068144833866085e-08 # = output.fun
但是使用重塑的y
,代价却有所不同:
In [312]: cost_function(output.x,X,y.reshape(-1,1))
Out[312]: 4.377833258899681
代码将初始值x0
展平(请查看optimize.optimize._minimize_bfgs
),因此更改w0
的形状无关紧要。但是args
数组没有更改就传递给cost函数。因此,如果更改y
的形状会更改成本计算,则会更改优化。