2015-12-04 34 views
3

我试图围绕给定数据集创建边界框。2D中的PCA计算原始数据中的中心点

因此,我的想法是使用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为中心的空间中。 而且我还需要找出向量的长度。

有没有人有一个想法如何让他们?

回答

0

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

最大距离将会是矩形宽度和高度的一半长度。如图所示在画面下方

enter image description here

为了定位矩形我通过

P1计算4分。X = MAX1 * eigenvector1(0)+ MAX2 * eigenvector1(1)

p1.y = MAX1 * eigenvector2(0)+ MAX2 * eigenvector2(1)

所有点。

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

1

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

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

要找到长度,假设您试图在框中包含每个点,可以投影每个主成分方向上的每个点并记录最大和最小坐标。差异将是长度。

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

0

上述解决方案中的问题是仅使用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]));