【机器学习与实战】分类与聚类算法:K-Means聚类分析-01聚类算法
配套视频课程:www.bilibili.com/video/BV1iS…
一、简介
聚类(包括K均值聚类)是一种用于数据分类的无监督学习技术。无监督学习意味着没有输出变量来指导学习过程(没有这个或那个,没有对错),数据由算法来探索以发现模式。我们只观察这些特征,但没有对结果进行确定的测量值,因为我们想要找出它们。与监督学习不同的是,非监督学习技术不使用带标签的数据,算法需要自己去发现数据中的结构。
在聚类技术领域中,K-means可能是最常见和经常使用的技术之一。K-means使用迭代细化方法,基于用户定义的集群数量(由变量K表示)和数据集来产生其最终聚类。例如,如果将K设置为3,则数据集将分组为3个群集,如果将K设置为4,则将数据分组为4个群集,依此类推。在聚类算法中根据样本之间的相似性,将样本划分到不同的类别中,对于不同的相似度计算方法,会得到不同的聚类结果,常用的相似度计算方法有欧式距离法。
使用不同的聚类准则,产生的聚类结果不同。
KMeans聚类的基本原理:
(1)K个质心是随机创建的(基于预定义的K值)
(2)K-means将数据集中的每个数据点分配到最近的质心(最小化它们之间的欧几里德距离),这意味着如果数据点比任何其他质心更接近该群集的质心,则认为该数据点位于特定集群中。
(3)然后K-means通过获取分配给该质心集群的所有数据点的平均值来重新计算质心,从而减少与前一步骤相关的集群内总方差。K均值中的“均值”是指对数据求均值并找到新的质心。
(4)该算法在步骤2和3之间迭代,直到满足一些标准(例如最小化数据点与其对应质心的距离之和,达到最大迭代次数,质心值不变或数据点没有变化集群)
聚类算法在现实中的应用
- 用户画像,广告推荐,Data Segmentation,搜索引擎的流量推荐,恶意流量识别
- 基于位置信息的商业推送,新闻聚类,筛选排序
- 图像分割,降维,识别;离群点检测;信用卡异常消费;发掘相同功能的基因片段
聚类算法可以分为:细聚类、粗聚类
二、sklearn案例应用
1、接口介绍
sklearn.cluster.KMeans(n_clusters=8)
参数:
- n_clusters:开始的聚类中心数量
- 整型,缺省值=8,生成的聚类数,即产生的质心(centroids)数。
- 方法:
- estimator.fit(x)
- estimator.predict(x)
- estimator.fit_predict(x)
- 计算聚类中心并预测每个样本属于哪个类别,相当于先调用fit(x),然后再调用predict(x)
2、案例
随机创建不同二维数据集作为训练集,并结合k-means算法将其聚类,你可以尝试分别聚类不同数量的簇,并观察聚类效果,此时可以直接使用SKLearn内置的make_blobs函数快速生成一个数据集。
聚类参数n_cluster传值不同,得到的聚类结果不同
3、代码实现
(1)创建数据集
import matplotlib.pyplot as plt
from sklearn.datasets.samples_generator import make_blobs
from sklearn.cluster import KMeans
from sklearn.metrics import calinski_harabaz_score
# 创建数据集
# 最简单的方案,直接调用make_blobs创建默认数据集:X为样本特征,Y为样本簇类别
x, y = make_blobs()
# 或自定义参数:共1000个样本,每个样本2个特征,共4个簇,
# 簇中心在[-1,-1], [0,0],[1,1], [2,2], 簇方差分别为[0.4, 0.2, 0.2, 0.2]
x, y = make_blobs(n_samples=1000, n_features=2, centers=[[-1, -1], [0, 0], [1, 1], [2, 2]],
cluster_std=[0.4, 0.2, 0.2, 0.2],
random_state=9)
# 数据集可视化
plt.scatter(x[:, 0], x[:, 1], marker='o')
plt.show()
(2)使用k-means进行聚类,并使用CH方法评估
y_pred = KMeans(n_clusters=2, random_state=9).fit_predict(x)
# 分别尝试n_cluses=2\3\4,然后查看聚类效果
plt.scatter(x[:, 0], x[:, 1], c=y_pred)
plt.show()
# 用Calinski-Harabasz Index评估的聚类分数
print(calinski_harabaz_score(x, y_pred))
三、算法实现过程演示
1、k-means聚类步骤
- 1、随机设置K个特征空间内的点作为初始的聚类中心
- 2、对于其他每个点计算到K个中心的距离,未知的点选择最近的一个聚类中心点作为标记类别
- 3、接着对着标记的聚类中心之后,重新计算出每个聚类的新中心点(平均值)
- 4、如果计算得出的新中心点与原中心点一样(质心不再移动),那么结束,否则重新进行第二步过程
通过下图解释实现流程:
k聚类动态效果图
2、案例练习
案例:
1、随机设置K个特征空间内的点作为初始的聚类中心(本案例中设置p1和p2两个点作为暂时的质心)
2、对于其他每个点计算到K个中心的距离,未知的点选择最近的一个聚类中心点作为标记类别
3、接着对着标记的聚类中心之后,重新计算出每个聚类的新中心点(分别计算对应点的X和Y的平均值)
4、如果计算得出的新中心点与原中心点一样(质心不再移动),那么结束,否则重新进行第二步过程【经过判断,需要重复上述步骤,开始新一轮迭代】
5、当每次迭代结果不变时,认为算法收敛,聚类完成,K-Means一定会停下,不可能陷入一直选质心的过程。
但是要完全实现重合是很难的,所以此时可以设置一个阈值,只要在这个范围内就可以。
由于每次都要计算所有的样本与每一个质心之间的相似度,故在大规模的数据集上,K-Means算法的收敛速度比较慢。