题解 | 实现 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()