我正在尝试围绕给定的数据集创建一个边界框。
因此,我的想法是使用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 :(得分:1)
有趣的问题。只是一些想法。
您所指的中心是指数据的平均值吗? 这样想,如果我们可以向后投影(0,0)到原始空间,那就是平均值。
要查找长度,假设您尝试包含框中的每个点,您可以投影每个主要组件方向的每个点并记录最大和最小坐标。差异将是长度。
顺便说一句,我认为相关矩阵上的PCA通常是更合适的选择,我认为这也适用于你的问题。
答案 1 :(得分:0)
我找到了解决方案。 我们的想法是使用两个特征向量来计算所有点的最大距离。
最大距离将是矩形宽度和高度的一半。如下图所示
要定位矩形,我按
计算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]));