2025年十大机器学习聚类算法合集,附代码

以下是十大机器学习聚类算法的 原理简介 和 Python 代码演示(基于 scikit-learn 库),代码中包含数据生成、模型训练和结果可视化:

 K - 均值聚类(K-Means)

K - 均值聚类是一种基于划分的聚类算法。它的目标是将数据集划分为 K 个簇,使得簇内的数据点到其所属簇的质心(均值点)的距离平方和最小。算法首先随机初始化 K 个质心,然后通过迭代以下两个步骤来优化聚类结果:一是将每个数据点分配到距离其最近的质心所在的簇;二是更新每个簇的质心为该簇所有数据点的均值。例如,对于一个二维数据集,假设 K = 3,算法会不断调整每个数据点所属的簇以及簇的质心位置,直到收敛。

应用场景:在客户细分中,根据客户的消费行为、年龄、地域等特征将客户分为不同的群体,以便进行针对性的营销。还可用于图像压缩,通过将图像中的像素点聚类,用簇的代表颜色来代替像素点的颜色,从而减少颜色数量实现压缩。


代码

import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs

# 生成数据
X, y = make_blobs(n_samples=150, centers=3, n_features=2, random_state=42)

# 模型训练
kmeans = KMeans(n_clusters=3, random_state=42)
y_pred = kmeans.fit_predict(X)

# 可视化
plt.scatter(X[:, 0], X[:, 1], c=y_pred, cmap='viridis')
plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], s=200, marker='*', c='red')
plt.title("K-Means Clustering")
plt.show()

层次聚类(Hierarchical Clust ering)

原理:它构建簇的层次结构,有两种基本的方法,即凝聚式和分裂式。凝聚式层次聚类从每个数据点作为一个单独的簇开始,然后逐步合并相似的簇。分裂式则相反,从所有数据点都在一个簇开始,逐步分裂。在合并或分裂的过程中,需要定义簇间的距离度量,如单连接(两个簇中最近的两个点之间的距离)、全连接(两个簇中最远的两个点之间的距离)和平均连接(两个簇中所有点对之间距离的平均值)等。例如,在生物学中对物种进行分类,从个体开始逐步向上合并形成属、科等更高层次的分类。

应用场景:在生物学分类、社会科学研究(如组织结构的层次划分)等领域有广泛应用。在数据分析中,可用于探索性数据分析,帮助用户直观地理解数据的层次结构。

代码:

import scipy.cluster.hierarchy as sch
from sklearn.cluster import AgglomerativeClustering

# 生成数据
X, _ = make_blobs(n_samples=100, centers=3, n_features=2, random_state=42)

# 绘制树状图
dendrogram = sch.dendrogram(sch.linkage(X, method='ward'))

# 模型训练(凝聚式,ward距离)
hc = AgglomerativeClustering(n_clusters=3, linkage='ward')
y_pred = hc.fit_predict(X)

# 可视化
plt.scatter(X[:, 0], X[:, 1], c=y_pred, cmap='viridis')
plt.title("Hierarchical Clustering")
plt.show()

戳下面链接,即可跳转到学习视频教程不是吹!只用3天一口气学完机器学习十大聚类算法——K-Means+层次聚类+DBSCAN等算法,从算法原理到项目实战,太详细了,新手入门必看!深度学习|人工智能https://www.bilibili.com/video/BV1Cf421v7Sy/?spm_id_from=333.1387.upload.video_card.click&vd_source=75de451a527a341260671f8dfa953400

DBSCAN(Density - Based Spatial Clustering of Applications with Noise)

原理:基于密度的空间聚类算法。它定义了一个核心点(在给定半径内包含足够多的邻居点)和边界点。如果一个点是核心点,那么它和它的密度可达点构成一个簇。与 K - 均值不同,DBSCAN 不需要预先指定簇的数量,并且能够发现任意形状的簇,还能识别数据集中的噪声点。例如,在地理信息系统中,用于分析城市、人口等分布情况,能根据人口密度等因素划分不同的聚集区域。

应用场景:在地理数据处理(如城市规划中划分功能区域)、异常检测(将与主要簇距离较远的点视为异常点)等方面很有用。

代码:

from sklearn.cluster import DBSCAN
from sklearn.datasets import make_moons

# 生成非凸数据
X, _ = make_moons(n_samples=200, noise=0.05, random_state=42)

