【机器学习】(16) --K-means聚类算法

K-means

K-means 算法是一种广泛使用的聚类算法,旨在将数据集划分为 K 个簇,使得每个簇内的数据点尽可能相似,而不同簇之间的数据点尽可能不同。这个算法通过迭代的方式实现,每次迭代都会更新簇的中心(即簇内所有点的均值),然后将每个点重新分配到最近的簇中心所在的簇中。

基本步骤

  1. 选择簇的数量 K:这是用户需要预先指定的参数,表示要将数据分成多少个簇。
  2. 初始化簇中心:随机选择 K 个数据点作为初始的簇中心,或者采用其他方法来选择初始中心,如 K-means++ 算法,这有助于避免局部最优解。
  3. 分配数据点到簇:对于数据集中的每一个点,根据其与各个簇中心的距离(通常采用欧氏距离),将该点分配到最近的簇中心所在的簇中。
  4. 重新计算簇中心:对于每个簇,计算该簇内所有点的均值(坐标的平均值),得到新的簇中心。
  5. 重复步骤 3 和 4:直到簇中心不再发生变化,或者达到预设的迭代次数,或者簇中心的变化量小于某个阈值,算法结束。

优缺点

优点

  • 原理简单,容易实现。
  • 收敛速度快,对于大数据集同样有效。
  • 当簇近似为高斯分布时,效果较好。

缺点

  • 需要预先指定簇的数量 K,这在实际应用中可能是一个挑战。
  • 对初始簇中心的选择敏感,可能导致算法陷入局部最优解。
  • 对于非球形的簇或大小差异很大的簇,效果可能不佳。
  • 对噪声和异常值比较敏感。

构建模型

K-means模型主要调整参数为n_clusters: 类中心的个数,就是要聚成几类。【默认是8个】

聚类算法事先是没有标签的,模型训练分类之后,模型自动打上标签。

  1. 收集数据
    链接: 数据
    提取码: 9bs9

  2. 数据预处理

import pandas as pd

beer = pd.read_table("data.txt",sep=" ",encoding='utf8')
x = beer[["calories","sodium","alcohol","cost"]]
  1. 交叉验证,寻找最优参数

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)
  1. 绘图,查看最优点
import matplotlib.pyplot as plt
plt.plot(list(range(2,10)),scores)
plt.xlabel('x')
plt.ylabel('y')
plt.show()

在这里插入图片描述

由图可得,选择的最优参数为2。

  1. 计算轮廓系数

轮廓系数的值域为[-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聚类模型啦!!

总结

本篇介绍了:

  1. K-means聚类算法的过程。
  2. K-means聚类算法训练的数据没有标签,自动分配标签。
  3. 通过轮廓系数查看聚类效果,值越大表示聚类效果越好。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值