机器学习之聚类算法

本文介绍了机器学习中的多种聚类算法,如KMeans、Affinity Propagation、Mean-shift、Spectral Clustering、Hierarchical Clustering、DBSCAN、OPTICS等。其中,KMeans适用于大规模数据,DBSCAN对噪声容忍度高,Spectral Clustering在高维数据中有较好效果。不同的聚类算法有不同的应用场景和优缺点,选择时需考虑数据特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

机器学习之聚类算法

参考链接:

  1. scikit-learn官网 https://scikit-learn.org/stable/modules/classes.html

  2. scikit-learn中文手册https://sklearn.apachecn.org/docs/master/30.html

  3. 分类回归方法介绍https://www.cnblogs.com/qiuyuyu/p/11399697.html

如何选择聚类算法:
如果数据集是高维的 —— 谱聚类(SpectralClustering),它是子空间划分的一种。https://www.cnblogs.com/pinard/p/6235920.html

如果数据是中小规模:
100万以内 —— K_Means
100万以上 —— MiniBatchKMeans(每类抽取一部分样本聚类,精度下降,速度提高)

数据集中有噪声(离群点) —— 基于密度的带有噪声的 DBSCAN 。

如果追求更高的分类准确性,选择谱聚类比K_Means准确性更好。

1. KMeans

KMeans 算法通过把样本分离成 n 个具有相同方差的类的方式来聚集数据,最小化称为 惯量(inertia) 或 簇内平方和(within-cluster sum-of-squares)的标准(criterion)。该算法需要指定簇的数量。它可以很好地扩展到大量样本(large number of samples),并已经被广泛应用于许多不同领域的应用领域。

K-means 通常被称为劳埃德算法(Lloyd’s algorithm)。简而言之,该算法可分为三个步骤。第一步是选择初始质心,最基本的方法是从 X 数据集中选择 k 个样本。初始化完成后,K-means 由接下来两个步骤之间的循环组成。第一步将每个样本分配到其最近的质心。第二步通过取分配给每个先前质心的所有样本的平均值来创建新的质心。计算旧的和新的质心之间的差异,并且算法重复这些最后的两个步骤,直到该值小于阈值。换句话说,算法重复这个步骤,直到质心不再显著移动。

from sklearn.cluster import KMeans
import numpy as np
X = np.array([[1, 2], [1, 4], [1, 0],
              [10, 2], [10, 4], [10, 0]])
kmeans = KMeans(n_clusters=2, random_state=0).fit(X)
kmeans.labels_

kmeans.predict([[0, 0], [12, 3]])

kmeans.cluster_centers_

2. Affinity propagation

AffinityPropagation AP聚类是通过在样本对之间发送消息直到收敛的方式来创建聚类。然后使用少量模范样本作为聚类中心来描述数据集,而这些模范样本可以被认为是最能代表数据集中其它数据的样本。在样本对之间发送的消息表示一个样本作为另一个样本的模范样本的 适合程度,适合程度值在根据通信的反馈不断更新。更新迭代直到收敛,完成聚类中心的选取,因此也给出了最终聚类。Affinity Propagation 算法比较有趣的点是可以根据提供的数据决定聚类的数目。因此有两个比较重要的参数preference, 决定使用多少个模范样本 阻尼因子(damping factor) 减少吸引信息和归属信息以减少更新这些信息时的数据振荡。

AP聚类算法主要的缺点是算法的复杂度. AP聚类算法的时间复杂度是 O(N^2 T), 其中 N 是样本的个数 , T 是收敛之前迭代的次数. 如果使用密集的相似性矩阵空间复杂度是 O(N^2) 如果使用稀疏的相似性矩阵空间复杂度可以降低。这使得AP聚类最适合中小型数据集。

from sklearn.cluster import AffinityPropagation
import numpy as np
X = np.array([[1, 2], [1, 4], [1, 0],
              [4, 2], [4, 4], [4, 0]])
clustering = AffinityPropagation(random_state=5).fit(X)
clustering

clustering.labels_

