Scipy优化在1维矩阵与矢量输入st上的行为有所不同。一维矩阵解决方案是错误的

时间:2019-03-19 08:15:04

标签: python numpy scipy

我经历过喂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)。这仍然让我感到“怪异”,我想知道我是否在这里缺少更大的要点。

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的形状会更改成本计算,则会更改优化。