带有 JAMA 的 Java SVD 或其他

标签 java svd jama

我有一堆点,我需要最合适的线。我正在使用 JAMA,但我不知道为什么,有些东西不起作用。可能是我不明白它是如何工作的。我有一个 Nx3 矩阵(这是 JAMA svd 支持的)并且我从 Svd 获得了正确的矩阵 V。我需要的 vector 是对应于最大奇异值的右奇异 vector (行或列?)。这个 vector 应该代表主要方向。

每个 vector 都应该将 y 作为最大的正值,x 可以是正数也可以是负数,z 应该是负数。但有时我得到的 vector 有一个负的 y 值,或者它指向错误的方向。

我的点云非常规则,几乎都沿着 y 轴(z 小且负)放置。所以主要方向应该很容易找到。但它仍然无法正常工作。

在这种情况下,我得到了右矩阵 V 的行 vector (我也尝试了列 vector )。我已经从“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;
}

我想也许我没有考虑什么。我想也许我应该使用另一种技术或另一个库。

最佳答案

来自 SVD 上的维基百科:

Non-degenerate singular values always have unique left and right singular vectors, up to multiplication by a unit phase factor (for the real case up to sign).

简单地说,您不能依赖输出奇异 vector 的符号。

您可能还需要在 SVD 之前将数据居中。

为什么不执行回归?

关于带有 JAMA 的 Java SVD 或其他,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9007079/

相关文章:

matlab - 鸡尾酒会算法 SVD 实现......在一行代码中?

matlab - 使用 SVD 而不是协方差矩阵来计算特征脸

java - 在java中使用Jama进行LSA的问题

java - 用Java将两个矩阵相乘

R Mclust - 出现 svd 错误 'infinite or missing value'

java - Java中的特征值和对应的特征向量

java - 变量的默认下拉值

Java - 使用 Accessor 和 Mutator 方法

java - Constructor Jeans 不能应用给定的类型

java - FlowLayout 中组件和容器边框之间的自由空间