另类强特 -- 无监督聚类特征汇总!

文摘   2024-09-19 23:26   上海  


↑↑↑关注后"星标"kaggle竞赛宝典
  kaggle竞赛宝典  
作者:算法进阶

无监督聚类算法汇总!

无监督聚类的特征在很多竞赛中都是极其强的特征,所以聚类算法除了能处理聚类相关的问题还能作为有监督学习的强特。
聚类算法在数据挖掘中很常用,它是将数据集中的对象根据相似性自动分组,形成多个类别或簇,以便更好地理解和分析数据。它的应用非常广泛,比如在市场分析中用于客户细分。


聚类算法按照算法原理,可以大致划分为以下几类,

  1. 基于距离的聚类算法

  • K-Means:将数据点划分为 K 个簇,使得每个点到其对应簇中心的距离最小。
  • k-Medoids:类似于 K-Means,但使用簇内最近点(medoids)作为簇中心,对噪声和异常值有更好的鲁棒性。
  • Fuzzy C-Means (FCM):基于模糊 C-均值算法,每个数据点属于每个簇的模糊程度。
  • C-Means:与 FCM 类似,但更加关注数据点的硬归属。
  • 层次聚类算法

    • Hierarchical Clustering:根据数据点之间的距离构建一个层次结构,可以是树形结构。
    • Agglomerative Clustering:自底向上合并相似的数据点形成簇。
    • BIRCH (Balanced Iterative Reducing and Clustering using Hierarchies):先对数据进行初步聚类,然后进行层次聚类。
  • 基于密度的聚类算法

    • DBSCAN (Density-Based Spatial Clustering of Applications with Noise):基于密度的聚类算法,可以检测到任意形状的簇。
    • OPTICS (Ordering Points To Identify the Clustering Structure):类似于 DBSCAN,但可以更好地处理噪声和异常值。
    • Density-Based Clustering:一个更通用的类别,包括 DBSCAN 和 OPTICS。
  • 基于模型的聚类算法

    • Gaussian Mixture Models (GMM):假设数据由多个高斯分布组成,每个分布对应一个簇。
    • Gaussian Mixture Clustering:类似于 GMM,但更关注聚类。
  • 基于模型的聚类算法(文本聚类)

    • Latent Dirichlet Allocation (LDA):用于文档聚类,将文档表示为单词的主题分布。
    • Latent Semantic Analysis (LSA):用于文档聚类,通过潜在语义分析找到文档之间的相似性。
    • Factor Analysis:用于数据降维,也可以用于聚类。
  • 其他聚类算法

    • Mean-Shift Clustering:基于密度的聚类算法,寻找局部密度峰值作为簇中心。
    • Affinity Propagation:基于相似度的聚类算法,通过传播相似度信息来识别簇。
    • MiniBatchKMeans:K-Means 的一个变种,用于大规模数据集。
    • Spectral Clustering:基于图论的聚类算法,通过谱分解数据点的相似度矩阵。
    • X-Means:类似于 K-Means,但可以动态地调整簇的数量。
    • Self-Organizing Maps (SOM):通过竞争学习算法将数据映射到一个低维空间,用于可视化和高维数据的聚类。
    • k-Prototypes:类似于 k-Means,但用于文本数据,考虑单词的频率和共现性。
    • Clustering Ensembles:结合多个聚类算法的结果,以提高聚类性能。

    K-Means

    聚类算法 K-Means

    背景介绍

    K-Means 是一种无监督学习算法,主要用于将相似的数据点分到同一个组或簇中。它广泛应用于数据挖掘、模式识别和机器学习等领域。K-Means 算法假设数据空间是凸的,并且簇是球形的。

    一句话通俗概括原理

    K-Means 算法通过迭代计算来将数据点分配到 K 个簇中,使得每个簇内的数据点距离簇中心最近。

    算法原理及核心公式

    • 核心思想:选择 K 个初始中心点(通常是随机选择),然后迭代更新这些中心点,直到中心点不再显著变化。

    • 步骤

    1. 随机选择 K 个数据点作为初始聚类中心。
    2. 将每个数据点分配到最近的聚类中心,形成 K 个簇。
    3. 计算每个簇的中心点,即该簇所有数据点的均值。
    4. 重复步骤 2 和 3,直到聚类中心不再改变。
  • 核心公式

    • 聚类分配:对于每个数据点(x),计算其到每个聚类中心的距离,将其分配到距离最近的聚类中心所代表的簇。
    • 簇中心更新:对于每个簇,计算该簇所有数据点的均值,作为新的聚类中心。

    模型训练过程

    1. 初始化:随机选择 K 个数据点作为初始聚类中心。
    2. 分配:将所有数据点分配到最近的聚类中心。
    3. 更新:计算每个簇的中心点。
    4. 重复:重复步骤 2 和 3,直到聚类中心变化很小或达到最大迭代次数。

    模型调优经验

    • 选择 K 值:可以使用肘部法则或轮廓系数来选择合适的 K 值。
    • 初始化中心:使用 K-means++算法来选择初始中心,可以减少陷入局部最优的风险。
    • 处理异常值:异常值可能会影响聚类结果,因此在聚类之前可以考虑去除或处理异常值。

    优缺点

    • 优点
      • 简单易懂,实现简单。
      • 运算速度快,适用于大规模数据集。
      • 对输入数据的规模和维度没有严格要求。
    • 缺点
      • 对异常值敏感。
      • 需要预先指定簇的数量 K。
      • 可能陷入局部最优解。

    应用场景

    • 文本聚类:将文档分组为相似主题。
    • 图像聚类:将图像分组为相似风格或内容。
    • 社交网络分析:将用户分组为相似兴趣或特征。

    Python 示例代码

    from sklearn.cluster import KMeans
    import numpy as np

    # 示例数据
    data = np.array([[12], [14], [10],
                     [102], [104], [100]])

    # 创建KMeans对象
    kmeans = KMeans(n_clusters=2, random_state=0)

    # 拟合模型
    kmeans.fit(data)

    # 输出聚类中心
    print(kmeans.cluster_centers_)

    # 对数据进行聚类
    labels = kmeans.predict(data)

    # 输出每个数据点的簇标签
    print(labels)

    这段代码使用sklearn库中的KMeans类来对示例数据进行聚类,并输出聚类中心和每个数据点的簇标签。

    Hierarchical Clustering

    聚类算法 Hierarchical Clustering

    背景介绍

    Hierarchical Clustering(层次聚类)是一种非监督机器学习算法,它通过将数据点逐步合并成簇,或者将簇逐步分裂成更小的簇,来发现数据中的层次结构。这种方法不依赖于预先指定的簇数,而是根据数据本身的结构来形成簇。

    一句话通俗概括原理

    “就像拼图一样,层次聚类将相似的数据点像拼图一样拼接在一起,形成不同的层级。”

    算法原理及核心公式

    层次聚类主要有两种类型:自下而上的凝聚式(Agglomerative)和自上而下的分裂式(Divisive)。这里以凝聚式为例进行说明:

    1. 初始化:将每个数据点视为一个簇。
    2. 合并:计算最近距离的簇,并将它们合并成一个簇。
    3. 重复:继续上述过程,直到满足停止条件(如达到指定层数或簇数)。

    核心公式:

    • 距离计算:可以使用不同的距离度量,如欧氏距离、曼哈顿距离等。
    • 簇合并:常用的方法有单链接(最近距离)、完全链接(最远距离)、平均链接(簇内点的平均值)等。

    模型训练过程

    1. 选择距离度量方法。
    2. 选择簇合并方法。
    3. 初始化每个数据点为单独的簇。
    4. 计算簇间的距离。
    5. 根据选择的合并方法合并最近的簇。
    6. 重复步骤 4 和 5,直到达到停止条件。

    模型调优经验

    • 距离度量:根据数据特征选择合适的距离度量方法。
    • 簇合并方法:不同的合并方法会影响聚类结果,可以尝试不同的方法比较效果。
    • 停止条件:根据数据量和业务需求设置合适的停止条件。

    优缺点

    优点

    • 不需要预先指定簇的数量。
    • 能够发现数据的层次结构。

    缺点

    • 聚类结果受距离度量方法和簇合并方法的影响较大。
    • 对于大规模数据集,计算成本较高。

    应用场景

    • 社交网络分析,发现朋友之间的关系。
    • 市场细分,识别潜在客户群体。
    • 文本聚类,分析文档主题。

    Python 示例代码

    from scipy.cluster.hierarchy import dendrogram, linkage
    import matplotlib.pyplot as plt

    # 示例数据
    data = [[12], [14], [10],
            [102], [104], [100]]

    # 使用凝聚式层次聚类
    linked = linkage(data, method='ward', metric='euclidean')

    # 绘制树状图
    dendrogram(linked)
    plt.show()

    这段代码使用了scipy库中的linkagedendrogram函数来执行层次聚类并绘制树状图。data是示例数据,method='ward'指定了簇合并方法为 Ward 方法,metric='euclidean'指定了距离度量方法为欧氏距离。

    DBSCAN

    背景介绍

    DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一种基于密度的聚类算法。它通过分析数据点之间的密度分布来进行聚类,能够发现任意形状的簇,并且可以处理噪声和异常值。

    一句话通俗概括原理

    DBSCAN 通过寻找高密度区域来定义簇,并以此将数据点划分到簇中。

    算法原理及核心公式

    核心概念:

    1. 核心点:一个点如果至少有 MinPts 个邻居,那么它就是一个核心点。
    2. 边界点:如果一个点不是核心点,但至少有 MinPts 个邻居中的部分是核心点,那么它是一个边界点。
    3. 噪声点:如果一个点不是核心点,且其邻居数量小于 MinPts,那么它是一个噪声点。

    核心公式:

    DBSCAN 不需要预先指定簇的数量,它通过以下公式来计算:

    • Eps:邻域半径
    • MinPts:邻域内的最小点数

    模型训练过程

    1. 初始化:设置邻域半径 Eps 和最小点数 MinPts。
    2. 核心点检测:对于数据集中的每个点,检查其 Eps 邻域内是否有 MinPts 个点。如果是,则该点为核心点。
    3. 簇扩展:从核心点开始,递归地将其邻居加入簇中。
    4. 重复:重复步骤 2 和 3,直到所有点都被处理。

    模型调优经验

    1. MinPts:通常需要根据数据的分布来设定。如果簇的大小变化较大,可以尝试多个 MinPts 值。
    2. Eps:可以手动设定,或者使用 KNN 算法来估计。

    优缺点

    优点:

    • 能够发现任意形状的簇。
    • 对噪声和异常值有很好的鲁棒性。
    • 不需要预先指定簇的数量。

    缺点:

    • 需要设定参数 MinPts 和 Eps,这可能会很困难。
    • 对于高维数据,性能可能会下降。

    应用场景

    • 数据挖掘
    • 生物信息学
    • 图像分割
    • 地理信息系统

    Python 示例代码

    from sklearn.cluster import DBSCAN
    import numpy as np

    # 生成一些示例数据
    X = np.array([[12], [22], [23], [87], [88], [2580]])

    # 创建DBSCAN对象
    db = DBSCAN(eps=0.3, min_samples=2)

    # 拟合模型
    db.fit(X)

    # 获取簇标签
    labels = db.labels_

    # 打印簇标签
    print(labels)

    在这个示例中,我们使用sklearn库中的DBSCAN类来聚类数据。eps参数设置为 0.3,min_samples参数设置为 2。运行代码后,我们可以看到每个点的簇标签。

    Gaussian Mixture Models (GMM)

    背景介绍

    Gaussian Mixture Models(GMM)是一种概率模型,它将数据集视为由多个高斯分布组成的混合体。这种模型在机器学习和数据挖掘中广泛应用于无监督学习,特别是在聚类分析中。它通过将数据集划分为不同的簇,帮助用户发现数据中的潜在结构。

    一句话通俗概括原理

    GMM 是一种假设数据由多个高斯分布混合而成的模型,通过最大化似然函数来估计这些高斯分布的参数,从而对数据进行聚类。

    算法原理及核心公式

    核心公式

    GMM 的核心公式是高斯分布的概率密度函数(PDF)和最大化似然函数。

    1. 高斯分布 PDF

    其中:

    • ( x ) 是数据点。
    • ( \mu ) 是均值向量。
    • ( \sigma^2 ) 是协方差矩阵。
    1. 似然函数

    其中:

    • ( \theta ) 是模型参数,包括均值向量、协方差矩阵和每个高斯分布的权重。
    • ( N ) 是数据点的总数。
    • ( P(x_i|\mu, \sigma^2, \pi) ) 是每个数据点的高斯分布 PDF。

    算法流程

    1. 初始化:随机选择 K 个均值向量作为初始均值。
    2. 计算权重:对于每个数据点,计算其属于每个高斯分布的概率,并归一化。
    3. 更新均值和协方差:使用最大似然估计法更新每个高斯分布的均值和协方差。
    4. 迭代:重复步骤 2 和 3,直到收敛。

    模型训练过程

    1. 选择合适的 K 值(簇的数量)。
    2. 使用 EM 算法进行训练,包括以下步骤:
    • E 步:计算每个数据点属于每个簇的概率。
    • M 步:使用这些概率更新均值、协方差和权重。

    模型调优经验

    1. 选择合适的 K 值:可以使用肘部法则或轮廓系数等方法确定最佳的 K 值。
    2. 初始化:尝试不同的初始化方法,如 K-means 初始化。
    3. 选择合适的算法:使用快速 GMM 或 Gaussian Processes 等算法。

    优缺点

    优点

    1. 可以处理非球形簇。
    2. 可以处理混合分布的数据。
    3. 易于解释。

    缺点

    1. 需要选择 K 值。
    2. 对于小样本数据,性能可能较差。
    3. 需要计算协方差矩阵。

    应用场景

    1. 聚类分析。
    2. 数据降维。
    3. 异常检测。

    Python 示例代码

    from sklearn.mixture import GaussianMixture
    import numpy as np

    # 生成样本数据
    data = np.random.randn(1002)

    # 创建GMM模型,设置簇的数量为2
    gmm = GaussianMixture(n_components=2)

    # 训练模型
    gmm.fit(data)

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

    请注意,在实际应用中,您可能需要调整 GMM 模型的参数,如权重、协方差矩阵等。

    Fuzzy C-Means

    背景介绍

    Fuzzy C-Means (FCM) 是一种用于数据聚类的算法,由 Bezdek 在 1981 年提出。与传统的硬聚类算法(如 K-means)不同,FCM 允许一个样本可以同时属于多个类别,即所谓的模糊聚类。这种模糊性使得 FCM 在处理边界模糊的数据时更加有效。

    一句话通俗概括原理

    FCM 通过调整样本到各个类别的隶属度,寻找一个能够使样本之间的差异最小化、类别内距离最小化的聚类中心。

    算法原理及核心公式

    FCM 的核心思想是通过优化隶属度矩阵和聚类中心,使得样本之间的差异最小化。以下是核心公式:

    1. 隶属度矩阵 (U \in R^{n \times c}),其中 (n) 是样本数量,(c) 是聚类数。(U_{ij}) 表示第 (i) 个样本属于第 (j) 个聚类的隶属度。

    2. 聚类中心 (V \in R^{c \times m}),其中 (m) 是特征维度。(V_{jk}) 表示第 (j) 个聚类在第 (k) 个特征上的值。

    3. 参数 (m):称为模糊指数,控制聚类的紧密度。

    核心公式如下:

    • 隶属度矩阵 (U) 的更新公式:[ U*{ij} = \left(\frac{\sum*{k=1}^m (V*{jk} - V*{ik})^{2-m}}{\sum*{k=1}^m (V*{jk} - V_{ik})^{2-m}}\right)^{\frac{1}{m-1}} ]
    • 聚类中心 (V) 的更新公式:[ V*{jk} = \frac{\sum*{i=1}^n U*{ij}^m x_i}{\sum*{i=1}^n U_{ij}^m} ]

    模型训练过程

    1. 初始化隶属度矩阵 (U) 和聚类中心 (V)。
    2. 使用上述公式更新 (U) 和 (V)。
    3. 重复步骤 2,直到满足停止条件(如迭代次数或目标函数变化小于阈值)。

    模型调优经验

    1. 选择合适的聚类数 (c)。
    2. 选择合适的模糊指数 (m),通常在 1.5 到 2.5 之间。
    3. 迭代次数或目标函数变化阈值。

    优缺点

    优点

    • 能够处理模糊聚类问题。
    • 对噪声和异常值有较好的鲁棒性。

    缺点

    • 对于聚类数 (c) 的选择敏感。
    • 需要确定模糊指数 (m)。

    应用场景

    • 数据挖掘
    • 生物信息学
    • 图像处理
    • 机器学习中的特征选择

    Python 示例代码

    import numpy as np
    from sklearn.cluster import FuzzyCMeans

    # 假设X是数据集,c是聚类数,m是模糊指数
    X = np.array([[12], [14], [10],
                  [102], [104], [100]])
    c = 2
    m = 2.5

    fcm = FuzzyCMeans(n_clusters=c, init='cmeans++', max_iter=100, m=m)
    fcm.fit(X)

    # 输出聚类结果
    labels = fcm.labels_
    centers = fcm.cluster_centers_

    以上是对 Fuzzy C-Means 算法的详细介绍,希望对初学者有所帮助。

    Mean-Shift Clustering

    背景介绍

    Mean-Shift Clustering 是一种基于密度度的聚类算法,主要用于数据挖掘和图像分析领域。它通过迭代移动聚类中心到高密度区域,从而将相似的数据点聚在一起。

    一句话通俗概括原理

    Mean-Shift Clustering 算法就像一个移动的“平均器”,它会不断移动到数据集中密度最高的地方,直到没有更多的移动空间。

    算法原理及核心公式

    1. 核心思想:将聚类中心移动到邻域内具有最高密度的位置。
    2. 核心公式
      其中,neighborhood 是聚类中心当前邻域,w(i) 是基于高斯核的权重函数。

    模型训练过程

    1. 初始化聚类中心。
    2. 对每个聚类中心,计算其邻域内所有点的加权平均。
    3. 将聚类中心移动到新的位置。
    4. 重复步骤 2 和 3,直到聚类中心不再移动或达到预设的迭代次数。

    模型调优经验

    1. 邻域大小:邻域大小对聚类结果影响很大。通常,邻域大小需要根据数据集的特性进行调整。
    2. 带宽:带宽决定了高斯核的形状。较小的带宽会导致更紧密的聚类,而较大的带宽会导致更松散的聚类。
    3. 初始化聚类中心:聚类中心的初始化方法对聚类结果有较大影响。可以采用随机初始化或基于某种分布的初始化。

    优缺点

    优点

    1. 对噪声数据鲁棒性强。
    2. 对数据分布没有严格的假设。
    3. 可以处理高维数据。

    缺点

    1. 计算量大,特别是对于大数据集。
    2. 邻域大小和带宽的选择对聚类结果有较大影响。

    应用场景

    1. 图像分割。
    2. 时间序列分析。
    3. 文本聚类。

    Python 示例代码

    import numpy as np
    from sklearn.cluster import MeanShift, estimate_bandwidth

    # 生成一些示例数据
    data = np.random.rand(1002)

    # 估计带宽
    bandwidth = estimate_bandwidth(data, quantile=0.3, n_samples=data.shape[0])

    # 创建MeanShift聚类器
    ms = MeanShift(bandwidth=bandwidth, bin_seeding=True)

    # 拟合数据
    ms.fit(data)

    # 获取聚类标签
    labels = ms.labels_

    # 获取聚类中心
    centers = ms.cluster_centers_

    以上代码演示了如何使用sklearn库中的MeanShift函数对数据进行聚类。注意,这里使用了estimate_bandwidth函数来自动估计带宽,你也可以手动设置带宽。

    Spectral Clustering

    背景介绍

    Spectral Clustering 是一种基于图论和谱分解的聚类算法。它起源于图像处理领域,后来被广泛应用于数据挖掘、机器学习等多个领域。该算法的基本思想是通过将数据点视为图上的节点,通过构建相似度矩阵,然后将相似度矩阵进行谱分解,最后根据分解得到的特征向量进行聚类。

    一句话通俗概括原理

    Spectral Clustering 通过将数据映射到一个低维空间,然后在这个空间中根据数据的相似性进行聚类。

    算法原理及核心公式

    1. 相似度矩阵构建:首先,根据数据点之间的相似度构建一个相似度矩阵 ( W )。如果 ( W*{ij} ) 表示第 ( i ) 个点和第 ( j ) 个点的相似度,则 ( W*{ij} ) 的取值范围通常在 0 到 1 之间。

    2. 归一化:对相似度矩阵进行归一化处理,得到归一化矩阵 ( D ),其中 ( D*{ii} = 0 ),( D*{ij} = \frac{1}{\sqrt{D*{ii} + D*{jj}}} )。

    3. 拉普拉斯矩阵构建:构建拉普拉斯矩阵 ( L = D - W )。

    4. 谱分解:对拉普拉斯矩阵进行谱分解,得到特征值和特征向量。( L = UDU^T ),其中 ( D ) 是对角矩阵,( U ) 是特征向量矩阵。

    5. 聚类:根据特征向量进行聚类。通常取前 ( k ) 个最大的特征值对应的特征向量,然后将这些向量进行降维,最后根据这些降维后的向量进行 K-means 聚类。

    模型训练过程

    1. 构建相似度矩阵。
    2. 归一化相似度矩阵。
    3. 构建拉普拉斯矩阵。
    4. 进行谱分解。
    5. 根据特征向量进行聚类。

    模型调优经验

    1. 相似度度量:选择合适的相似度度量方法,如余弦相似度、高斯核等。
    2. 邻域大小:根据数据的分布调整邻域大小。
    3. 特征选择:根据领域知识或实验结果选择合适的特征向量数量。

    优缺点

    优点

    • 对于非凸数据集也能有效聚类。
    • 对初始聚类中心的选择不敏感。

    缺点

    • 需要事先指定聚类数量 ( k )。
    • 对噪声数据敏感。

    应用场景

    • 图像分割
    • 文本聚类
    • 生物信息学中的基因表达数据分析

    Python 示例代码

    import numpy as np
    import matplotlib.pyplot as plt
    from sklearn.cluster import SpectralClustering
    from sklearn.preprocessing import StandardScaler

    # 生成示例数据
    np.random.seed(42)
    X = np.random.rand(1002)
    X[0:100] += 1
    X[20:301] += 1
    X[40:500] -= 2
    X[60:701] -= 1

    # 归一化数据
    X = StandardScaler().fit_transform(X)

    # 谱聚类
    sc = SpectralClustering(n_clusters=4, affinity='nearest_neighbors', random_state=42)
    sc.fit(X)

    # 绘制聚类结果
    plt.scatter(X[:, 0], X[:, 1], c=sc.labels_)
    plt.title('Spectral Clustering')
    plt.show()

    这段代码使用sklearn库中的SpectralClustering类进行谱聚类,并使用StandardScaler对数据进行归一化处理。最后,使用matplotlib绘制聚类结果。

    Agglomerative Clustering

    背景介绍

    聚类算法是数据挖掘和机器学习领域的重要方法之一,旨在将相似的数据点归为一组。Agglomerative Clustering(层次聚类)是一种自底向上的聚类算法,通过合并相似度高的数据点,逐步形成树状结构(称为聚类树或 Dendrogram)。

    一句话通俗概括原理

    层次聚类就像将相似的小球逐渐合并成更大的球,最终形成一个大球团。

    算法原理及核心公式

    原理:从每个数据点开始,逐步合并距离最近的数据点,直到达到设定的聚类数。

    核心公式

    1. 初始时,每个数据点都是一个单独的簇。
    2. 计算所有簇之间的距离,选择最近的两个簇合并成一个簇。
    3. 重复步骤 2,直到达到设定的聚类数。

    模型训练过程

    1. 初始化:每个数据点为一个簇。
    2. 计算距离:计算当前簇之间的距离。
    3. 合并簇:选择距离最近的两个簇合并成一个簇。
    4. 重复步骤 2 和 3,直到达到设定的聚类数。

    模型调优经验

    1. 聚类数的选择:可以通过观察 Dendrogram 来确定合适的聚类数。
    2. 距离度量:可以选择不同的距离度量方法,如欧氏距离、曼哈顿距离等。
    3. 聚类方法:可以选择不同的聚类方法,如单链接、完全链接、平均链接等。

    优缺点

    优点

    1. 不需要预先指定聚类数。
    2. 可以直观地通过 Dendrogram 观察聚类过程。

    缺点

    1. 计算复杂度较高。
    2. 对噪声数据敏感。

    应用场景

    1. 市场细分。
    2. 社交网络分析。
    3. 文本聚类。

    Python 示例代码

    import numpy as np
    from scipy.cluster.hierarchy import dendrogram, linkage
    import matplotlib.pyplot as plt

    # 生成示例数据
    data = np.array([[12], [14], [10],
                     [102], [104], [100]])

    # 计算距离
    Z = linkage(data, 'ward')

    # 绘制Dendrogram
    dendrogram(Z)
    plt.show()

    在这个示例中,我们首先生成了一个包含三个簇的数据集,然后使用 Ward 方法进行层次聚类,并绘制了 Dendrogram。

    MiniBatch K-Means

    方法

    背景介绍

    K-Means 聚类算法是一种经典的聚类算法,它通过将数据集划分成 K 个簇来发现数据中的隐含结构。MiniBatch K-Means 是 K-Means 的一个变种,它在每次迭代时只使用一小部分数据(称为 mini-batch)来更新簇中心,从而提高算法的效率。

    一句话通俗概括原理

    MiniBatch K-Means 算法通过不断迭代优化簇中心,将数据划分成 K 个簇,使得每个簇内的数据点彼此相似,而簇与簇之间的数据点彼此不同。

    算法原理及核心公式

    1. 初始化:随机选择 K 个数据点作为初始簇中心。
    2. 分配簇:将每个数据点分配到最近的簇中心。
    3. 更新簇中心:计算每个簇内所有数据点的均值,作为新的簇中心。
    4. 重复步骤 2 和 3,直到簇中心不再显著变化。

    核心公式:

    • 簇中心更新:c_new = (1/n) * Σ(x_i)

    其中,c_new 是新的簇中心,x_i 是簇内的数据点,n 是簇内数据点的数量。

    模型训练过程

    1. 初始化簇中心。
    2. 将数据点分配到最近的簇中心。
    3. 更新簇中心。
    4. 重复步骤 2 和 3,直到收敛。

    模型调优经验

    1. 选择合适的 K 值:可以使用肘部法则或轮廓系数来确定最佳 K 值。
    2. 使用较大的 mini-batch 大小:可以提高算法的稳定性,但过大的 mini-batch 大小可能导致过拟合。
    3. 调整学习率:适当的调整学习率可以提高算法的收敛速度。

    优缺点

    优点

    • 简单易实现,计算效率高。
    • 对噪声和异常值不敏感。

    缺点

    • 对 K 值的选择敏感。
    • 可能陷入局部最优解。

    应用场景

    • 数据挖掘:如客户细分、文本聚类等。
    • 图像处理:如图像分割、目标检测等。

    Python 示例代码

    import numpy as np

    def kmeans(data, k):
        # 初始化簇中心
        centroids = data[np.random.choice(data.shape[0], k, replace=False)]

        # 训练模型
        for _ in range(100):
            # 分配簇
            clusters = []
            for i in range(k):
                cluster = []
                for j in range(data.shape[0]):
                    if np.linalg.norm(data[j] - centroids[i]) < np.linalg.norm(data[j] - centroids[(i+1)%k]):
                        cluster.append(j)
                clusters.append(cluster)

            # 更新簇中心
            new_centroids = []
            for i in range(k):
                new_centroids.append(np.mean(data[clusters[i]], axis=0))
            centroids = np.array(new_centroids)

        return centroids

    # 示例数据
    data = np.array([[12], [14], [10],
                      [102], [104], [100]])

    # 训练模型
    k = 2
    centroids = kmeans(data, k)

    # 打印结果
    print("簇中心:", centroids)

    这个示例代码使用了简单的 K-Means 算法,将数据划分为 2 个簇。在实际应用中,您可能需要根据具体问题调整算法参数和实现细节。

    DBSCAN variants

    背景介绍

    DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一种基于密度的聚类算法,它通过分析数据点之间的密度关系来进行聚类。DBSCAN 变种是在 DBSCAN 基础上进行改进的算法,以解决其在处理高维数据和噪声数据时的局限性。

    一句话通俗概括原理

    DBSCAN 通过寻找密度较高的区域来识别聚类,将低密度区域视为噪声。

    算法原理及核心公式

    原理

    1. 核心点:如果一个点周围存在足够多的点(至少为 MinPts),则该点为核心点。
    2. 邻域:以核心点为中心,以 ε 为半径的球体内包含的点集合为邻域。
    3. 聚类:连接核心点形成聚类。

    核心公式

    • MinPts:最小邻域点数。
    • ε:邻域半径。

    模型训练过程

    1. 初始化:设置 MinPts 和 ε。
    2. 遍历数据点
    • 如果是核心点,则创建新的聚类。
    • 如果不是核心点,则将其归入最近的核心点所属的聚类。
  • 处理噪声点:将没有归入任何聚类的点视为噪声。
  • 模型调优经验

    1. MinPts:根据数据集的特点进行调整,通常从较小的数值开始,逐渐增加。
    2. ε:根据数据集的维度和分布进行调整,可以使用肘部法则进行选择。

    优缺点

    优点

    • 对噪声和异常值不敏感。
    • 可以发现任意形状的聚类。
    • 不需要预先指定聚类数量。

    缺点

    • 调参较为复杂。
    • 在高维数据上性能可能下降。

    应用场景

    • 数据挖掘:识别数据集中的异常值和聚类。
    • 机器学习:特征选择和降维。
    • 图像处理:图像分割和目标检测。

    Python 示例代码

    from sklearn.cluster import DBSCAN
    import numpy as np

    # 创建示例数据
    data = np.array([[12], [22], [23], [87], [88], [2580]])

    # 创建DBSCAN对象
    dbscan = DBSCAN(eps=0.3, min_samples=2)

    # 模型训练
    dbscan.fit(data)

    # 输出聚类结果
    print("Cluster labels:", dbscan.labels_)

    kaggle竞赛宝典
    数据竞赛Top方案,竞赛黑科技,竞赛到入职的一些感想。
     最新文章