K-Means聚类算法讲解与实践

K-Means聚类算法讲解与实践

  • 本文介绍
    • 1. 聚类算法
    • 2. K-Means算法
      • 2.1 中心思想(牧师—村民模型)
      • 2.2 实现步骤
    • 3. Mini Batch K-Means算法
    • 4. Bisecting K-Means算法
    • 5. sklearn实践

本文介绍

本文将介绍 K-Means 聚类算法及其变种算法Mini Batch K-Means算法和Bisecting K-Means算法,并讲解中心思想,最后使用机器学习库sklearn进行实践操作。

1. 聚类算法

聚类算法:是一种典型的无监督学习算法,主要用于将相似的样本自动归到一个类别中。

  • 聚类算法分类算法最大的区别是:聚类算法是无监督的学习算法,而分类算法属于监督的学习算法,分类是知道结果的。
  • 在聚类算法中根据样本之间的相似性,将样本划分为不同的类别中,对于不同的相似度计算方法,会得到不同的聚类结果,常用的相似度计算方法有欧式距离法

2. K-Means算法

2.1 中心思想(牧师—村民模型)

K-means 有一个著名的解释,牧师—村民模型:

有四个牧师去郊区布道,一开始牧师们随意选了几个布道点,并且把这几个布道点的情况公告给了郊区所有的村民,于是每个村民到离自己家最近的布道点去听课。
听课之后,大家觉得距离太远了,于是每个牧师统计了一下自己的课上所有的村民的地址,搬到了所有地址的中心地带,并且在海报上更新了自己的布道点的位置。
牧师每一次移动不可能离所有人都更近,有的人发现A牧师移动以后自己还不如去B牧师处听课更近,于是每个村民又去了离自己最近的布道点……
就这样,牧师每个礼拜更新自己的位置,村民根据自己的情况选择布道点,最终稳定了下来。

2.2 实现步骤

  • 先定义总共有多少个类/簇(cluster)
  • 将每个簇心(cluster centers)随机定在一个点上
  • 将每个数据点关联到最近簇中心所属的簇上
  • 对于每一个簇找到其所有关联点的中心点(取每一个点坐标的平均值)
  • 将上述点变为新的簇心
  • 不停重复,直到每个簇所拥有的点不变

3. Mini Batch K-Means算法

Mini Batch K-Means算法是K-Means算法的变种,采用小批量的数据子集减少计算时间。这里所谓的小批量是指每次训练算法时所随机抽取的数据子集,采用这些随机产生的子集进行训练算法,大大减少了计算时间,结果一般只略差于标准算法。
该算法的迭代步骤有两步:

  1. 从数据集中随机抽取一些数据形成小批量,把他们分配给最近的质心。
  2. 与K-Means算法相比,数据的更新是在每一个小的样本集上。Mini Batch K-Means比K-Means有更快的收敛速度,但同时也降低了聚类的效果,但是在实际项目中却表现得不明显。

K-Means聚类算法讲解与实践_第1张图片

4. Bisecting K-Means算法

  • 由于传统的KMeans算法的聚类结果易受到初始聚类中心点选择的影响,因此在传统的KMeans算法的基础上进行算法改进,对初始中心点选取比较严格,各中心点的距离较远,这就避免了初始聚类中心会选到一个类上,一定程度上克服了算法陷入局部最优状态。
  • Bisecting K-Means算法的主要思想是:首先将所有点作为一个簇,然后将该簇一分为二。之后选择能最大限度降低聚类代价函数(也就是误差平方和)的簇划分为两个簇。以此进行下去,直到簇的数目等于用户给定的数目k为止。以上隐含的一个原则就是:因为聚类的误差平方和能够衡量聚类性能,该值越小表示数据点越接近于他们的质心,聚类效果就越好。所以我们就需要对误差平方和最大的簇进行再一次划分,因为误差平方和越大,表示该簇聚类效果越不好,越有可能是多个簇被当成了一个簇,所以我们首先需要对这个簇进行划分。

5. sklearn实践

输入向量文件:

K-Means聚类算法讲解与实践_第2张图片

源代码:

import pandas as pd
from sklearn.cluster import KMeans
from sklearn.cluster import MiniBatchKMeans
from sklearn.cluster import BisectingKMeans


datas = pd.read_csv('dates.txt', header=None)
data = []

for i in datas.index:
    line_data = datas.loc[i].values
    data.append(line_data)

print(data)

# 进行聚类
julei = KMeans(n_clusters=4)
# 对聚类的数据进行聚类
julei.fit(data)
# 获得聚类标签
label = julei.labels_
# # 聚类中心
center = julei.cluster_centers_
print(label)

# 小批量K均值
julei2 = MiniBatchKMeans(n_clusters=4)
julei2.fit(data)
label = julei2.labels_
print(label)

# 二分K均值
julei3 = BisectingKMeans(n_clusters=4)
julei3.fit(data)
label = julei3.labels_
print(label)

输出结果:

[array([0.534453, 8.724232]), array([ 0.512406, 10.462069]), array([ 0.495082, 11.945053]), array([ 0.490942, 12.72279 ]), array([ 0.499233, 12.744945])]
[1 2 0 3 3]
[0 2 3 1 1]
[1 0 2 3 3]

你可能感兴趣的:(研究之路,算法,聚类,算法,kmeans)