k-means 聚类算法原理与 Python 代码实现详解

追风的人
追风的人
发布时间:2026-10-13 | 6人浏览过
原创

本文详细解析 k-means 聚类算法的核心思想,涵盖从随机初始化聚类中心到迭代更新均值的完整流程。通过 Python 代码展示如何利用 numpy 和 matplotlib 实现聚类过程及结果可视化,帮助开发者理解算法逻辑并快速上手应用。

k-means 聚类算法概述

k-means 聚类算法的基本思路是首先随机选取 k 个初始聚类中心,将数据集中的每个元素分配给距离最近的聚类中心,从而形成初步的聚类结果。随后,计算每个聚类中所有元素的均值,并将该均值作为新的聚类中心,重复这一分配与更新过程,经过 n 次迭代后得到最终的聚类结果。以下将分步解析这一过程。

算法步骤详解

一、初始化聚类中心

初始化阶段,首先从数据集中随机选取一个元素作为第一个聚类中心并加入容器。接着,选择距离第一个聚类中心最远的元素作为第二个聚类中心。对于第三、第四直至第 N 个聚类中心,采用类似的策略进行选取。为了优化初始化效果,可以使用距离的平方根作为评判标准,以确保初始中心分布更具代表性。

二、迭代聚类

在迭代过程中,依次遍历数据集中的每个元素,将其分配给距离最近的聚类中心,并存入对应的新的容器。完成一次所有元素的分配后,计算每个新容器中元素的均值,并以此均值更新对应的聚类中心。重复执行聚类操作,经过 n 次迭代后,即可得到理想的聚类结果。

三、可视化展示

为了直观地查看聚类效果,可以利用 Python 第三方库 matplotlib.pyplot 提供的可视化工具,将聚类后的元素以散点图的形式展示出来。通过不同颜色区分不同的聚类簇,可以清晰地观察聚类中心与各元素的空间分布关系。

Python 代码实现与可视化

python代码实现


import numpy as np
import matplotlib.pyplot as plt

# 两点距离
def distance(e1, e2):
  return np.sqrt((e1[0]-e2[0])**2+(e1[1]-e2[1])**2)

# 集合中心
def means(arr):
  return np.array([np.mean([e[0] for e in arr]), np.mean([e[1] for e in arr])])

# arr中距离a最远的元素,用于初始化聚类中心
def farthest(k_arr, arr):
  f = [0, 0]
  max_d = 0
  for e in arr:
    d = 0
    for i in range(k_arr.__len__()):
      d = d + np.sqrt(distance(k_arr[i], e))
    if d > max_d:
      max_d = d
      f = e
  return f

# arr中距离a最近的元素,用于聚类
def closest(a, arr):
  c = arr[1]
  min_d = distance(a, arr[1])
  arr = arr[1:]
  for e in arr:
    d = distance(a, e)
    if d < min_d:
      min_d = d
      c = e
  return c


if __name__=="__main__":
  ## 生成二维随机坐标(如果有数据集就更好)
  arr = np.random.randint(100, size=(100, 1, 2))[:, 0, :]

  ## 初始化聚类中心和聚类容器
  m = 5
  r = np.random.randint(arr.__len__() - 1)
  k_arr = np.array([arr[r]])
  cla_arr = [[]]
  for i in range(m-1):
    k = farthest(k_arr, arr)
    k_arr = np.concatenate([k_arr, np.array([k])])
    cla_arr.append([])

  ## 迭代聚类
  n = 20
  cla_temp = cla_arr
  for i in range(n):  # 迭代n次
    for e in arr:  # 把集合里每一个元素聚到最近的类
      ki = 0    # 假定距离第一个中心最近
      min_d = distance(e, k_arr[ki])
      for j in range(1, k_arr.__len__()):
        if distance(e, k_arr[j]) < min_d:  # 找到更近的聚类中心
          min_d = distance(e, k_arr[j])
          ki = j
      cla_temp[ki].append(e)
    # 迭代更新聚类中心
    for k in range(k_arr.__len__()):
      if n - 1 == i:
        break
      k_arr[k] = means(cla_temp[k])
      cla_temp[k] = []

  ## 可视化展示
  col = ['HotPink', 'Aqua', 'Chartreuse', 'yellow', 'LightSalmon']
  for i in range(m):
    plt.scatter(k_arr[i][0], k_arr[i][1], linewidth=10, color=col[i])
    plt.scatter([e[0] for e in cla_temp[i]], [e[1] for e in cla_temp[i]], color=col[i])
  plt.show()

结果展示

总结

至此,关于 k-means 聚类算法及其 Python 实现代码的介绍已完成。如需了解更多相关 k-means 聚类算法与 Python 的内容,建议搜索本站历史文章或继续浏览下方相关链接。感谢大家的支持!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表