私は明らかに確率楕円でなければならないものにデータをリバースエンジニアリングしようとしています。入力として、わかりやすいメンバー、特にmeanX、meanY、Co00、Co01およびCo10を含む構造体を取得します。私はxとyが楕円の中心であり、CoXXは共分散行列であると思います。楕円の2つの半径を見つけるために固有値と固有ベクトルを使用する必要があります。私はEigenのC++ライブラリを見つけましたが、ベクターと値を取得したときにEigen計算結果と何をすればいいのか分かりにくいです。 2つの半径と楕円の傾きを見つけるにはどうすればよいですか?共分散行列から確率楕円を求める
0
A
答えて
2
う:
m = (meanX)
(meanY)
は(ベクトル)であることを意味すると:
S = (Co00 Co01)
(Co01 Co11)
は、データの共分散行列です。楕円の中心はm
であり、楕円の軸はS
の固有ベクトルe1
とe2
です(副軸e1
はS
の最小固有値に関連付けられています)。半径は、sqrt(λ1)
およびsqrt(λ2)
に比例し、λ1
およびλ2
は、e1
およびe2
に関連付けられた固有値です。最後に、楕円の傾きは、atan2(e2_y, e2_x)
(長軸とx
軸との間の角度)である。
これはすべて、行列Sを対角化し、式と一致する式(X - m)^T S^-1 (X - m) = 1
を展開したものです。特定の信頼水準を見ている場合は半径をスケーリングする必要があり、95%の信頼度の場合はスケーリング係数はsqrt(5.911)
です。固有で
、次のコードは動作するはずです:
#include <Eigen/Eigenvalues>
// [...]
Vector2d m;
Matrix2d S;
m << meanX, meanY;
S << Co00, Co01, Co01, Co11;
SelfAdjointEigenSolver<Matrix2d> solver(S);
double l1 = solver.eigenvalues().x();
double l2 = solver.eigenvalues().y();
Vector2d e1 = solver.eigenvectors().col(0);
Vector2d e2 = solver.eigenvectors().col(1);
double scale95 = sqrt(5.991);
double R1 = scale95 * sqrt(l1);
double R2 = scale95 * sqrt(l2);
double tilt = atan2(e2.y(), e2.x());
関連する問題
- 1. 隠れマルコフモデル放射確率共分散は恒等行列ですか?
- 2. Proc GLMの分散共分散行列
- 3. ナンシー共分散行列numpy.cov
- 4. 配列から楕円をプロットする
- 5. 行列内の各列の確率を求める
- 6. 散布図からのデータの部分集合の分散を求める
- 7. 離散単位の3D楕円
- 8. ベクトル内の各値の共分散を示す共分散行列
- 9. 散乱点からの楕円の評価/フィッティング
- 10. サンプル共分散行列の生成R
- 11. 計算共分散行列式
- 12. Mathematicaのディスクピクセルの共分散行列
- 13. 楕円の内側または外側にある楕円との距離を求める
- 14. 楕円回転行列? Cでは
- 15. 1Dの場合の分散に対する等価共分散行列はどれくらいですか?
- 16. 共分散行列を持つ正規分布ランダムベクトルの生成
- 17. スパニング行全体の楕円
- 18. 共分散行列を持たないlmerモデルをプロットする
- 19. Java共分散
- 20. .NET共分散
- 21. 共分散
- 22. var出力からの抽出係数と分散共分散行列(varsパッケージで推定)
- 23. ランダム確率分布確率分布から一定数
- 24. Javaの共分散行列を計算する
- 25. forループのない共分散行列を計算する
- 26. Pythonでランダム共分散行列を生成する方法は?
- 27. より速い共分散行列を生成する方法
- 28. マルチレベルモデリングのための共分散構造
- 29. 複数変数の時系列共分散行列 - R
- 30. 散布図の上に信頼楕円を描く
あなたは男です! OpenCVと同じような出力が得られます。ありがとうございました! – kreuzerkrieg