使用Scipy.Simple最小化SSE [英] Minimizing SSE using Scipy.optimize minimize
问题描述
我正在尝试使用scipy.optimize
优化函数的SSE(平方误差总和).为了进行测试,我创建了一个简单的问题,如下代码.
但是,由scipy输出的优化参数永远不会使SSE = 0.有人可以帮助我了解我要去哪里了吗.
I am trying to optimize SSE (sum of squared error) of a function using scipy.optimize
. To test with, I created a simple problem as below code.
But the optimized parameters output by scipy never makes SSE=0. Can someone help me to understand, where am I going wrong.
我试图将我的代码计算出的SSE与excel中计算出的SSE进行交叉核对.它匹配.然后,我使用了最小化函数来最小化该SSE函数,由Scipy计算的函数与手动计算的函数不匹配.我以前使用的函数的形式为(y = ax + b).下面是代码
I tried to cross check with the SSE calculated by my code with the one computed in excel. It matched. Then I used minimize function to minimize that SSE function, the ones computed by Scipy is not matching with the hand calculated ones. The function I used to is of form (y=ax+b). Below is the code
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
.
You were printing your x0
aka coe
in here, I edited your code and shortened your objective function sig2()
into one line then edited your callback to display the variable tested and its equivalent objective function value. Now you can clearly see that sse=0
is reached.
import numpy as np
from scipy.optimize import minimize
# for prettier numpy prints
np.set_printoptions(precision = 6)
# init
e = np.array([0,2])
sig1 = np.array([0,200])
k = [10, 10]
coe = np.array([k[0], k[1]])
# define objective function
def sig2(e):
return sum([np.power((y[0] - y[1]), 2) for y in zip(sig1, (k[0]*e)+ k[1])])
# define callback
def f(e):
print("e: %25s | sig2(e): %5s" % (e,round(sig2(e), 6)))
# optimize
result = minimize(sig2,
coe,
method = 'Nelder-Mead',
callback = f,
options = {'xtol': 1e-6,'ftol':1e-06,
'maxiter':50000,'disp': True,'adaptive' : True})
print(result)
输出:
...
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.Simple最小化SSE的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!