带有JAMA的Java SVD或者其他

时间:2012-01-25 17:20:47

标签: java svd jama

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

每个向量应该具有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;
}

我想也许我不在考虑什么。 Idk也许我应该使用另一种技术或其他库。

2 个答案:

答案 0 :(得分:1)

来自维基百科的SVD:

  

非退化奇异值始终具有唯一的左右奇异向量,最多乘以单位相位因子(对于实际情况高达符号)。

简单地说,你不能依赖输出奇异向量的符号。

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

为什么不进行回归?

答案 1 :(得分:0)

如果你的等式采用这种形式:

z = a0 + a1*x + a2*y

你的矩阵方程看起来像N点:

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

左侧是Nx1向量;右边是一个Nx3矩阵,乘以一个3x1的未知向量。

将两边乘以A(转置),最后得到一个3x3矩阵,乘以未知系数的3x1向量,该向量等于3x1向量。使用标准矩阵解决方案来解决未知系数。它很容易做到,即使是封闭的形式。

这是简化的线性最小二乘解。这是一个scribd document,可以更详细地说明这一点。