2

ポイントのクラウドがあり、最適なラインが必要です。JAMA を使用していますが、理由がわかりません。何かが機能していません。仕組みがわからないのは多分私です。私は Nx3 マトリックス (これは JAMA svd がサポートするものです) を持っており、Svd から適切なマトリックス V を取得します。必要なベクトルは、最大特異値に対応する右特異ベクトル (行または列 ?) です。このベクトルは、主な方向を表すと想定されています。

すべてのベクトルは最大の正の値として y を持つと想定され、x は正または負の両方であり、z は負であると想定されます。しかし、取得したベクトルの y 値が負の場合や、とにかく間違った方向を指している場合があります。

私のポイントの雲はかなり規則的で、すべてがほぼy軸に沿って配置されています(zは小さく負です)。したがって、主な方向性は非常に簡単に見つけられるはずです。しかし、それはまだ正しく機能していません。

この場合、右の行列 V の行ベクトル (列ベクトルも試しました) を取得しています。すでに「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;
}

たぶん何も考えていないのだと思います。Idk たぶん、別の手法または別のライブラリを使用する必要があります。

4

2 に答える 2

1

SVDのウィキペディアから:

非縮退特異値は、単位位相係数による乗算まで、常に一意の左右の特異ベクトルを持ちます (実際の場合は符号まで)。

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

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

なぜ回帰を実行しないのですか?

于 2012-01-25T20:48:45.890 に答える
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 ドキュメントです。

于 2012-01-25T18:41:39.333 に答える