基于给定初始簇的K-Means聚类问询:2D数据集迭代3次实现
K-Means聚类任务:指定初始中心的3次迭代实现
任务背景
现有如下2D数据点:(1,1)、(1,2)、(2,1)、(2,2)、(3,3)、(8,8)、(9,8)、(8,9)、(9,9)。现指定两个初始簇中心(1,1)和(2,1),需采用基于欧氏距离的K-Means算法,以完成3次迭代为终止条件进行聚类。
实现思路与代码修正
你提到用Pandas DataFrame结合sklearn的K-Means来实现,这个思路没问题,但原代码里的数据存在两处小错误:一是y列少了一个值(原数据有9个点,你的y列表只有8个),二是第四个y值写错了(原数据点是(2,2),你写成了23)。下面是修正后的完整可运行代码,同时指定了初始簇中心和迭代次数:
import pandas as pd from sklearn.cluster import KMeans import numpy as np # 修正后的完整数据集 data = pd.DataFrame({ 'x': [1, 1, 2, 2, 3, 8, 9, 8, 9], 'y': [1, 2, 1, 2, 3, 8, 8, 9, 9] }) # 指定初始簇中心:(1,1) 和 (2,1) initial_centers = np.array([[1, 1], [2, 1]]) # 初始化KMeans:设置2个簇、指定初始中心、仅迭代3次、禁用多初始化 kmeans = KMeans( n_clusters=2, init=initial_centers, max_iter=3, n_init=1, random_state=42 ) # 拟合数据并输出结果 kmeans.fit(data) print("最终簇中心:") print(kmeans.cluster_centers_) print("\n各数据点的簇标签(0/1对应两个簇):") print(kmeans.labels_)
3次迭代的详细过程解析
sklearn默认不会输出中间迭代的质心变化,我们手动模拟每一步的计算(基于欧氏距离),更直观地看到聚类过程:
第1次迭代
- 初始质心:
C1=(1,1),C2=(2,1) - 簇分配:计算每个点到两个质心的距离,分配到距离更近的簇
- 簇0(C1):(1,1)、(1,2)
- 簇1(C2):(2,1)、(2,2)、(3,3)、(8,8)、(9,8)、(8,9)、(9,9)
- 更新质心:
- C1' = ((1+1)/2, (1+2)/2) = (1, 1.5)
- C2' = ((2+2+3+8+9+8+9)/7, (1+2+3+8+8+9+9)/7) ≈ (5.86, 5.71)
第2次迭代
- 当前质心:
C1=(1,1.5),C2=(5.86,5.71) - 簇分配:此时前5个点到C1的距离远小于C2,后4个点则相反
- 簇0:(1,1)、(1,2)、(2,1)、(2,2)、(3,3)
- 簇1:(8,8)、(9,8)、(8,9)、(9,9)
- 更新质心:
- C1' = ((1+1+2+2+3)/5, (1+2+1+2+3)/5) = (1.8, 1.8)
- C2' = ((8+9+8+9)/4, (8+8+9+9)/4) = (8.5, 8.5)
第3次迭代
- 当前质心:
C1=(1.8,1.8),C2=(8.5,8.5) - 簇分配:所有点的簇归属和第2次完全一致,因为每个点到对应质心的距离都是最小的,质心不再变化
- 最终质心保持为(1.8,1.8)和(8.5,8.5),聚类完成
内容的提问来源于stack exchange,提问作者Shivam
相关产品推荐
相关产品推荐

