You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于给定初始簇的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:43:20