欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

聚类算法实现之KMeans

程序员文章站 2022-05-20 22:06:39
...

K-means算法简述

K-means算法是机器学习中一种常用的非监督聚类算法,数据通常只有特征值,没有目标值,K-means算法通过提前设置的质点K值,可以把数据划分为各个不同的种类,简单来说,就是物以类聚,人以群分。

  • 图片说明
    聚类算法实现之KMeans
  • (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)

聚类算法实现之KMeans
*

如果特征比较多的话,可以考虑使用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()

聚类算法实现之KMeans
选择的特征的不同显示出的结果也不一样,因为维度问题,无法显示过多特征。

  • 由于K-means的数据没有目标值,所以无法像其他监督学习那样得到具体的准确率或者是召回率。不过K-means也有自己的评估指标,它就是轮廓系数,计算公式是:
  • 聚类算法实现之KMeans
  • 每个点 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的情况,这里就不过多的赘述了。