2012-01-25 11 views
2

私はポイントの雲があり、私は最もフィットするラインが必要です。私はJAMAを使用していますが、なぜ、何かが動作していないことがわかりません。おそらくそれはそれがどのように動作するのかわからない私のものです。私はNx3 Matrix(これはJAMA svdがサポートしているものです)を持っていて、Svdから適切なMatrix Vを取得します。私が必要とするベクトルは、最大の特異値に対応する右特異ベクトル(行または列)である。このベクトルは、主な方向を表すと考えられています。Java SVD with JAMA

すべてのベクトルは、yが最大の正の値であると仮定され、xは正または負の両方であり、zは負であると仮定されます。しかし、ときどき私が得るベクトルには負のyの値がありますが、とにかくそれが間違った方向を指しています。

ポイントのクラウドはかなり規則的で、すべてがy軸に沿って(zが小さくて負で)配置されています。だから、主な方向は本当に見つけやすいはずです。しかし、それはまだ適切に動作していません。

この場合、適切な行列Vの行ベクトル(私はcoloumnベクトルも試しました)を得ています。私はすでに "pointSet"から重心を差し引いています。

public static Matrix bestDirection(Matrix pointSet){ 

    Matrix bestFittingLine = new Matrix(3,1); 
    SingularValueDecomposition svd = pointSet.svd(); 

    bestFittingLine.set(0, 0, svd.getV().get(0, 0)); 
    bestFittingLine.set(1, 0, svd.getV().get(0, 1)); 
    bestFittingLine.set(2, 0, svd.getV().get(0, 2)); 

    return bestFittingLine; 
} 

多分私は何かを考えていないと思います。私は別のテクニックや別のライブラリを使うべきでしょう。

+0

なぜ簡単な線形回帰をしていませんか?最小の正方形はトリックをうまくやる必要があります。 – duffymo

+0

@duffymo私はそれを行う方法と、それが3Dでどのように動作するかわからないので、zはxとyから独立しています。私はそれについていくつかの助けが大好きです。 – G4bri3l

+0

Iv'eはそれを説明するscribd文書を持っていましたが、私は今あなたにアクセスできません。 Googleの "線形回帰多変数";次のようなものが得られます:http://www.stat.yale.edu/Courses/1997-98/101/linmult.htm。 SVDは素晴らしいですが、それは私の最初の選択ではありません。 – duffymo

答えて

1

:(に署名するまで、実際のケース用)ユニットの位相係数の乗算にまで

非縮退特異値は常に、独特の左と右の特異ベクトルを持っています。

簡単に言えば、出力特異ベクトルの符号に頼ることはできません。

SVDの前にデータを中央に配置する必要がある場合もあります。

なぜ回帰はしませんか?

+0

それは問題をはっきりさせました。とにかく感謝しています。これは私の問題に対する答えでした。私はプロジェクトで他のものにもSVDが必要なので回帰を使用していないので、新しい行を書くのではなく、すでに持っているものを使うだけです。すべてが正しく機能しています。 – G4bri3l

0

あなたの方程式は、このフォームを取る場合:

z = a0 + a1*x + a2*y 

あなたの行列式は、Nポイントを次のようになります。

z(i) = a0 + a1*x(i) + a2*y(i) i = 1, N 

左手側はNx1のベクトルです。右辺は3x1の未知のベクトルを乗ずるNx3行列です。

両側にA(転置)を掛け合わせると、未知の係数の3x1ベクトルに3x1ベクトルを乗算した3x3行列が得られます。未知の係数を解くには、標準の行列解法を使用します。閉鎖された形であっても、簡単に行うことができます。

これは、線形最小二乗解を単純化したものです。詳しくは、scribd documentをご覧ください。

ウィキペディアからSVDに
+0

ありがとうございました。あなたは助けになった、私は他の答えに私がまだSVDを使用している理由をコメントした。 – G4bri3l