2017-07-25 1 views
0

次のコードを使用して3Dポイントのクラウドに3Dラインをフィットさせています。 最小二乗法を使用して、lmfitを最小化しています。lmfitを使用してポイントの雲に3Dラインをフィットさせる場合のウェイトの追加

私はが異なる点に重みを追加する必要がありますが、配列(およびないスカラー)の出力を距離を使用するときにどのように行うのか分かりません。スカラーを使用するときの問題は、配列を使用するときほど良くないことです。私はより多くの変数のために仮定します。

質問がありますか?アレイの各要素の重みを最小化装置に追加する方法はありますか? 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

私はあなたが(あなたの他の質問の1つに提示されたthis link)目的関数を作成する方法についてのドキュメントを読むことを想定しますか?もしそうなら、説明のどの部分が明確でないか、そして/または何を試しても働かなかったのですか?

この例では、という配列を生成します。これは実際には(model-data)と同じです。ここに追加したいのはepsで、これはデータの不確実性によって残差を拡大します。

+0

私は重みのリストを追加したいが、データの統計的不確実性は使用しない。 スカラーの場合は簡単です。しかし、ここで私の問題は、スカラーと配列を使用しても同じ結果が得られないということです。 – Iroxk

+0

あなたは重みのリストを追加するだけでよいでしょう。その場合、epsはちょうど1 /重みにすべきです。スカラーや配列を使用しても、両方のシナリオの出力を最小限に抑えた例と同じ結果が得られないのは、あなたの質問からは明らかではありません。 – Renee

+0

基本的に私は体重の1次元配列を持っている場合、私は単純に楽しい関数距離X重み配列から出力することができますか? epsを使用する必要はありませんか? – Iroxk

関連する問題