聚类算法实现之KMeans

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的情况,这里就不过多的赘述了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值