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

实现 k-Means 聚类算法

https://www.nowcoder.com/practice/dc90d7c8b7bd44ac8b5029f830cd2e65

import numpy as np

def k_means_clustering(points, k, initial_centroids, max_iterations):
    #不加浮点数会在计算的时候被夹断成整数!!!!
    points=np.array(points,dtype=float)
    initial_centroids=np.array(initial_centroids,dtype=float)
    centroids=initial_centroids
    n_sample=points.shape[0]
    distance_list=np.zeros((n_sample,k))
    labels=np.zeros((n_sample))
    for i in range(max_iterations):
        #对固定的点j
        for j in range(n_sample):
            #对固定的聚类m
            for m in range(k):
                #计算点j到聚类m的距离
                distance_list[j][m]=distance(points[j],centroids[m])
            #找出j到所有聚类距离最小的聚类标签    
            labels[j]=np.argmin(distance_list[j,:])
        
        for m in range(k):
            #更新聚类
            centroids[m]=np.mean(points[labels==m], axis=0)
            centroids.tolist()
            #题目要求用()输出!!
    return [tuple(round(x, 4) for x in c) for c in centroids]


def distance(x1,x2):
    return sum((x1-x2)**2)

def main():
    # Read input for points
    points = eval(input())

    # Read input for number of clusters
    k = int(input())

    # Read input for initial centroids
    initial_centroids = eval(input())

    # Read input for maximum iterations
    max_iterations = int(input())

    # Perform k-Means clustering
    final_centroids = k_means_clustering(points, k, initial_centroids, max_iterations)

    # Print the final centroids
    print(final_centroids)

if __name__ == "__main__":
    main()

全部评论

相关推荐

02-28 13:25
已编辑
门头沟学院 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务