目录
6.1 K-means聚类
K-means 是一种将输入数据划分成 k 个簇的简单的聚类算法。K-means 反复提炼初 始评估的类中心,步骤如下:
(1)
以随机或猜测的方式初始化类中心
u
i
,
i
=1
…
k
;
(2)
将每个数据点归并到离它距离最近的类中心所属的类
c
i
;
(3)
对所有属于该类的数据点求平均,将平均值作为新的类中心;
(4)
重复步骤(
2
)和步骤(
3
)直到收敛。
K-means 试图使
类内总方差
最小:
xj 是输入数据,并且是矢量。
该算法是启发式提炼算法,在很多情形下都适用,但
是并不能保证得到最优的结果。
K-means 算法最大的缺陷是必须预先设定聚类数
k
,如果选择不恰当则会导致聚类出来的结果很差。
6.1.1 SciPy聚类包
在SciPy库中,scipy.cluster.vq
模块提供了K-means算法的实现。K-means是一种常见的聚类算法,其主要目标是将数据点分配到预定数量的簇中,使得簇内的数据点尽可能相似,而簇间的数据点尽可能不同。
实验代码:
import numpy as np
from scipy.cluster.vq import kmeans, vq
import matplotlib.pyplot as plt
# 生成测试数据
np.random.seed(42)
data = np.concatenate([
np.random.normal(loc=[1, 1], scale=0.5, size=(100, 2)),
np.random.normal(loc=[5, 5], scale=0.5, size=(100, 2)),
np.random.normal(loc=[8, 1], scale=0.5, size=(100, 2))
])
# 聚类数量
k = 3
# 计算K-means聚类的质心
centroids, distortion = kmeans(data, k)
# 将数据点分配到簇
code, distance = vq(data, centroids)
# 绘制结果
plt.figure(figsize=(8, 6))
plt.scatter(data[:, 0], data[:, 1], c=code, s=30, cmap='viridis')
plt.scatter(centroids[:, 0], centroids[:, 1], c='red', s=100, marker='x') # 质心
plt.title('K-means Clustering')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.show()
# 打印结果
print("质心位置:")
print(centroids)
print("失真度(Distortion):", distortion)
分析:
-
聚类效果:
- 上述代码生成了三类数据点,每类数据点在二维空间中分布。K-means聚类会将这些数据点分成三簇,并计算每簇的质心。
- 绘图中,数据点的颜色表示它们所属的簇,红色的“x”标记表示各簇的质心。
-
质心位置:
centroids
数组中包含了每个簇的质心位置。你可以通过这些质心了解每个簇的中心位置。
-
失真度