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]));
我正在尝试围绕给定数据集创建边界框。
因此,我的想法是使用 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]));