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

实现 k-Means 聚类算法

https://www.nowcoder.com/practice/dc90d7c8b7bd44ac8b5029f830cd2e65?tpId=377&tags=&title=&difficulty=0&judgeStatus=0&rp=0&sourceUrl=%2Fexam%2Foj

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

  1. 随机选择个点作为初始聚类中心。
  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]
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务