2

一連の3次元データの2次元正規分布関数を計算するためのスクリプト(できればPython)を探しています。存在しない場合は、誰かが提供できるコードまたは擬似コードをいただければ幸いです。

入力はそのようなトリプルのリストになります

[[x1, y1, z1], [x2, y2, z2], [x3, y3, z3],..., [xn, yn, zn]]

私が必要としているのは、データを操作し、後で再作成できるように、データを最も厳密に表す2次元正規分布の平均と標準偏差/分散です。

簡単にするために、1次元の正規関数の使用を延期します。次の2次元データポイントがある場合

[
    [-4, 0.0001],
    [-3, 0.0044],
    [-2, 0.054 ],
    [-1, 0.242 ],
    [0 , 0.3989],
    [1 , 0.242 ],
    [2 , 0.054 ],
    [3 , 0.0044],
    [4 , 0.0001]
]

スクリプトが出力することを期待しています

mean = 0.0
standard deviation = 1.0
variance = 1.0

そうすれば、たとえば、標準偏差をからに変更したい場合はsd = 1.0sd = 2.0曲線を変更して再作成し、ポイントをサンプリングして、-4...4そのようにデータに値を書き換えることができます。

[
    [-4, 0.027 ],
    [-3, 0.0648],
    [-2, 0.121 ],
    [-1, 0.176 ],
    [0 , 0.1995],
    [1 , 0.176 ],
    [2 , 0.121 ],
    [3 , 0.0648],
    [4 , 0.027 ]
]

ここで私の質問は、2次元の正規分布を厳密に表す3次元の点のリストを使用してこれを行うにはどうすればよいですか?


Pythonでこれを行うか、シェルスクリプトを呼び出すことをお勧めします。ただし、MatLabやMapleのようなプログラムを使用することに反対することはありません。

4

1 に答える 1

2

1Dの例によれば、値のシーケンスが与えられます(xi, yi)。ここで、値は次元(または)xiのベクトルであり、値はスカラーです。値が値に近くなるように、次元のガウス関数の平均と共分散行列を見つけたいと思います。nn = 1n = 2yimusigmafnf(xi)yi

この問題を解決するには、closeの意味を定義する必要があります。たとえば、二乗和を最小化するように選択できます(yi - f(xi))^2。結果として生じる非線形最適化問題はmuLevenberg–Marquardtsigmaなどの反復法で解くことができます。


MatLabを使用する場合は、おそらくカーブフィッティングガイド、特に非線形カーブフィッティングのセクションとlsqnonlinおよびlsqcurvefit例を参照してください。Pythonを使用している場合は、C / C++またはFortranでのLevenberg–Marquardt実装へのライブラリバインディングを見つけることができます。

どのアプローチを使用する場合でも、最初に1Dの例でソルバーを試すことをお勧めします。

もう1つの関連リソースは、SciPyのデータフィッティングクックブックです。これには、2Dガウスのフィッティングに関するセクションが含まれています。

于 2012-01-05T06:37:38.327 に答える