题目
题目链接
k-Means 聚类算法(k-Means Clustering)是一种常用的聚类算法,用于将数据集分为\(k\)个簇。具体步骤如下:
- 随机选择\(k\)个点作为初始聚类中心。
- 将每个点分配到最近的聚类中心
本题使用欧几里得距离作为距离度量,即\[d(x, y) = \sqrt{(x_1 - y_1)^2 + (x_2 - y_2)^2 + \cdots + (x_n - y_n)^2} \] - 更新聚类中心为每个簇的平均值。
- 重复步骤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 centroiddistances = 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 convergenceif np.all(centroids == new_centroids):breakcentroids = new_centroidscentroids = np.round(centroids,4)return [tuple(centroid) for centroid in centroids]