Python实现K-Means聚类算法:详细代码解读与可视化

K-Means是一种常用的聚类算法,它能够将数据点分成K个簇,每个簇内的点相似度较高,而不同簇之间的点相似度较低。本文将介绍如何使用Python实现K-Means算法,并通过可视化展示聚类结果。

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs

np.random.seed(2)

# 计算两点之间距离
def distance(pt1, pt2):
    return np.sum((pt1 - pt2) ** 2)

# 计算当前各个中心点中离给定点pt最近的一个
def classify(pt, centers):
    temp = [distance(pt, centers[i]) for i in range(len(centers))]
    index = np.argmin(temp)
    dist = temp[index]
    return (index, dist)

# 根据当前的类别划分,重新计算每个类别下新的中心点
def calc_centers(categories, centers):
    for i in range(len(categories)):
        # categorise[i]中的每行数据有两列,分别代表横坐标和纵坐标,因此按列求平均值,就可得出新的质心横坐标和纵坐标
        centers[i] = np.mean(categories[i], 0)

M = 100
K = 4
X, y = make_blobs(n_samples=M, centers=K, random_state=2)
cost = 1e10             # 初始误差,设置为很大
epsilon = 1e-8
max_iter = 100
categories = [[] for i in range(K)]

# 随机选择K个中心点作为初始点
init_indecies = np.random.randint(0, M, K)
centers = X[init_indecies]

for iter in range(max_iter):
    # 清空categories
    categories = [[] for i in range(K)]
    # 将每个点归入到离它最近的中心点类别下
    for pt in X:
        index, _ = classify(pt, centers)
        categories[index].append(pt)

    # 计算每个点到离它最近的中心点的平均距离
    new_cost = 0
    for i in range(K):
        for pt in categories[i]:
            new_cost += distance(pt, centers[i])
    new_cost /= M

    # 如果误差小于设定的epsilon,则停止迭代
    if abs(cost - new_cost) < epsilon:
        break
    cost = new_cost

    # 重新计算各类中心点
    calc_centers(categories, centers)

    # 再次计算
    iter += 1

print('经过',iter,'次循环,质心计算完成...')

yPredicts = np.zeros(M)
# 计算每个样本所属的类别
for i in np.arange(M):
    category, _ = classify(X[i], centers)
    yPredicts[i] = category

# 查看原始分类情况
plt.figure(1)
plt.title('Origin Classification')
plt.scatter(X[:, 0], X[:, 1], c=y, s=30, cmap=plt.cm.Paired)
plt.savefig('origin_classification.png')

# 查看K-Means分类结果
plt.figure(2)
plt.title('KMeans Classification')
plt.scatter(X[:, 0], X[:, 1], c=yPredicts, s=30, cmap=plt.cm.Paired)
plt.savefig('kmeans_classification.png')
plt.show()

代码解读:

  1. 导入必要的库:

    • numpy 用于数值计算
    • matplotlib.pyplot 用于数据可视化
    • make_blobs 用于生成测试数据
  2. 定义函数:

    • distance(pt1, pt2): 计算两点之间的欧氏距离
    • classify(pt, centers): 计算给定点 pt 距离哪个中心点最近,返回最近中心点的索引和距离
    • calc_centers(categories, centers): 根据当前的类别划分,重新计算每个类别的中心点
  3. 初始化参数:

    • M: 数据点个数
    • K: 聚类数量
    • X, y: 使用 make_blobs 生成测试数据
    • cost: 初始误差,设置为一个较大的值
    • epsilon: 误差阈值,用于判断算法是否收敛
    • max_iter: 最大迭代次数
    • categories: 列表,用于存储每个类别的数据点
  4. 随机初始化中心点:

    • 从数据集中随机选择 K 个点作为初始中心点
  5. 迭代计算:

    • 重复以下步骤,直到算法收敛或达到最大迭代次数:
      • 清空 categories 列表
      • 遍历所有数据点,将每个点分配到距离最近的中心点所属的类别
      • 计算新的误差,即所有点到其所属类别中心点的距离之和
      • 如果误差小于阈值 epsilon,则算法收敛,退出循环
      • 否则,更新中心点,即计算每个类别中所有点的平均值作为新的中心点
  6. 可视化结果:

    • 使用 matplotlib.pyplot 绘制原始分类情况和 K-Means 聚类结果的散点图,并保存图片

总结:

本文介绍了如何使用Python实现K-Means聚类算法,并通过可视化展示聚类结果。K-Means算法简单易懂,但容易受到初始中心点选择的影响。在实际应用中,可以使用一些技巧来优化初始中心点的选择,例如 K-Means++ 算法。

Python实现K-Means聚类算法:详细代码解读与可视化

原文地址: https://www.cveoy.top/t/topic/jpX8 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录