# 模型训练(eps=邻域半径,min_samples=核心点阈值)
dbscan = DBSCAN(eps=0.3, min_samples=4)
y_pred = dbscan.fit_predict(X)

# 可视化(噪声点标记为-1,用黑色表示)
plt.scatter(X[:, 0], X[:, 1], c=y_pred, cmap='viridis')
plt.title("DBSCAN Clustering")
plt.show()

高斯混合模型(Gaussian Mixture Model,GMM)

原理:假设数据是由多个高斯分布混合而成。每个高斯分布有自己的均值、协方差和权重。通过估计这些参数来确定数据的聚类。它使用期望最大化(EM)算法来进行参数估计,在 E 步计算每个数据点属于每个高斯分量的后验概率,在 M 步更新高斯分量的参数。例如,在语音识别中,不同语音可能来自不同的高斯分布,GMM 可以用来对语音信号进行聚类。

应用场景:在语音识别、图像识别等领域用于数据建模和分类,还可用于数据生成,通过学习到的高斯混合模型生成与训练数据相似的数据。

代码:

from sklearn.mixture import GaussianMixture

# 生成数据
X, _ = make_blobs(n_samples=150, centers=3, n_features=2, random_state=42)

# 模型训练
gmm = GaussianMixture(n_components=3, random_state=42)
y_pred = gmm.fit_predict(X)

# 可视化
plt.scatter(X[:, 0], X[:, 1], c=y_pred, cmap='viridis')
plt.title("Gaussian Mixture Model Clustering")
plt.show()

谱聚类(Spectral Clustering)

原理:根据给定的样本数据集定义一个描述成对数据点相似度的亲合矩阵,并且计算矩阵的特征值和特征向量,然后选择合适的特征向量聚类不同的数据点。它对数据分布的适应性强,能够发现非凸形状的簇。例如,对于一些具有复杂形状的数据分布,如互相嵌套的环形数据,谱聚类能够有效地将其划分。

应用场景:在计算机视觉中用于图像分割,能够很好地处理具有复杂形状的物体分割;在生物信息学中,用于分析基因表达数据等复杂的数据结构。

代码

from sklearn.cluster import SpectralClustering

# 生成数据(环形簇)
X, _ = make_circles(n_samples=200, factor=0.5, noise=0.05, random_state=42)

# 模型训练(使用拉普拉斯特征映射)
sc = SpectralClustering(n_clusters=2, affinity='nearest_neighbors')
y_pred = sc.fit_predict(X)

# 可视化
plt.scatter(X[:, 0], X[:, 1], c=y_pred, cmap='viridis')
plt.title("Spectral Clustering")
plt.show()

Mean - Shift 聚类

原理:它是一种基于核密度估计的聚类算法。每个数据点都有一个对应的核函数,通过计算数据点在核函数下的密度梯度,然后沿着密度梯度上升的方向移动数据点,直到收敛。收敛点就是簇的中心,最后将距离较近的收敛点对应的原始数据点划分为一个簇。例如,在目标跟踪场景中,通过跟踪目标的特征点的密度分布来确定目标的位置。

应用场景:在图像和视频处理中的目标跟踪、数据挖掘中的热点区域发现等领域发挥作用。

代码

from sklearn.cluster import MeanShift

# 生成数据
X, _ = make_blobs(n_samples=150, centers=3, n_features=2, random_state=42)

# 模型训练(自动带宽估计)
ms = MeanShift(bandwidth=None)  # 或指定bandwidth参数
y_pred = ms.fit_predict(X)

# 可视化
plt.scatter(X[:, 0], X[:, 1], c=y_pred, cmap='viridis')
plt.title("Mean-Shift Clustering")
plt.show()

Affinity Propagation(AP)聚类

原理:通过数据点之间的消息传递来确定聚类中心。每个数据点都向其他数据点发送吸引信息和归属信息,经过多次迭代后,最终确定出代表聚类中心的数据点和每个数据点所属的簇。这种算法不需要预先指定簇的数量,但计算复杂度相对较高。例如,在社交网络分析中,用于发现社交圈子的中心人物和成员划分。

应用场景:在推荐系统中用于发现相似用户群体,在生物信息学中用于蛋白质相互作用网络的分析等。

代码

from sklearn.cluster import AffinityPropagation

# 生成数据
X, _ = make_blobs(n_samples=100, centers=3, n_features=2, random_state=42)

