2017-08-18 6 views
0

多項式に制約のある最小二乗メロンを実行したい。その前に、私は制約のない最適化を試みることにしました。ここで問題です:Scipiy.optimize.minimaze制約のないエラー

私の多項式が

のような$ Fを検索します(x)の斧は^ 4 + BX^3 + CX^2 + DX + E $

=だから私は最高の係数を見つけたいですa、b、c、dおよびeを含む。私は、このように最小限にしたい機能は

xyは私の点の座標のリストである
def lsq(args, x, y): 
    return sum([(y[i] - (args[0]*x[i]**4 + args[1]*x[i]**3 + args[2]*x**2 + args[3]*x + args[4]))**2 
       for i in np.arange(len(x))]) 

のように見えます。このように、私のコードは次のようになります。

import numpy as np 
import scipy.optimize 
pH = np.array([8,8,8,7,7,7,7,7,7,7,7,7,6,3,2,2,2,1]) 
def rank2(y): 
    return np.array([(i+1)/len(y) for i in range(len(y))]) 
x = rank2(pH) 
y = pH 
def lsq(args, x, y): 
    return sum([(y[i] - (args[0]*x[i]**4 + args[1]*x[i]**3 + args[2]*x**2 + args[3]*x + args[4]))**2 
       for i in np.arange(len(x))]) 


params = scipy.optimize.minimize(nejmensi_ctverce, [1.0, 1.0, 1.0, 1.0, 1.0], args = (x, y)) 

しかし、ここで私はエラーを得た:

File "C:\Users\Robert\Desktop\WinPython-64bit-3.6.1.0Qt5\python- 
3.6.1.amd64\lib\site-packages\scipy\optimize\optimize.py", line 628, in _approx_fprime_helper 
grad[k] = (f(*((xk + d,) + args)) - f0)/d[k] 

ValueError: setting an array element with a sequence 

あなたは私を助けることができますか?私はminimize関数の引数を解析する方法を完全には理解していないと思います。 lsq

答えて

1

一部x sがiによってインデックス付けされませんでした:これはにつながる

In [9]: lsq([1.0, 1.0, 1.0, 1.0, 1.0], x, y) 
Out[9]: 
array([ 468.00714962, 458.38490951, 448.01979096, 436.95911906, 
     425.25433416, 412.9609918 , 400.13876277, 386.85143307, 
     373.16690395, 359.15719185, 344.89842847, 330.47086072, 
     315.95885075, 301.45087591, 287.0395288 , 272.82151724, 
     258.89766428, 245.37290818]) 

args[0]*x[i]**4 + args[1]*x[i]**3 + args[2]*x**2 + args[3]*x + args[4] 
             ---^   ---^ 

これは代わりに、スカラーの値の配列を返すにlsqを導きましたValueErrorscipy.optimize.minimzelsqが最小化するスカラー値を返すことを期待しているためです。 問題を解決する方法の1つは、xのベアをx[i]に置き換えることです。

問題を解決するためのより良い方法は、x sのすべてx[i] Sを交換for i in np.arange(len(x))を削除し、NumPy array-based arithmeticを使用することです:

def lsq(args, x, y): 
    return ((y - (args[0]*x**4 + args[1]*x**3 + args[2]*x**2 
        + args[3]*x + args[4]))**2).sum() 

例えば、

import numpy as np 
import scipy.optimize as optimize 

pH = np.array([8,8,8,7,7,7,7,7,7,7,7,7,6,3,2,2,2,1]) 
def rank2(y): 
    return np.array([(i+1)/len(y) for i in range(len(y))]) 
x = rank2(pH) 
y = pH 

def lsq(args, x, y): 
    a, b, c, d, e = args 
    return ((y - (a*x**4 + b*x**3 + c*x**2 + d*x + e))**2).sum() 

params = optimize.minimize(lsq, [1.0, 1.0, 1.0, 1.0, 1.0], args = (x, y)) 
print(params.x) 

利回り

[ 94.48618936 -211.42358992 144.93063545 -37.24078798 10.23934514] 

分imum lsqの値:

print(lsq(params.x, x, y)) 
# 6.91284752049 
+0

大きな回答、ありがとうございます。 – Bobesh

0
params = scipy.optimize.minimize(nejmensi_ctverce, np.array([1.0, 1.0, 1.0, 1.0, 1.0]), args = (x, y))