2017-07-25 65 views
0

我使用下面的代碼,以適應三維點雲3D線的雲3D線添加砝碼。 我使用lmfit的最小二乘法,以儘量減少。使用lmfit時以適應點

我需要增加權重的不同點,但不知道如何做到這一點使用數組(和不是標)距離輸出時。使用標量時的問題是它不如使用數組時好。我假設因爲有大量的變量。

所以問題是 - 有沒有辦法給添加權重爲每個元素的數組最小化? 使用像Nelder w/scaral輸入的東西不能很好地執行3D配合。

from lmfit import minimize, Parameters, Parameter,report_fit,fit_report, Minimizer, printfuncs 
import numpy as np 

#parameters 
params = Parameters() 
params.add('y1', value= 0) 
params.add('x0', value= 129) 
params.add('x1', value= 0) 
params.add('y0', value= 129) 
params.add('y1', value= 0) 

#function calculating point-line distance 
def fun(params,x,y,z): 
    x0 = params['x0'].value; x1 = params['x1'].value; y0 = params['y0'].value; y1 = params['y1'].value 

    distance = [] 
    #parametric equations 
    v0 = np.array([x0, y0, 0]) 
    v1 = np.array([x0+x1,y0+ y1, 1]) 

    #for loop over all the 3D points to calculate distance 
    for point in range(len(x)): 
     p = np.array([x[point], y[point], z[point]]) 
     distance.append(np.linalg.norm(np.cross(v0-p,v0-v1)))  
    return distance 

result = minimize(fun, params,args=(x,y,z)) 
print(fit_report(result)) 

theta = np.arccos(1/ np.sqrt(result.params['x1']*result.params['x1']+result.params['y1']*result.params['y1']+1)) 

回答

0

我想你閱讀(如在你的其他問題之一提供this link)如何編寫一個目標函數的文檔?如果是這樣,說明的哪一部分不清楚和/或您嘗試了什麼並且沒有工作?

在您的示例中,您將生成一個名爲distance的數組,其實際上與文檔中的(model-data)相同。這裏要添加的是eps,它將根據數據中的不確定性來縮放殘差。

+0

我想補充我的權重列表,並且不使用數據的統計不確定性。 這是很容易的標量做。然而,我的問題是,使用標量和數組不會產生相同的結果 - 儘管它應該。 – Iroxk

+0

你應該能夠只需添加砝碼的列表,在這種情況下EPS應該僅僅是1 /重量。如果/爲什麼使用標量或數組不會產生相同的結果,你不給與輸出這兩種情況下最小的工作例如,它不會從你的問題不清楚。 – Renee

+0

所以基本上如果我有一個一維重量陣列,我也可以簡單地從fun函數距離X權重數組輸出?無需使用eps? – Iroxk