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

PCA in 2D calculate center point in original data

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

因此,我的想法是使用 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]

使用我的特征向量,我能够计算出代表盒子的直线的斜率。

我现在需要在原始 space 中获取 PCA 的中心,而不是在以 0 为中心的 space 中。 我还需要找出向量的长度。

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

有趣的question.Just一些想法。

你指的中心是指数据的均值吗? 这样想,如果我们能把(0,0)投影回原来的space,就是均值

要求长度,假设你想把每个点都包括在盒子里,你可以在每个主成分方向上投影每个点,并记录最大和最小坐标。区别在于长度。

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

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

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

为了定位矩形,我通过

计算了 4 个点

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

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

所有积分。

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

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