2D中的PCA计算原始数据中的中心点

时间:2015-12-04 13:46:35

标签: center pca svd eigenvector eigenvalue

我正在尝试围绕给定的数据集创建一个边界框。

因此,我的想法是使用PCA。我读到它并不总能找到最佳解决方案,但这并不重要。

到目前为止我所做的是我计算协方差矩阵并用它来计算这个矩阵的SVD。

假设我们有一个像

这样的示例输入
[40, 20], [-40, -20],[40, -20],[-40, 20],[30, 30]

协方差矩阵将成为

[1780.0, 180.0] [180.0,   580.0]

使用SVD我得到旋转矩阵U:

[0.99, 0.15]

[0.15, -0.99]

和对角矩阵D:

[1806.41, 0]

[0, 553.58]

使用我的特征向量,我能够计算出代表方框的线条的斜率。

我现在需要将PCA的中心放在原始空间而不是以0为中心的空间。 而且我还需要找出那些向量的长度。

有没有人知道如何获得它们?

3 个答案:

答案 0 :(得分:1)

有趣的问题。只是一些想法。

您所指的中心是指数据的平均值吗? 这样想,如果我们可以向后投影(0,0)到原始空间,那就是平均值。

要查找长度,假设您尝试包含框中的每个点,您可以投影每个主要组件方向的每个点并记录最大和最小坐标。差异将是长度。

顺便说一句,我认为相关矩阵上的PCA通常是更合适的选择,我认为这也适用于你的问题。

答案 1 :(得分:0)

我找到了解决方案。 我们的想法是使用两个特征向量来计算所有点的最大距离。

最大距离将是矩形宽度和高度的一半。如下图所示

enter image description here

要定位矩形,我按

计算4个点
  

p1.x = max1 * eigenvector1(0)+ max2 * eigenvector1(1)

     

p1.y = max1 * eigenvector2(0)+ max2 * eigenvector2(1)

所有积分。

我只需要通过meanX和meanY以及包围原始数据集的矩形来转换顶点和所有数据点。

答案 2 :(得分:0)

上述解决方案中的问题是,使用max max并不是最好的主意,因为它在特征向量的一个方向上总是最小的。 通过使用min和max,我现在能够在主要组件的两个方向上创建最小的封闭框。

要计算我使用下面代码的点,其中minDistX是最小距离的绝对值:

p1.setX(minDist2 * U[0][0] + maxDist1 * U[0][1]);
p1.setY(minDist2 * U[1][0] + maxDist1 * U[1][1]);

p2.setX(minDist2 * U[0][0] - minDist1 * U[0][1]);
p2.setY(minDist2 * U[1][0] - minDist1 * U[1][1]);

p3.setX(-(maxDist2 * U[0][0] + minDist1 * U[0][1]));
p3.setY(-(maxDist2 * U[1][0] + minDist1 * U[1][1]));

p4.setX(-(maxDist2 * U[0][0] - maxDist1 * U[0][1]));
p4.setY(-(maxDist2 * U[1][0] - maxDist1 * U[1][1]));