题解|实现 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)是一种常用的聚类算法,用于将数据集分为
个簇。具体步骤如下:
- 随机选择
个点作为初始聚类中心。
- 将每个点分配到最近的聚类中心
本题使用欧几里得距离作为距离度量,即
- 更新聚类中心为每个簇的平均值。
- 重复步骤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]