为了账号安全,请及时绑定邮箱和手机立即绑定

Scipy 优化在 1-d 矩阵与向量输入 st 中的行为不同。一维矩阵解是错误的

Scipy 优化在 1-d 矩阵与向量输入 st 中的行为不同。一维矩阵解是错误的

侃侃无极 2021-12-09 15:19:24
我已经经历了馈送scipy.optimize(形状的(N,1))1-d矩阵给出不同(错误)结果与在载体的形式给它相同的数据(矢量w和y在下面的MVEimport numpy as npfrom scipy.optimize import minimizeX = 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 workoutput = minimize(cost_function, w0, args=(X, y), options={'disp':False, 'maxiter':128})print('1-d Matrix Case:\n', output.x, '\n', output.fun)给矢量案例:[3.13999999e+00 2.77999996e+00 -9.99999940e-01 1.79002338e-08,1.61800001e+00] 1.72112269325408288一维矩阵案例:[-0.35218177 -0.50008129 0.34958755 -0.42210756 0.79680766] 3.3810648518841924 // 错得离真正的解决方案很远有谁知道为什么使用一维矩阵输入的解决方案“错误”?我怀疑这是一路上的 b/c.minimize将参数向量转换为实际向量然后我知道 (2,) + (2,1) 给出了 (2,2) 矩阵而不是 (2,)或 (2,1)。这仍然让我觉得“奇怪”,我想知道我是否在这里遗漏了一些更重要的点。
查看完整描述

1 回答

?
月关宝盒

TA贡献1772条经验 获得超5个赞

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]: output = 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

但是对于 reshape y,成本是不同的:


In [312]: cost_function(output.x,X,y.reshape(-1,1))                                       

Out[312]: 4.377833258899681

初始值x0已被代码展平(查看optimize.optimize._minimize_bfgs),因此更改 的形状w0无关紧要。但是args数组被传递给成本函数而没有改变。所以如果改变形状y改变成本计算,它会改变优化。


查看完整回答
反对 回复 2021-12-09
  • 1 回答
  • 0 关注
  • 167 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信