常用的聚类算法对比及代码案例

👨聚类算法介绍

聚类是一种无监督学习算法,其目的是将具有相似特征的数据点分组或聚集在一起。常用的聚类算法有以下几种:
(下面的代码介绍以python为例,使用sklearn模块)

1. K-Means

K-Means 是一种经典的聚类算法。它的基本思想是通过计算数据点和数据点所属的中心点之间的距离,将数据点分配到与其最相似的中心点上。具体步骤如下:

  1. 随机选取 k 个中心点(k 代表聚类簇的个数)。
  2. 对于每个数据点,计算其与中心点的距离,并将其分配到最近的中心点上。
  3. 更新中心点,即将每个簇中所有数据点的坐标的平均值作为该簇的新中心点。
  4. 重复步骤 2 和 3,直到中心点不再改变或达到预设的最大迭代次数。

K-Means 的优点是易于实现并且速度快,适合于大规模数据集。但是,它需要预先指定聚类簇的个数,且结果易受到初始化和数据分布影响

# KMeans 示例代码
from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters=3)
kmeans.fit(X)
y_kmeans = kmeans.predict(X)

2. 层次聚类

层次聚类是一种自下而上或自上而下的聚类方法,可以生成一个聚类树,树上的每个节点都代表一个聚类。一开始时,每个数据点都被视为一个单独的聚类,然后不断合并具有相似特征的聚类,直到最终形成一个大的聚类。层次聚类的优点是它不需要预先指定聚类的个数,而且可以可视化不同的树状结构,但是它的计算时间往往比 K-Means 更长

# 层次聚类代码
from sklearn.cluster import AgglomerativeClustering
agg = AgglomerativeClustering(n_clusters=3)
agg.fit(X)
y_agg = agg.labels_

3. DBSCAN

DBSCAN(密度聚类算法)可以自动识别聚类形状的算法。DBSCAN通过将数据点分为核心点、边界点和噪声点,并根据这些点的密度将数据点聚类在一起。与 K-Means 和层次聚类不同,DBSCAN 可以识别任何形状的聚类,因此在处理非凸聚类问题方面很有优势。

# DBSCAN 代码
from sklearn.cluster import DBSCAN
dbscan = DBSCAN(eps=0.3, min_samples=5)
dbscan.fit(X)
y_dbscan = dbscan.labels_

🌟适用条件和优缺点

  • K-Means:适用于较大的数据集,且数据点之间的距离衡量方式为欧几里得距离。K-Means 的优点是可伸缩性好,适合于大型数据集,但是需要指定簇的个数。
  • 层次聚类:适用于小型数据集且不确定簇的个数。层次聚类的优点是无需指定簇的个数并且允许以层次结构表示数据,但是计算时间相对较长。
  • DBSCAN:适用于发现非凸性形状的簇和噪音数据。DBSCAN 的优点是可以处理任意形状的聚类,并且不受噪声点影响,但是其计算时间较长,且参数调整可能较困难。

📖 聚类案例

以鸢尾花数据集为例,我们进行聚类分析并绘制出散点图。

import matplotlib.pyplot as plt
from sklearn.datasets import load_iris #数据来源
from sklearn.cluster import KMeans
from sklearn.cluster import AgglomerativeClustering
from sklearn.cluster import DBSCAN

iris = load_iris()
X = iris.data

# K-Means 聚类
kmeans = KMeans(n_clusters=3)
kmeans.fit(X)
y_kmeans = kmeans.predict(X)

# 层次聚类
agg = AgglomerativeClustering(n_clusters=3)
agg.fit(X)
y_agg = agg.labels_

# DBSCAN 聚类
dbscan = DBSCAN(eps=0.5, min_samples=5)
dbscan.fit(X)
y_dbscan = dbscan.labels_

# 绘制散点图
fig, axs = plt.subplots(ncols=3, figsize=(15,4))
axs[0].scatter(X[:, 0], X[:, 1], c=y_kmeans, s=50, cmap='viridis')
axs[0].set_title("K-Means")
axs[1].scatter(X[:, 0], X[:, 1], c=y_agg, s=50, cmap='viridis')
axs[1].set_title("Agglomerative Clustering")
axs[2].scatter(X[:, 0], X[:, 1], c=y_dbscan, s=50, cmap='viridis')
axs[2].set_title("DBSCAN")
plt.show()


三种聚类结果

我们可以看出K-Means 和 层次聚类都成功将数据集划分为3个簇,而 DBSCAN 相对于其他两种算法对噪声较稳健。

完。。。

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Freshman小白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值