聚类算法实现之KMeans
程序员文章站
2022-05-20 22:06:39
...
K-means算法简述
K-means算法是机器学习中一种常用的非监督聚类算法,数据通常只有特征值,没有目标值,K-means算法通过提前设置的质点K值,可以把数据划分为各个不同的种类,简单来说,就是物以类聚,人以群分。
- 图片说明
- (a)获取样本数据
- (b)随机选定2个质点,此时令K=2
- (c)计算每一个样本点到两个质点之间的欧氏距离,并将样本点归到最近距离的质点中
- (d)经过c步骤的计算,数据被划分为“红”和“蓝”两类,然后计算每一类所有样本点的平均值,得到的平均值为新一轮的质点
- (e)重复c步骤:重新计算所有样本点到两个新质点之间的欧式距离,并将样本点归到最近距离的质点中,继续划分所有的样本点,计算平均值…
经过若干次迭代之后,当两个质点的位置不再变化时,就完成了对数据的聚类
在此之前,K值为重要的超参数,K值的不同决定了聚类结果的好坏,因此要事先定义好K的值
接下来我们用python3代码实现一个简单的Kmeans
import pandas as pd
data_csv = pd.read_excel('D:/Software Setup/ChromeCore/ChromeCore,Downloads/test.xlsx') # 读入数据文件
print(data_csv)
*
如果特征比较多的话,可以考虑使用sklearn中的特征选择API:VarianceThreshold或者主成分分析PCA对特征进行删除和降维,此次实验数据只有四个特征,所以就不进行处理了
from sklearn.cluster import KMeans
data_x = data_csv[["calories", "sodium", "alcohol", "cost"]] # 提取特征
km = KMeans(n_clusters=2)# 设置K值为2
km.fit(data_x) # 训练数据,由于sklearn封装的比较完善,所有的计算过程都在这个API里面
predict_x = km.predict(data_x) # 划分数据点的类别
print(predict_x)
结果为:[0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 1 0 0 1 1]
# 显示结果
import matplotlib.pyplot as plt
plt.figure(figsize=(10,10)) # 显示画板大小
# 建立一个列表,里面包含两个颜色
color_data = ['red','blue']
# 将数据点的类别转换成相应的颜色
color_x = [color_data[i] for i in predict_x]
# 用散点图显示出其中两个特征的结果
plt.scatter(data_x.values[:,3],data_x.values[:,0],color = color_x)
plt.xlabel("cost") # x轴标签
plt.ylabel("calories") # y轴标签
plt.show()
选择的特征的不同显示出的结果也不一样,因为维度问题,无法显示过多特征。
- 由于K-means的数据没有目标值,所以无法像其他监督学习那样得到具体的准确率或者是召回率。不过K-means也有自己的评估指标,它就是轮廓系数,计算公式是:
- 每个点 i 为已聚类数据中的样本点,bi为 i 样本点到其他族群的所有样本的距离最小值,ai为 i 到本身类所有点的距离平均值
- 最终计算出所有的样本点的轮廓系数平均值
- 根据公式可知最终的轮廓系数的平均值在-1和1之间,所以测试的结果越靠近1就说明聚类的效果越好,也代表内聚度和分离度较为完善,而越趋近于-1,效果越不好。
接下来介绍评估算法的API
sklearn.metrics.silhouette_score(X,labels)
- 参数X为特征值
- labels是划分后的目标值
# 评估模型
from sklearn.metrics import silhouette_score
print(silhouette_score(data_x,predict_x))
运行结果是:0.6917656034079486
这样的效果已经很不错了
当然这是K值为2的时候评判的结果,也可以试试当K等于3或者是4的情况,这里就不过多的赘述了。
上一篇: 红糖过期了还能吃吗