Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python scipy.optimize.fmin_bfgs优化给出了与简单函数调用不同的结果_Python_Numpy_Pandas_Scipy_Mathematical Optimization - Fatal编程技术网

Python scipy.optimize.fmin_bfgs优化给出了与简单函数调用不同的结果

Python scipy.optimize.fmin_bfgs优化给出了与简单函数调用不同的结果,python,numpy,pandas,scipy,mathematical-optimization,Python,Numpy,Pandas,Scipy,Mathematical Optimization,我正在研究一些numpy/scipy函数,我注意到scipy.optimize.fmin_bfgs需要对所调用的函数进行更改,以给出与直接函数调用相比的正确结果。我对fnRSS函数的第一个定义在调用函数时返回正确的值,但拒绝在优化中工作;我的第二个定义在调用函数时给出了错误的结果,但在运行优化时给出了正确的结果。有人能告诉我,在优化过程中转换vY参数的关键是什么吗?它应该已经是164x1了 import numpy as np import scipy as sp import pandas a

我正在研究一些numpy/scipy函数,我注意到scipy.optimize.fmin_bfgs需要对所调用的函数进行更改,以给出与直接函数调用相比的正确结果。我对
fnRSS
函数的第一个定义在调用函数时返回正确的值,但拒绝在优化中工作;我的第二个定义在调用函数时给出了错误的结果,但在运行优化时给出了正确的结果。有人能告诉我,在优化过程中转换
vY
参数的关键是什么吗?它应该已经是164x1了

import numpy as np
import scipy as sp
import pandas as pd
from scipy import optimize

if __name__ == "__main__":
    urlSheatherData = "http://www.stat.tamu.edu/~sheather/book/docs/datasets/MichelinNY.csv"
    data = pd.read_csv(urlSheatherData)
    Xs = np.vstack(data[['Service','Decor', 'Food', 'Price']].values)
    Xs = np.concatenate((np.vstack(np.ones(Xs.shape[0])),Xs), axis=1)
    Ys = np.vstack(data[['InMichelin']].values)
    # optimal solution (given)
    vBeta = np.array([-1.49209249,  -0.01117662,  0.044193, 0.05773374, 0.00179794]).reshape(5,1)

    print Ys.shape, Xs.shape, vBeta.shape 
    # first definition of function
    def fnRSS(vBeta, vY, mX):
      return np.sum((vY - np.dot(mX, vBeta))**2) 
    print fnRSS(vBeta, Ys, Xs) # correct value
    print np.linalg.lstsq(Xs, Ys)[1] # confirm correct value
    print sp.optimize.fmin_bfgs(fnRSS, x0=vBeta, args=(Ys,Xs)) # wrong value
    # second definition
    def fnRSS(vBeta, vY, mX):
      return np.sum((vY.T - np.dot(mX, vBeta))**2) 
    print fnRSS(vBeta, Ys, Xs) # incorrect value
    print sp.optimize.fmin_bfgs(fnRSS, x0=vBeta, args=(Ys,Xs)) # correct convergence but simple call gives different value
我的输出:

(164, 1) (164, 5) (5, 1)
26.3239061505
[ 26.32390615]
Warning: Desired error not necessarily achieved due to precision loss.
         Current function value: 6660.000000
         Iterations: 39
         Function evaluations: 3558
         Gradient evaluations: 480
[  4.51220111e-01   1.32711255e-07   8.09143368e-08  -1.06633003e-07
  -5.18448332e-08]
9002.87916028
Warning: Desired error not necessarily achieved due to precision loss.
         Current function value: 26.323906
         Iterations: 29
         Function evaluations: 1954
         Gradient evaluations: 260
[-1.49209095 -0.0111764   0.04419313  0.05773347  0.00179789]

它不是关于
vY.T
,而是关于
vBeta
,即
x
fmin_bfgs
传递到
fnRSS
的,不是二维向量,而是一维数组。因此,尽管您明确尝试将
x0=vBeta
指定为一个形状数组(5,1),但它在内部被转换为1d形状数组(5,),最后返回的结果也是如此。

我明白您的意思,当我放入
print vY.shape,mX.shape,vBeta.shape
fnRSS
函数中,但我不认为这会破坏收敛或需要
vY.t
。别误会,你可能是对的,因为它是有效的,但是在第一个定义中,你应该在第一个括号内得到一个
(164,1)-(164,)
,但是第二个定义应该给出
(1164)-(164,)
这不应该计算,但它会计算。正如alko的后续内容:只需玩点,看看当vBeta是1-D而不是列数组时,会得到什么形状。np.dot可根据需要广播/转置一维阵列,但形状和ndim不同。Y需要匹配你的vBeta.ndimThanks,我会处理它。我想我不喜欢这样一个事实:当你测试优化的结果时,你必须对一个返回错误的函数进行优化,这会杀死很多单元测试。