clustering.predict([[0, 0], [4, 4]])

clustering.cluster_centers_

3. Mean-shift

MeanShift 算法旨在于发现一个样本密度平滑的 blobs 。均值漂移(Mean Shift)算法是基于质心的算法,通过更新质心的候选位置,这些侯选位置通常是所选定区域内点的均值。然后,这些候选位置在后处理阶段被过滤以消除近似重复,从而形成最终质心集合。

算法自动设定聚类的数目,而不是依赖参数 带宽(bandwidth),带宽是决定搜索区域的size的参数。这个参数可以手动设置,但是如果没有设置,可以使用提供的函数 estimate_bandwidth 获取 一个估算值。estimate_bandwidth函数用作于mean-shift算法估计带宽,如果MeanShift函数没有传入bandwidth参数,MeanShift会自动运行estimate_bandwidth

from sklearn.cluster import MeanShift
import numpy as np
X = np.array([[1, 1], [2, 1], [1, 0],
              [4, 7], [3, 5], [3, 6]])
bandwidth=MeanShift.estimate_bandwidth
clustering = MeanShift(bandwidth=2).fit(X)
clustering.labels_

clustering.predict([[0, 0], [5, 5]])

clustering

4. Spectral clustering

SpectralClustering(谱聚类) 是在样本之间进行关联矩阵的低维度嵌入,然后在低维空间中使用 KMeans 算法。如果关联矩阵稀疏并且 pyamg 模块已经被安装,则这是非常有效的。谱聚类 需要指定簇的数量。这个算法适用于簇数量少时,在簇数量多时是不建议使用。

对于两个簇,它解决了相似图形上的 归一化切割(normalised cuts)的凸松弛问题: 将图形切割成两个,使得切割的边缘的权重比每个簇内的边缘的权重小。在图像处理时,这个标准是特别有趣的: 图像的顶点是像素,相似图形的边缘是图像的渐变函数。

from sklearn.cluster import SpectralClustering
import numpy as np
X = np.array([[1, 1], [2, 1], [1, 0],
              [4, 7], [3, 5], [3, 6]])
clustering = SpectralClustering(n_clusters=2,
        assign_labels='discretize',
        random_state=0).fit(X)
clustering.labels_

clustering

5. 层次聚类(Hierarchical clustering)

层次聚类(Hierarchical clustering)代表着一类的聚类算法,这种类别的算法通过不断的合并或者分割内置聚类来构建最终聚类。聚类的层次可以被表示成树(或者树形图(dendrogram))。树根是拥有所有样本的唯一聚类,叶子是仅有一个样本的聚类。请参照 Wikipedia page 查看更多细节。

The AgglomerativeClustering 使用自下而上的方法进行层次聚类:开始是每一个对象是一个聚类, 并且聚类别相继合并在一起。连接标准(linkage criteria 译注: 该词似乎尚未有公认的翻译标准) 决定用于合并策略的度量:

Ward 最小化所有聚类内的平方差总和。这是一种方差最小化(variance-minimizing )的优化方向, 这是与k-means 的目标函数相似的优化方法,但是用 凝聚分层(agglomerative hierarchical)的方法处理。Maximum 或 complete linkage 最小化成对聚类间最远样本距离。Average linkage 最小化成对聚类间平均样本距离值。Single linkage 最小化成对聚类间最近样本距离值。AgglomerativeClustering 在联合使用同一个连接矩阵(connectivity matrix)时,也可以扩大到大量的样本,但是在样本之间没有添加连接约束时,计算代价很大:每步都要考虑所有可能的合并。

AgglomerativeClustering 支持 Ward, single, average, and complete linkage 策略.

ward = cluster.AgglomerativeClustering(
    n_clusters=params['n_clusters'], linkage='ward',
    connectivity=connectivity)

average_linkage = cluster.AgglomerativeClustering(
    linkage="average", affinity="cityblock",
    n_clusters=params['n_clusters'], connectivity=connectivity)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

爱爬山的小python

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

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

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

打赏作者

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

抵扣说明:

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

余额充值