机器学习_聚类算法详解

聚类算法是无监督学习的一种,主要用于将数据集中的样本划分为若干个簇,使得同一簇内的样本具有较高的相似度,而不同簇之间的样本差异较大。以下是几种常见的聚类算法及其详细讲解:

1. K-means 聚类

原理

K-means 是一种迭代优化算法,目标是将数据集分成 K 个簇,每个簇由一个中心点(质心)表示。算法通过最小化样本到质心的距离平方和(即簇内平方误差)来确定最佳簇划分。

步骤:

  1. 随机选择 K 个初始质心。
  2. 分配每个样本到最近的质心,形成 K 个簇。
  3. 计算每个簇的质心(均值)。
  4. 重复步骤 2 和 3,直到质心不再变化或达到最大迭代次数。

损失函数
J = ∑ i = 1 K ∑ x ∈ C i ∥ x − μ i ∥ 2 J = \sum_{i=1}^{K} \sum_{x \in C_i} \|x - \mu_i\|^2 J=i=1KxCixμi2
其中,( C_i ) 是第 i 个簇,( mu_i ) 是第 i 个簇的质心。

使用场景

适用于样本数量大、簇数已知的数据集,如图像压缩、市场细分。

优缺点

优点:

  • 简单易实现
  • 计算速度快

缺点:

  • 对初始质心敏感
  • 需要预定义簇数 K
  • 不适合非凸形状的簇
代码实例
from sklearn.cluster import KMeans
import numpy as np

# 示例数据集(假设数据已准备好)
X = np.array([[1.0, 2.0], [1.5, 1.8], [5.0, 8.0], [8.0, 8.0], [1.0, 0.6], [9.0, 11.0]])

# 模型训练
kmeans = KMeans(n_clusters=2, random_state=0).fit(X)

# 预测簇标签
labels = kmeans.predict(X)
print(labels)

# 输出簇中心
centers = kmeans.cluster_centers_
print(centers)

2. 层次聚类(Hierarchical Clustering)

原理

层次聚类通过构建层次树(dendrogram)来实现对数据的逐层聚类。主要有两种方法:

  • 自底向上(凝聚法,agglomerative):每个样本开始作为一个簇,逐渐合并最近的簇,直到所有样本合并成一个簇。
  • 自顶向下(分裂法,divisive):从一个整体簇开始,逐步分裂成更小的簇,直到每个样本单独成为一个簇。

合并准则(凝聚法常用的距离度量):

  • 最短距离(单链接)
  • 最长距离(完全链接)
  • 平均距离
使用场景

适用于层次结构明显的数据,如基因表达数据、社会网络分析。

优缺点

优点:

  • 不需要预定义簇数
  • 能够发现层次关系

缺点:

  • 计算复杂度高
  • 对噪声和异常值敏感
代码实例
from sklearn.cluster import AgglomerativeClustering
import numpy as np

# 示例数据集(假设数据已准备好)
X = np.array([[1.0, 2.0], [1.5, 1.8], [5.0, 8.0], [8.0, 8.0], [1.0, 0.6], [9.0, 11.0]])

# 模型训练
agg_clustering = AgglomerativeClustering(n_clusters=2).fit(X)

# 预测簇标签
labels = agg_clustering.labels_
print(labels)

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

原理

DBSCAN 是一种基于密度的聚类算法,通过高密度区域形成簇。它能够发现任意形状的簇,并自动识别噪声点。

步骤:

  1. 对于数据集中的每个点,计算其ε-邻域内的点数。
  2. 如果某点的ε-邻域内的点数大于等于最小样本数(minPts),则认为该点是核心点,形成一个簇。
  3. 扩展簇:对每个核心点的ε-邻域内的点重复上述步骤,直到簇不再增长。
  4. 标记所有未分配到任何簇的点为噪声点。
使用场景

适用于噪声较多、簇形状复杂的数据,如地理空间数据、市场分析。

优缺点

优点:

  • 能发现任意形状的簇
  • 自动识别噪声

缺点:

  • 需要预定义参数 ε 和 minPts
  • 对参数敏感
代码实例
from sklearn.cluster import DBSCAN
import numpy as np

# 示例数据集(假设数据已准备好)
X = np.array([[1.0, 2.0], [1.5, 1.8], [5.0, 8.0], [8.0, 8.0], [1.0, 0.6], [9.0, 11.0]])

# 模型训练
dbscan = DBSCAN(eps=1.5, min_samples=2).fit(X)

# 预测簇标签
labels = dbscan.labels_
print(labels)

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

原理

GMM 假设数据是由多个高斯分布组成的混合模型,通过期望最大化(EM)算法估计每个高斯分布的参数,并计算每个样本属于各个高斯分布的概率。

步骤:

  1. 初始化高斯分布的参数(均值、方差、混合系数)。
  2. E步:计算每个样本属于各个高斯分布的后验概率。
  3. M步:根据后验概率更新高斯分布的参数。
  4. 重复 E 步和 M 步,直到参数收敛。
使用场景

适用于数据分布接近高斯分布的情况,如金融数据分析、图像处理。

优缺点

优点:

  • 能处理不同形状和大小的簇
  • 提供概率输出

缺点:

  • 需要预定义簇数
  • 对初始参数敏感
代码实例
from sklearn.mixture import GaussianMixture
import numpy as np

# 示例数据集(假设数据已准备好)
X = np.array([[1.0, 2.0], [1.5, 1.8], [5.0, 8.0], [8.0, 8.0], [1.0, 0.6], [9.0, 11.0]])

# 模型训练
gmm = GaussianMixture(n_components=2, random_state=0).fit(X)

# 预测簇标签
labels = gmm.predict(X)
print(labels)

# 输出高斯分布的参数
print(gmm.means_)
print(gmm.covariances_)

5. Mean Shift 聚类

原理

Mean Shift 是一种基于密度的聚类算法,通过不断移动每个点到其局部密度最大的位置来找到簇的中心。算法通过密度梯度上升(Mean Shift)迭代移动质心,直到收敛。

步骤:

  1. 初始化每个点为质心。
  2. 对每个质心,计算其窗口内的密度中心,并将质心移动到该位置。
  3. 重复步骤 2,直到质心收敛。
使用场景

适用于簇数量未知、密度分布明显的数据,如图像分割、模式识别。

优缺点

优点:

  • 不需要预定义簇数
  • 能发现任意形状的簇

缺点:

  • 计算复杂度高
  • 对带宽参数敏感
代码实例
from sklearn.cluster import MeanShift
import numpy as np

# 示例数据集(假设数据已准备好)
X = np.array([[1.0, 2.0], [1.5, 1.8], [5.0, 8.0], [8.0, 8.0], [1.0, 0.6], [9.0, 11.0]])

# 模型训练
mean_shift = MeanShift().fit(X)

# 预测簇标签
labels = mean_shift.labels_
print(labels)

# 输出簇中心
centers = mean_shift.cluster_centers_
print(centers)

总结
不同的聚类算法有各自的特点和适用场景。在实际应用中,选择适合的聚类算法需要根据数据的特点和具体需求进行权衡,并且可以通过实验和调参来优化聚类效果。

  • 24
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值