Python 3.x 使用Scipy.optimize最小化SSE

Python 3.x 使用Scipy.optimize最小化SSE,python-3.x,scipy,mathematical-optimization,minimization,scipy-optimize,Python 3.x,Scipy,Mathematical Optimization,Minimization,Scipy Optimize,我试图使用scipy.optimize优化函数的SSE(平方误差之和)。为了测试,我创建了一个简单的问题,如下代码所示。 但scipy输出的优化参数从未使SSE=0。有人能帮我理解,我哪里做错了 我试图用我的代码计算的SSE和excel计算的SSE进行交叉检查。它匹配。然后我使用最小化函数最小化SSE函数,Scipy计算的函数与手工计算的函数不匹配。我使用的函数的形式是(y=ax+b)。下面是代码 import numpy as np from scipy.optimize import min

我试图使用
scipy.optimize
优化函数的SSE(平方误差之和)。为了测试,我创建了一个简单的问题,如下代码所示。 但scipy输出的优化参数从未使SSE=0。有人能帮我理解,我哪里做错了

我试图用我的代码计算的SSE和excel计算的SSE进行交叉检查。它匹配。然后我使用最小化函数最小化SSE函数,Scipy计算的函数与手工计算的函数不匹配。我使用的函数的形式是(y=ax+b)。下面是代码

import numpy as np
from scipy.optimize import minimize


e=np.array([0,2])
sig1=np.array([0,200])
k = [10,10]
#n = 0.2
coe=np.array([k[0],k[1]])

def sig2(e):
    v=(k[0]*e)+ k[1]
    SEzip = zip(sig1, v)
    sse = 0
    for y in SEzip:
        sse += np.power((y[0] - y[1]),2)
    return sse

print (sig2(e))
def f(coe):
   print(coe)
   return f
result = minimize(sig2,coe,method='Nelder-Mead',callback=(f),options={'xtol': 1e-6,'ftol':1e-06,'maxiter':50000,'disp': True,'adaptive' : True})

print(result)

在这里,您正在打印您的
x0
aka
coe
,我编辑了您的代码并将目标函数
sig2()
缩短为一行,然后编辑了回调以显示测试的变量及其等效目标函数值。现在您可以清楚地看到已达到
sse=0

