Python实现K-Means聚类算法:详细代码解读与可视化
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()
代码解读:
-
导入必要的库:
numpy用于数值计算matplotlib.pyplot用于数据可视化make_blobs用于生成测试数据
-
定义函数:
distance(pt1, pt2): 计算两点之间的欧氏距离classify(pt, centers): 计算给定点pt距离哪个中心点最近,返回最近中心点的索引和距离calc_centers(categories, centers): 根据当前的类别划分,重新计算每个类别的中心点
-
初始化参数:
M: 数据点个数K: 聚类数量X, y: 使用make_blobs生成测试数据cost: 初始误差,设置为一个较大的值epsilon: 误差阈值,用于判断算法是否收敛max_iter: 最大迭代次数categories: 列表,用于存储每个类别的数据点
-
随机初始化中心点:
- 从数据集中随机选择
K个点作为初始中心点
- 从数据集中随机选择
-
迭代计算:
- 重复以下步骤,直到算法收敛或达到最大迭代次数:
- 清空
categories列表 - 遍历所有数据点,将每个点分配到距离最近的中心点所属的类别
- 计算新的误差,即所有点到其所属类别中心点的距离之和
- 如果误差小于阈值
epsilon,则算法收敛,退出循环 - 否则,更新中心点,即计算每个类别中所有点的平均值作为新的中心点
- 清空
- 重复以下步骤,直到算法收敛或达到最大迭代次数:
-
可视化结果:
- 使用
matplotlib.pyplot绘制原始分类情况和 K-Means 聚类结果的散点图,并保存图片
- 使用
总结:
本文介绍了如何使用Python实现K-Means聚类算法,并通过可视化展示聚类结果。K-Means算法简单易懂,但容易受到初始中心点选择的影响。在实际应用中,可以使用一些技巧来优化初始中心点的选择,例如 K-Means++ 算法。
原文地址: https://www.cveoy.top/t/topic/jpX8 著作权归作者所有。请勿转载和采集!