Java SVD与JAMA或其他

Java SVD与JAMA或其他,java,svd,jama,Java,Svd,Jama,我有一个点云,我需要最好的拟合线。我正在使用JAMA,但我不知道为什么,有些东西不起作用。可能是我不明白它是怎么工作的。我有一个Nx3矩阵(这是JAMA svd支持的),我从svd得到了正确的矩阵V。我需要的向量是对应于最大奇异值的右奇异向量(行或列?)。这个向量应该代表主方向 每个向量都假设y是最大的正值,x可以是正值也可以是负值,z是负值。但是有时候我得到的向量有负的y值,或者它指向了错误的方向 我的点云非常规则,所有点几乎都沿y轴定位(z小且为负)。所以主要方向应该很容易找到。但它仍然不能

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

每个向量都假设y是最大的正值,x可以是正值也可以是负值,z是负值。但是有时候我得到的向量有负的y值,或者它指向了错误的方向

我的点云非常规则,所有点几乎都沿y轴定位(z小且为负)。所以主要方向应该很容易找到。但它仍然不能正常工作

在本例中,我得到了右矩阵V的行向量(我也尝试了冒号向量)。我已经从“点集”中减去了质心


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

如果您的方程采用以下形式:

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向量。使用标准矩阵解来求解未知系数。这很容易做到,即使是以封闭的形式

这就是简化的线性最小二乘解。这里有一个更详细的说明。

来自SVD上的维基百科:

非退化奇异值始终具有唯一的左、右奇异向量,最多可乘以单位相位因子(对于实际情况,小于等于正负号)

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

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


为什么不进行回归?

为什么不进行简单的线性回归?最小二乘拟合应该能很好地完成这项工作。@duffymo,因为我不知道怎么做,也不知道它在3D中是如何工作的,在3D中,z与x和y是独立的。我想得到一些帮助。我有一份scribd文档可以解释,但我现在不能给你发送访问权限。谷歌“多元线性回归”;你会得到这样的东西:。SVD很棒,但它不是我的第一选择。这就是问题所在。我好不容易才发现,不过还是谢谢你。这就是我问题的答案。我没有使用回归,因为在我的项目中,我也需要SVD来处理其他事情,所以,我不用写新行,而是使用我已经得到的东西。现在一切正常。非常感谢。你帮了我大忙,我在另一个答案上评论了我仍然使用SVD的原因。
z(i) = a0 + a1*x(i) + a2*y(i)  i = 1, N