使用Scipy.Simple最小化SSE

时间:2019-04-28 06:40:34

标签: 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 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)

1 个答案:

答案 0 :(得分:0)

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

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.])