聚类算法及其数据可视化

Posted 林骥

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了聚类算法及其数据可视化相关的知识,希望对你有一定的参考价值。

这是 林骥 公众号的第 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)算法的参数比较少。

【缺点】

(1K 值的估计比较困难。
(2对初始点、噪音和异常点比较敏感。
(3有时只能得到局部的最优解。

小结


本文介绍了 K 均值聚类算法的应用,以鸢尾花数据集为例,演示了 K 均值聚类算法的实现过程,绘制了直观易懂的数据可视化图形,包括决策边界和中心点,并分析了 K 均值聚类算法的优缺点。


一个数据集到底分成多少类比较合适,是聚类算法的关键,也是较为困难的一个问题。通常需要结合一定的经验信息、背景知识和评价标准等,对聚类结果进行分析和解释,找到最适合的聚类数 K。


所以,需要对业务有深入地理解,这一点是非常重要的。


以上,希望能够对你有所启发。


作者: 林骥公众号 ID:linjiwx,从 2008 年开始从事数据分析工作,网名数据化分析,用数据化解分析难题,让数据更有价值,让分析更有效。敬请关注。
聚类算法及其数据可视化


为了沉淀有价值的知识,结交有智慧的朋友,我创建了一个免费的「知识星球」,主要定位:


1. 分享自己十多年来的思考感悟。 内容会涉及: 数据分析、人工智能,以及其他我认为有价值的知识。


2. 分享一些我认为有价值的文章或资源。


3. 和大家一起营造很好的互助氛围,你可以在星球里面提问,大家互帮互助,给你带来更大的价值。


希望这个知识星球,能给你带来真正有价值的帮助,让我们之间的关系更进一步。



推荐阅读


 请点一点

以上是关于聚类算法及其数据可视化的主要内容,如果未能解决你的问题,请参考以下文章

Kmeans聚类算法及其 Python实现

基于进化思想的聚类算法及其类簇融合算法(Matlab代码实现)

层次聚类算法介绍及其参数讲解

机器学习算法精讲20篇-k-means聚类算法应用案例(附示例代码)

kmeans算法思想及其python实现

[聚类算法]K-means优缺点及其改进