在python3中,如何计算特定质心(kmeans集群)的协方差矩阵?

2024-06-02 04:32:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在实现一个k-均值聚类算法。到目前为止,它使用欧几里德距离。将欧几里德距离转换为马氏距离无法正确聚类。你知道吗

出于某种原因,马氏距离有时是负数。结果发现协方差矩阵的特征值为负,这显然不利于协方差矩阵。你知道吗

以下是我正在使用的函数:

#takes in data point x, centroid m, covariance matrix sigma
def mahalanobis(x, m, sigma):
    return np.dot(np.dot(np.transpose(x - m), np.linalg.inv(sigma)),  x - m)

#takes in centroid m and data (iris in 2d, dimensions: 2x150)
def covar_matrix(m, data):
    d, n = data.shape
    R = np.zeros((d,d)) 
    for i in range(n): 
        R += np.dot(data[:,i:i+1] , np.transpose(data[:,i:i+1]))
    R /= n
    return R - np.dot(m, np.transpose(m))
    #autocorrelation_matrix - centroid*centroid'

我是如何实现算法的:

  1. 设置k

  2. 随机选择k个质心

  3. 计算每个质心的坐标矩阵(

  4. 计算每个数据点到每个质心的mahalanobis(),并添加到最近的簇中

  5. 开始寻找新的质心;对于每个簇中的每个数据点*计算mahalanobis()与簇中每个其他点的总和;总和最小的点成为新的质心
  6. 重复3-5次,直到旧质心和新质心相同

*用此点计算covar_矩阵()

我期望一个正马氏距离和一个正定协方差矩阵(我希望后者能修正前者)。你知道吗


Tags: in算法距离datanp矩阵聚类sigma