这是 林骥 公众号的第 64 篇原创文章
引言
本文是我写的人工智能系列的第 9 篇文章,文末有前面 8 篇文章的链接。
1. 聚类算法简介
聚类算法,就是把一些没有标签的数据,让「相似」的数据「聚」在一起,划分为不同的「类」,从而揭示数据内在的特征和规律。
聚类算法在很多领域都发挥着重要的作用。比如说,在目标客户定位中,根据客户的基本数据,将客户进行分群,定义并分析不同客群的消费行为模式。
聚类算法主要包括:以 K 均值为代表的划分式聚类算法、层次聚类算法、基于密度的聚类算法、基于网格的聚类算法、基于模型的聚类算法等。
本文以 sklearn 中自带的鸢尾花数据集为例,假设我们事先并不知道鸢尾花的种类,应用 K 均值聚类算法,将鸢尾花分成不同的类别。
2. 加载数据
为了方便进行数据可视化,我们只选取数据集中的 2 个特征:第 1 个特征(花萼长度)和第 3 个特征(花瓣长度),并绘制出相应的散点图,以便观察数据的分布情况。
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
# 加载鸢尾花数据集
iris = datasets.load_iris()
# 为了方便可视化,只选取 2 个特征
X = iris.data[:, [0, 2]]
# 绘制散点图
plt.figure(figsize=(8, 6))
plt.scatter(X[:, 0], X[:, 1])
plt.show()
在上面的散点图中,横轴代表花萼长度,纵轴代表花瓣长度。
根据观察和经验的判断,我们认为把这组数据分成 3 类是比较恰当的。所以,在下面的聚类算法中,我们设置聚类的数量 n_clusters 等于 3。
3. 调用算法
在 sklearn 中,先从 cluster 中导入 K 均值聚类算法 KMeans,然后用 fit 方法进行训练,就可以输出聚类的标签和中心点。
from sklearn.cluster import KMeans
# 设置聚类的数量
n_clusters = 3
# 调用 K-Means 聚类算法
km = KMeans(n_clusters)
km.fit(X)
# 聚类的标签
lbs = km.labels_
# 聚类的中心点
cts = km.cluster_centers_
从上面的调用过程可以看到,聚类算法不要使用数据 y,只要使用数据 X,就可以得到聚类的结果,这种算法我们称之为「无监督学习算法」。
无监督学习,与我们认知事物的过程类似。当我们面临大量未知的事物时,可以通过寻找其中的规律,挖掘数据内部的分布特性,反映出数据之间的异同,从而建立一套划分的方法,让我们更加深入地了解事物的内在特征,从而提高了我们认知事物的能力。
比如说,当你进入一个陌生的群体时,没有人帮你介绍,你根据外貌、性格、行为等方面,将不同的人划分为不同的类别,并根据经验来定义类别的标签,例如:高富帅、白富美、谨慎型、外向型、体贴型等等。这个过程就属于无监督学习,因为事先无人教你。
而对于监督学习,就好像有一位老师在旁边教你,这位老师对群体里面的每一个人都很熟悉,他会向你介绍每一个人,帮你先做好了分类,并且贴好了标签。但是,当老师提供的信息有误时,就会导致你的认知出现偏误。如果来了一个「异类」,不属于老师所介绍的任一类型,那么就会导致你无法做出正确的判断。
4. 数据可视化
为了更加直观地看到聚类的效果,我们绘制出相应的决策边界,并用不同的颜色来代表不同的类别,红色的五角星符号来代表聚类的中心点。
from matplotlib.colors import ListedColormap
# 定义绘制决策边界的函数
def plot_decision_boundary(model, axis):
x0, x1 = np.meshgrid(
np.linspace(axis[0], axis[1], int((axis[1]-axis[0])*100)).reshape(-1,1),
np.linspace(axis[2], axis[3], int((axis[3]-axis[2])*100)).reshape(-1,1)
)
X_new = np.c_[x0.ravel(), x1.ravel()]
y_predict = model.predict(X_new)
zz = y_predict.reshape(x0.shape)
custom_cmap = ListedColormap(['#EF9A9A','#FFF59D','#90CAF9'])
plt.contourf(x0, x1, zz, cmap=custom_cmap)
# 设置图形大小
plt.figure(figsize=(8, 6))
# 绘制决策边界
plot_decision_boundary(km, axis=[3, 8, 0, 8])
# 绘制散点图
for c in range(n_clusters):
plt.scatter(X[lbs == c, 0], X[lbs == c, 1])
# 画出每个聚类的中心点
plt.scatter(cts[:, 0], cts[:, 1], marker='*', c='r', alpha=0.9, s=200)
plt.show()
5. K 均值聚类算法的优缺点
任何算法都有优点和缺点,K 均值聚类算法当然也不例外。
【优点】
(1)原理比较简单,实现也比较容易。
(2)当数据比较集中时,聚类算法的效果较好。
(3)算法的参数比较少。
【缺点】
(1)K 值的估计比较困难。
(2)对初始点、噪音和异常点比较敏感。
(3)有时只能得到局部的最优解。
小结
本文介绍了 K 均值聚类算法的应用,以鸢尾花数据集为例,演示了 K 均值聚类算法的实现过程,绘制了直观易懂的数据可视化图形,包括决策边界和中心点,并分析了 K 均值聚类算法的优缺点。
一个数据集到底分成多少类比较合适,是聚类算法的关键,也是较为困难的一个问题。通常需要结合一定的经验信息、背景知识和评价标准等,对聚类结果进行分析和解释,找到最适合的聚类数 K。
所以,需要对业务有深入地理解,这一点是非常重要的。
以上,希望能够对你有所启发。
作者:林骥,公众号 ID:linjiwx,从 2008 年开始从事数据分析工作,网名数据化分析,用数据化解分析难题,让数据更有价值,让分析更有效。敬请关注。
◆ ◆ ◆ ◆ ◆
长按二维码关注我们
数据森麟公众号的交流群已经建立,许多小伙伴已经加入其中,感谢大家的支持。大家可以在群里交流关于数据分析&数据挖掘的相关内容,还没有加入的小伙伴可以扫描下方管理员二维码,进群前一定要关注公众号奥,关注后让管理员帮忙拉进群,期待大家的加入。
管理员二维码:
猜你喜欢
● 笑死人不偿命的知乎沙雕问题排行榜● 用Python扒出B站那些“惊为天人”的阿婆主!● 全球股市跳水大战,谁最坑爹!● 上万条数据撕开微博热搜的真相!● 你相信逛B站也能学编程吗?