# 模型训练(阻尼系数damping=0.5-1.0)
ap = AffinityPropagation(damping=0.7, random_state=42)
y_pred = ap.fit_predict(X)

# 可视化(聚类中心用“+”标记)
plt.scatter(X[:, 0], X[:, 1], c=y_pred, cmap='viridis')
plt.scatter(ap.cluster_centers_[:, 0], ap.cluster_centers_[:, 1], s=200, marker='+', c='red')
plt.title("Affinity Propagation Clustering")
plt.show()

BIRCH(Balanced Iterative Reducing and Clustering using Hierarchies)

原理:这是一种综合了层次聚类和基于划分聚类的思想的算法。它构建一个称为 CF - Tree(Clustering Feature Tree)的树状结构来存储数据的聚类特征,包括数据点的数量、线性和以及平方和等信息。通过对 CF - Tree 的操作,可以快速地对数据进行初步聚类,并且可以动态地调整聚类结果。例如,在大规模数据聚类中,BIRCH 能够有效地处理数据,并且可以在一定程度上减少内存消耗。

应用场景:适用于大规模数据集的聚类,如大型电子商务网站对用户交易数据的聚类,用于发现购买行为相似的用户群体。

代码

from sklearn.cluster import Birch

# 生成数据
X, _ = make_blobs(n_samples=1000, centers=3, n_features=2, random_state=42)

# 模型训练(阈值threshold控制叶节点半径)
birch = Birch(n_clusters=3, threshold=0.1)
y_pred = birch.fit_predict(X)

# 可视化
plt.scatter(X[:, 0], X[:, 1], c=y_pred, cmap='viridis')
plt.title("BIRCH Clustering")
plt.show()

OPTICS(Ordering Points To Identify the Clustering Structure)

原理:类似于 DBSCAN,也是基于密度的聚类算法。它通过生成一个排序后的数据集来展示数据的聚类结构,这个排序考虑了数据点的密度可达性。通过分析这个排序,可以得到不同密度的簇以及噪声点。例如,对于具有不同密度区域的数据,OPTICS 能够更好地展示其聚类结构,而不像 DBSCAN 那样可能会因为参数选择不当而丢失一些簇。

应用场景:在探索性数据分析中,用于分析数据的密度分布和聚类结构,尤其是当数据中存在多种密度的簇时。

代码

from sklearn.cluster import OPTICS

# 生成数据(不同密度簇)
X1, _ = make_blobs(n_samples=100, centers=1, n_features=2, cluster_std=0.5, random_state=42)
X2, _ = make_blobs(n_samples=200, centers=1, n_features=2, cluster_std=2.0, random_state=42)
X = np.vstack((X1, X2))

# 模型训练
optics = OPTICS(eps=2.0, min_samples=5)
y_pred = optics.fit_predict(X)

# 可视化
plt.scatter(X[:, 0], X[:, 1], c=y_pred, cmap='viridis')
plt.title("OPTICS Clustering")
plt.show()

模糊 C - 均值聚类(Fuzzy C - Means Clustering)

原理:与 K - 均值聚类不同的是,模糊 C - 均值聚类允许每个数据点以一定的隶属度属于多个簇,而不是像 K - 均值那样明确地属于一个簇。它通过最小化一个目标函数来确定每个数据点对各个簇的隶属度和簇的中心。例如,在气象数据分析中,一个气象站点的数据可能在一定程度上同时属于多个不同天气类型的簇。

应用场景:在具有模糊性的分类问题中,如医学诊断(疾病症状可能同时与多种疾病有一定关联)、模式识别等领域有应用。

代码

import skfuzzy as fuzz

# 生成数据
X, _ = make_blobs(n_samples=150, centers=3, n_features=2, random_state=42)

# 模糊C-均值聚类(c=簇数,m=模糊系数,迭代次数maxiter=100)
cntr, u, u0, d, jm, p, fpc = fuzz.cmeans(
    X.T, c=3, m=2, error=0.005, maxiter=100, init=None
)

# 隶属度最大的簇作为预测结果
y_pred = np.argmax(u, axis=0)

# 可视化
plt.scatter(X[:, 0], X[:, 1], c=y_pred, cmap='viridis')
plt.scatter(cntr[:, 0], cntr[:, 1], s=200, marker='*', c='red')
plt.title("Fuzzy C-Means Clustering")
plt.show()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值