聚类算法及其数据可视化

这是 林骥 公众号的第 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站也能学编程吗?
  • 6
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值