PAC拟合圆心

思路步骤

1. 计算所有点的平均值作为初始估计

  • 这一步是为了得到一个初始的“圆心”估计。在统计学中,平均值通常用于描述数据集的中心位置。
  • 当我们在三维空间中处理点时,计算每个坐标轴上的平均值可以为我们提供圆心的一个初步估计。

2. 计算协方差矩阵

  • 协方差矩阵用于描述数据集中各个维度(在这里是x、y、z)之间的变化关系和程度。具体来说,它描述了每个维度与其他维度的线性相关性。
  • 在三维空间中,如果三个坐标轴上的变化是相互独立的,那么协方差矩阵是对角的;如果它们之间存在某种关系,那么非对角线元素将不为0。

协方差矩阵的公式为:
Σ=N1​∑i=1N​(xi​−μ)(xi−μ)T

其中,Σ 是协方差矩阵,xi​ 是数据点,μ 是数据的均值

3. 计算协方差矩阵的特征值和特征向量

  • 特征值和特征向量是线性代数中的概念,它们对于理解数据的主成分和方差非常重要。在协方差矩阵中,特征值和特征向量揭示了数据的主要变化方向和幅度。

    • 特征值: 特征值表示在相应的特征向量方向上数据的方差。较大的特征值意味着数据在该方向上的变化幅度更大,因此这个方向包含了更多的信息。通过排序特征值,我们可以知道数据的主成分的重要性排序。
    • 特征向量: 特征向量是与特征值相关联的向量,它表示数据变化的方向。特征向量对应于数据的主要变化方向,即数据的主成分。在三维空间中,每个特征向量都代表一个方向上的变化。
  • 对于协方差矩阵的特征值和特征向量的计算,我们通常使用线性代数库(如NumPy)中的函数来完成。一旦我们得到了这些特征值和特征向量,我们可以利用它们进行数据降维、噪声去除、主成分分析等多种任务。

4. 排序特征值并获取最小特征值

  • 当我们对数据的主要变化方向进行排序时,最小的特征值通常代表数据中的噪声或离群点,因为它表示在这个方向上的变化是最小的。这个方向上的变化通常不是由于主要的数据分布引起的,而是由于噪声或离群点引起的。
    (当数据在某个方向上的变化很小时,我们倾向于认为这个方向上的变化主要是由噪声引起的,而不是由数据本身的固有结构或模式引起的。)

5. 圆心计算

  • 这一步的目的是通过减去噪声或离群点方向上的分量来得到更精确的圆心估计。我们这么做是因为我们认为这些数据点应该围绕一个中心分布,而最小的特征值对应的方向通常不包含这个中心的有用信息。

  • 总之,这个方法试图找到一个点,使得所有数据点相对于这个点的平方距离和最小。这是一个优化问题,而我们使用特征值和特征向量方法得到的是一个近似解。

示例代码

#待拟合的点集
    points = np.array(
        [[1, 2, 3],
        [4, 8, 9],
        [2, 5, 6],
        [1, 6, 4],
        [7, 8, 2],
        [3, 6, 5],
        [6, 9, 7],
        [4, 7, 8],
        [7, 8, 9]]
    )

#求均值
    mean_points = np.mean(points,axis=0)
#求协方差(默认情况下np.cov函数是按照列来计算协方差,而这里的数据是按行存放的。)
    cov_matrix = np.cov(points,rowvar=False)
#求特征值、特征向量
    eigenvalue, eigenvector = np.linalg.eig(cov_matrix)
#求最小特征值的索引    
    minidx = np.argsort(eigenvalue)[:1]
# 求圆心
    approximate_center = mean_points - eigenvector[:, minidx].dot(eigenvector[:, minidx].T.dot(mean_points))
    print(approximate_center)
#求半径
    radius = np.linalg.norm(points - approximate_center, axis=1).mean()
    print(radius)

部分代码解析

approximate_center = mean_points - eigenvector[:, minidx].dot(eigenvector[:, minidx].T.dot(mean_points))

代码分解

eigenvector[:, minidx]:
这一步选择了与最小特征值(minidx)对应的特征向量。这个特征向量代表了数据变化最小(或噪声最大)的方向。
eigenvector[:, minidx].T.dot(mean_points):
这里首先计算了特征向量(eigenvector[:, minidx])与均值点(mean_points)的点积。这个操作实际上是将均值点投影到了特征向量所代表的方向(法向)上。
eigenvector[:, minidx].dot(...):
然后,再与特征向量(eigenvector[:, minidx])做点积。这一步实际上是将上一步得到的投影值从特征向量的方向再转换回原始的空间坐标。
mean_points - ...:
最后,从原始的均值点(mean_points)中减去上面得到的值。这一步的目的是移除均值点在最小特征值对应方向上的分量,因为这个方向通常代表了噪声或是数据中不太重要的变化方向。

你可能感兴趣的:(算法,圆心拟合)