牛客题解 | 实现 k-Means 聚类算法

题目

题目链接

k-Means 聚类算法(k-Means Clustering)是一种常用的聚类算法,用于将数据集分为\(k\)个簇。具体步骤如下:

  1. 随机选择\(k\)个点作为初始聚类中心。
  2. 将每个点分配到最近的聚类中心
    本题使用欧几里得距离作为距离度量,即

    \[d(x, y) = \sqrt{(x_1 - y_1)^2 + (x_2 - y_2)^2 + \cdots + (x_n - y_n)^2} \]

  3. 更新聚类中心为每个簇的平均值。
  4. 重复步骤2和步骤3,直到聚类中心不再变化或达到最大迭代次数。

通俗点说,就是把n个人分到k个组中,每次都要计算每个人到每个组的距离,然后选择距离最小的组,然后更新组中心。这样最后每个人都会分到离他最近的组中。

标准代码如下

def euclidean_distance(a, b):
    return np.sqrt(((a - b) ** 2).sum(axis=1))

def k_means_clustering(points, k, initial_centroids, max_iterations):
    points = np.array(points)
    centroids = np.array(initial_centroids)
    
    for iteration in range(max_iterations):
        # Assign points to the nearest centroid
        distances = np.array([euclidean_distance(points, centroid) for centroid in centroids])
        assignments = np.argmin(distances, axis=0)

        new_centroids = np.array([points[assignments == i].mean(axis=0) if len(points[assignments == i]) > 0 else centroids[i] for i in range(k)])
        
        # Check for convergence
        if np.all(centroids == new_centroids):
            break
        centroids = new_centroids
        centroids = np.round(centroids,4)
    return [tuple(centroid) for centroid in centroids]
posted @ 2025-03-12 12:50  wangxiaoxiao  阅读(35)  评论(0)    收藏  举报