K-means
K-means 算法是一种广泛使用的聚类算法,旨在将数据集划分为 K 个簇,使得每个簇内的数据点尽可能相似,而不同簇之间的数据点尽可能不同。这个算法通过迭代的方式实现,每次迭代都会更新簇的中心(即簇内所有点的均值),然后将每个点重新分配到最近的簇中心所在的簇中。
基本步骤
- 选择簇的数量 K:这是用户需要预先指定的参数,表示要将数据分成多少个簇。
- 初始化簇中心:随机选择 K 个数据点作为初始的簇中心,或者采用其他方法来选择初始中心,如 K-means++ 算法,这有助于避免局部最优解。
- 分配数据点到簇:对于数据集中的每一个点,根据其与各个簇中心的距离(通常采用欧氏距离),将该点分配到最近的簇中心所在的簇中。
- 重新计算簇中心:对于每个簇,计算该簇内所有点的均值(坐标的平均值),得到新的簇中心。
- 重复步骤 3 和 4:直到簇中心不再发生变化,或者达到预设的迭代次数,或者簇中心的变化量小于某个阈值,算法结束。
优缺点
优点:
- 原理简单,容易实现。
- 收敛速度快,对于大数据集同样有效。
- 当簇近似为高斯分布时,效果较好。
缺点:
- 需要预先指定簇的数量 K,这在实际应用中可能是一个挑战。
- 对初始簇中心的选择敏感,可能导致算法陷入局部最优解。
- 对于非球形的簇或大小差异很大的簇,效果可能不佳。
- 对噪声和异常值比较敏感。
构建模型
K-means模型主要调整参数为n_clusters: 类中心的个数,就是要聚成几类。【默认是8个】
聚类算法事先是没有标签的,模型训练分类之后,模型自动打上标签。
-
收集数据
链接: 数据
提取码: 9bs9 -
数据预处理
import pandas as pd
beer = pd.read_table("data.txt",sep=" ",encoding='utf8')
x = beer[["calories","sodium","alcohol","cost"]]
- 交叉验证,寻找最优参数
fit模型之后,模型中会有labels_参数(是他给每个参数打的标签),可以将它拿出来:
from sklearn.cluster import KMeans
scores = []
for k in range(2,10):
labels = KMeans(n_clusters=k).fit(x).labels_
score = metrics.silhouette_score(x,labels)
scores.append(score)
- 绘图,查看最优点
import matplotlib.pyplot as plt
plt.plot(list(range(2,10)),scores)
plt.xlabel('x')
plt.ylabel('y')
plt.show()
由图可得,选择的最优参数为2。
- 计算轮廓系数
轮廓系数的值域为[-1, 1],值越大表示聚类效果越好:
from sklearn import metrics
km = KMeans(n_clusters=2).fit(x)
beer['cluster'] = km.labels_
score = metrics.silhouette_score(x,beer.cluster)
print(score)
-------------------
0.6917656034079486
这样我们就构建好一个K-means聚类模型啦!!
总结
本篇介绍了:
- K-means聚类算法的过程。
- K-means聚类算法训练的数据没有标签,自动分配标签。
- 通过轮廓系数查看聚类效果,值越大表示聚类效果越好。