将numpy导入为np
从scipy.optimize导入最小化
#更漂亮的裸体印花
np.设置打印选项(精度=6)
#初始化
e=np.数组([0,2])
sig1=np.数组([0200])
k=[10,10]
coe=np.array([k[0],k[1]])
#定义目标函数
def sig2(e):
zip中y的返回和([np.幂((y[0]-y[1]),2)(sig1,(k[0]*e)+k[1]))
#定义回调
def f(e):
打印(“e:%25s | sig2(e):%5s”%(e,圆形(sig2(e),6)))
#优化
结果=最小化(sig2,
科,
方法='Nelder-Mead',
回调=f,
选项={'xtol':1e-6,'ftol':1e-06,
'maxiter':50000,'disp':True,'adaptive':True})
打印(结果)
输出:

...
e:     [-1.000053 18.999751] | sig2(e): 6e-06
e:     [-1.000062 19.000109] | sig2(e): 2e-06
e:     [-1.000062 19.000109] | sig2(e): 2e-06
e:     [-1.000062 19.000109] | sig2(e): 2e-06
e:     [-0.999934 18.999981] | sig2(e):   0.0
e:     [-1.000049 18.999979] | sig2(e):   0.0
e:     [-1.000027 19.000044] | sig2(e):   0.0
e:     [-0.999986 18.999996] | sig2(e):   0.0
e:     [-0.999986 18.999996] | sig2(e):   0.0
e:     [-0.999986 18.999996] | sig2(e):   0.0
e:     [-1.000009 18.999993] | sig2(e):   0.0
e:     [-1.000009 18.999993] | sig2(e):   0.0
e:     [-0.999995 19.      ] | sig2(e):   0.0
e:     [-0.999995 19.      ] | sig2(e):   0.0
e:     [-1.000003 18.999998] | sig2(e):   0.0
e:     [-1.       19.000002] | sig2(e):   0.0
e:     [-0.999998 19.      ] | sig2(e):   0.0
e:     [-1.000001 18.999999] | sig2(e):   0.0
e:     [-1.       19.000001] | sig2(e):   0.0
e:     [-0.999999 19.      ] | sig2(e):   0.0
e:                 [-1. 19.] | sig2(e):   0.0
e:                 [-1. 19.] | sig2(e):   0.0
e:                 [-1. 19.] | sig2(e):   0.0
Optimization terminated successfully.
         Current function value: 0.000000
         Iterations: 56
         Function evaluations: 110
 final_simplex: (array([[-1., 19.],
       [-1., 19.],
       [-1., 19.]]), array([6.221143e-12, 1.914559e-11, 1.946860e-11]))
           fun: 6.2211434216849394e-12
       message: 'Optimization terminated successfully.'
          nfev: 110
           nit: 56
        status: 0
       success: True
             x: array([-1., 19.])

在这里,您正在打印您的
x0
aka
coe
,我编辑了您的代码并将目标函数
sig2()
缩短为一行,然后编辑了回调以显示测试的变量及其等效目标函数值。现在您可以清楚地看到已达到
sse=0

将numpy导入为np
从scipy.optimize导入最小化
#更漂亮的裸体印花
np.设置打印选项(精度=6)
#初始化
e=np.数组([0,2])
sig1=np.数组([0200])
k=[10,10]
coe=np.array([k[0],k[1]])
#定义目标函数
def sig2(e):
zip中y的返回和([np.幂((y[0]-y[1]),2)(sig1,(k[0]*e)+k[1]))
#定义回调
def f(e):
打印(“e:%25s | sig2(e):%5s”%(e,圆形(sig2(e),6)))
#优化
结果=最小化(sig2,
科,
方法='Nelder-Mead',
回调=f,
选项={'xtol':1e-6,'ftol':1e-06,
'maxiter':50000,'disp':True,'adaptive':True})
打印(结果)
输出:

...
e:     [-1.000053 18.999751] | sig2(e): 6e-06
e:     [-1.000062 19.000109] | sig2(e): 2e-06
e:     [-1.000062 19.000109] | sig2(e): 2e-06
e:     [-1.000062 19.000109] | sig2(e): 2e-06
e:     [-0.999934 18.999981] | sig2(e):   0.0
e:     [-1.000049 18.999979] | sig2(e):   0.0
e:     [-1.000027 19.000044] | sig2(e):   0.0
e:     [-0.999986 18.999996] | sig2(e):   0.0
e:     [-0.999986 18.999996] | sig2(e):   0.0
e:     [-0.999986 18.999996] | sig2(e):   0.0
e:     [-1.000009 18.999993] | sig2(e):   0.0
e:     [-1.000009 18.999993] | sig2(e):   0.0
e:     [-0.999995 19.      ] | sig2(e):   0.0
e:     [-0.999995 19.      ] | sig2(e):   0.0
e:     [-1.000003 18.999998] | sig2(e):   0.0
e:     [-1.       19.000002] | sig2(e):   0.0
e:     [-0.999998 19.      ] | sig2(e):   0.0
e:     [-1.000001 18.999999] | sig2(e):   0.0
e:     [-1.       19.000001] | sig2(e):   0.0
e:     [-0.999999 19.      ] | sig2(e):   0.0
e:                 [-1. 19.] | sig2(e):   0.0
e:                 [-1. 19.] | sig2(e):   0.0
e:                 [-1. 19.] | sig2(e):   0.0
Optimization terminated successfully.
         Current function value: 0.000000
         Iterations: 56
         Function evaluations: 110
 final_simplex: (array([[-1., 19.],
       [-1., 19.],
       [-1., 19.]]), array([6.221143e-12, 1.914559e-11, 1.946860e-11]))
           fun: 6.2211434216849394e-12
       message: 'Optimization terminated successfully.'
          nfev: 110
           nit: 56
        status: 0
       success: True
             x: array([-1., 19.])

谢谢你的回复。但我发现预测的最佳值是不正确的。虽然Scipy输出显示sse=0,但如果我替换预测值,sse=33850。。最佳值应为(100,0)。在哪里替换这些值
sig2(np.array([-1,19])=0
sig2(np.array([100,0])=1056200
?是的,我正在手动替换相同的等式以交叉检查结果。我也检查了excel工作表,在这种情况下,
sig2()
的实现与您要替换的函数不匹配。祝你好运。非常感谢你的支持。我将错误的变量传递到函数中。。sig2(e)应该是sig2(k)。现在它是完美的工作!!!谢谢你的回复。但我发现预测的最佳值是不正确的。虽然Scipy输出显示sse=0,但如果我替换预测值,sse=33850。。最佳值应为(100,0)。在哪里替换这些值
sig2(np.array([-1,19])=0
sig2(np.array([100,0])=1056200
?是的,我正在手动替换相同的等式以交叉检查结果。我也检查了excel工作表,在这种情况下,
sig2()
的实现与您要替换的函数不匹配。祝你好运。非常感谢你的支持。我将错误的变量传递到函数中。。sig2(e)应该是sig2(k)。现在它是完美的工作!!!如果有人能帮我解决这个问题,那将是非常有帮助的。如果有人能帮我解决这个问题,那将是非常有帮助的。