2

的數組這是我的代碼scipy.optimize.leastsq誤差不花車

import os 
import sys 
import numpy as np 
import scipy 
from scipy.optimize import leastsq 


def peval (inp_mat,p): 
    m0,m1,m2,m3,m4,m5,m6,m7 = p 
    out_mat = np.array(np.zeros(inp_mat.shape,dtype=np.float32)) 
    mid = inp_mat.shape[0]/2 
    for xy in range(0,inp_mat.shape[0]): 
     if (xy<(inp_mat.shape[0]/2)): 
      out_mat[xy] = (( (inp_mat[xy+mid]*m0)+(inp_mat[xy]*m1)+ m2) /((inp_mat[xy+mid]*m6)+(inp_mat[xy]*m7)+1)) 
     else: 
      out_mat[xy] = (( (inp_mat[xy]*m3)+(inp_mat[xy-mid]*m4)+ m5) /((inp_mat[xy]*m6)+(inp_mat[xy-mid]*m7)+1)) 
    return np.array(out_mat) 

def residuals(p, out_mat, inp_mat): 
    m0,m1,m2,m3,m4,m5,m6,m7 = p 
    err=np.array(np.zeros(inp_mat.shape,dtype=np.float32)) 
    if (out_mat.shape == inp_mat.shape): 
     for xy in range(0,inp_mat.shape[0]): 
      err[xy] = err[xy]+ (out_mat[xy] -inp_mat[xy]) 
     return np.array(err) 




f = open('/media/anilil/Data/Datasets/repo/txt_op/vid.txt','r') 
x = np.loadtxt(f,dtype=np.int16,comments='#',delimiter='\t') 
nof = x.shape[0]/72 # Find the number of frames 
x1 = x.reshape(-1,60,40) 
x1_1= x1[0,:,:].flatten() 
x1_2= x1[1,:,:].flatten() 

x= [] 
y= [] 

for xy in range(1,50,1): 
    y.append(x1[xy,:,:].flatten()) 
    x.append(x1[xy-1,:,:].flatten()) 

x=np.array(x,dtype=np.float32) 
y=np.array(y,dtype=np.float32) 
length = x1_1.shape#initail guess 
p0 = np.array([1,1,1,1,1,1,1,1],dtype=np.float32) 

abc=leastsq(residuals, p0,args=(y,x)) 
print ('Size of first matrix is '+str(x1_1.shape)) 
print ('Size of first matrix is '+str(x1_2.shape)) 

print ("Done with program") 

我已經嘗試添加在沒有使用最多的地方np.array。 有人可以幫我嗎?

這裏的另一個問題是我是否通過添加所有errorsnp.sum(err,axis=1)來將殘差()的輸出作爲單個值輸出。或者保持原樣?

當我return np.sum(err,axis=1)在功能residuals()。初步猜測沒有變化。它仍然是一樣的。

I.E錯誤是針對輸入輸出映射中的每個項目。或總體錯誤?

Example data.

輸出

ValueError: object too deep for desired array 
Traceback (most recent call last): 
    File "/media/anilil/Data/charm/mv_clean/.idea/nose_reduction_mpeg.py", line 49, in <module> 
    abc=leastsq(residuals, p0,args=(y,x)) 
    File "/usr/lib/python2.7/dist-packages/scipy/optimize/minpack.py", line 378, in leastsq 
    gtol, maxfev, epsfcn, factor, diag) 
minpack.error: Result from function call is not a proper array of floats. 
+0

你能分享你正在使用的數據或至少它的一個子集? – Cleb

+0

添加了你想要的數據 –

+1

稍微晚一點,Simon的速度更快了:你的確只需要用例如'nr.array(err)'來代替。 'np.ravel(err)'或'err.flatten()'並且它貫穿始終。檢查問題[這裏](http://stackoverflow.com/questions/23769508/scipy-optimize-curve-fit-not-a-proper-array-of-floats-error)和[這裏](http:/ /stackoverflow.com/questions/18579476/scipy-optimize-curve-fit-error-result-from-function-not-a-proper-array-of-float) – Cleb

回答

1

leastsq需要一維數組從您的residuals函數返回。

當前您計算整個圖像的殘差並將其作爲二維數組返回。

簡單的修復方法是平坦殘差數組(將2D數組轉換爲一維數組)。的

因此而不是返回

return np.array(err) 

做到這一點,而不是

return err.flatten() 

注意err已經是一個numpy的陣列因此不需要返回之前投(我猜在下滑當你試圖調試它!)

+0

試過它..它不會拋出任何錯誤,但p0永遠不會改變..讓我覺得我做錯了什麼。 –

+0

'leastsq'不會修改p0。相反,它會返回最佳參數。 (以及其他一些東西)詳情請參閱http://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.leastsq.html。你會想要它返回的東西列表中的x。 –