聚类--凝聚聚类

1、什么是凝聚聚类

凝聚聚类(agglomerative clustering)指的是许多基于相同原则构建的聚类算法,

这一原则是:

  • 算法首先声明每个点是自己的簇,然后合并两个最相似的簇,直到满足某种停止准则为止。

    • scikit-learn 中实现的停止准则是簇的个数,因此相似的簇被合并,直到仅剩下指定个数的簇。
  • 还有一些链接(linkage)准则,

    • 规定如何度量“最相似的簇”。这种度量总是定义在两个现有的簇之间。

    • scikit-learn 提供了下面三种链接准则:

      • ward,ward为默认的选项。word挑选两个簇来合并,使得所有簇的方差增加最小。这通常会得到大小差不多相同的簇。

      • average,将簇中所有点之间平均距离最小的两个簇合并。

      • complete,将簇中点之间最大距离最小的两个簇合并。

      • ward 适用于大多数数据集。如果簇中的成员个数非常不同(比如其中一个比其他所有都大得多),那么 average 或 complete 可能效果更好。

📣

  • 最开始时,每个点各成一簇 。然后在每一步中,距离相聚最近的两个簇被合并。
  • 在上图所示过程中,前四步为两个单点簇合成为两点簇。而在第五步,有一个两点簇被扩展到三点簇。
  • 一直到了第九步,只剩下三个簇。由于我们指定寻找三个簇,因此算法结束。

2、应用于模拟数据集

  from sklearn.cluster import AgglomerativeClustering

  X, y = make_blobs(random_state=1)

  agg = AgglomerativeClustering(n_clusters=3)
  y_pred = agg.fit_predict(X)

  mglearn.discrete_scatter(X[:,0],X[:,1],y_pred)
  plt.xlabel("Feature 0")
  plt.ylabel("Feature 1")

📣

  • 对于这个简单的数据集,算法完美地完成了聚类。

  • 虽然说凝聚聚类的scikit-learn实现,需要指定希望算法找到的簇的个数,但凝聚聚类方法为选择正确的个数提供了一些帮助

3、层次聚类与树状图

3.1层次聚类

凝聚聚类生成了所谓的层次聚类(hierarchical clustering)。

  • 聚类过程迭代进行,每个点都从一个单点簇变为属于最终的某个簇
  • 每个中间步骤都提供了数据的一种聚类(簇的个数也不相同)。

有时候,同时查看所有可能的聚类是有帮助的。

下图叠加显示了本文最开始例子的所有可能的聚类,有助于深入了解每个簇如何分解为较小的簇:

📣

虽然这种可视化为层次聚类提供了非常详细的视图,但它依赖于数据的二维性质,因此不能用于具有两个以上特征的数据集。
但还有另一个将层次聚类可视化的工具,叫作树状图 (dendrogram),它可以处理多维数据集。

3.2树状图

将层次聚类可视化的工具:树状图 (dendrogram),它可以处理多维数据集

  #树状图

  from scipy.cluster.hierarchy import dendrogram,ward

  X, y = make_blobs(n_samples=12,random_state=0)

  #用ward()会返回一个链接数组,该数组包含了簇之间的距离
  linkage_array = ward(X)

  dendrogram(linkage_array)

📣

①树状图在底部显示数据点(编号从 0 到 11)。然后以这些点(表示单点簇)作为叶节点绘制一棵树,每合并两个簇就添加一个新的父节点。

  • 从下往上看,数据点 1 和 4 首先被合并。
  • 接下来,点 6 和 9 被 合并为一个簇,以此类推。

②在顶层有两个分支,一个由点 11、0、5、10、7、6 和 9 组成, 另一个由点 1、4、3、2 和 8 组成。

  • 这对应于图中左侧两个最大的簇。

③树状图的 y 轴不仅说明凝聚算法中两个簇何时合并,每个分支的长度还表示被合并的簇之间的距离。

4、参考文献

《Python机器学习基础教程》P140-P143

### 关于聚类算法的实现步骤与错误排查 #### 实现步骤 在实际应用中,聚类算法的选择取决于数据特性和需求。以下是基于层次聚类和DBSCAN两种常见算法的具体实现步骤: 1. **数据预处理** 数据清洗是任何机器学习任务的基础。对于报警日志中的关键特征(如`Server Room`, `Error Source`, `Environment`, `Position`, 和`Summary`),需要进行标准化和编码操作[^2]。例如,字符串类型的字段可以通过独热编码(One-Hot Encoding)或词嵌入技术转换为数值型表示。 2. **选择合适的距离度量** 层次聚类依赖于样本之间的相似性计算,因此需选择适合的距离度量方式。常见的有欧氏距离、曼哈顿距离等。如果数据是非连续变量,则可考虑Jaccard系数或其他离散空间上的距离函数[^1]。 3. **执行聚类过程** 对于层次聚类,可以选择自底向上的凝聚法或者自顶而下的分裂法来构建树状图结构;而对于密度基的空间聚类(DBSCAN),则要设定两个重要参数:邻域半径ε(epsilon)和最小点数MinPts。这些超参直接影响最终形成的簇质量及其边界定义。 4. **评估模型性能** 使用内部指标如轮廓系数(Silhouette Coefficient)评价各组紧凑程度与分离情况;外部验证可通过对比真实标签来进行准确性测量。当面对无监督场景时,更多依靠领域专家的知识去解读结果合理性[^3]。 5. **优化调整** 如果初始运行效果不佳,应重新审视输入表征是否充分表达了潜在模式,并尝试不同的初始化策略或是引入降维手段减少维度灾难带来的干扰效应。 #### 错误排查指南 针对可能出现的问题提供如下解决方案: - 若发现某些孤立点未被正确分类到任一类别里,这可能是由于所选阈值过严所致。适当放宽条件或将此类观测单独列为新群集。 - 当遇到内存溢出状况时,考虑到大型矩阵运算消耗资源巨大,建议采用近似最近邻居搜索库ANNoy/Faiss替代传统暴力枚举方法降低复杂度。 - 面对难以解释的结果集合形态怪异现象,检查原始分布特性是否存在明显偏斜或多模态趋势影响了常规假设成立前提。 ```python from sklearn.cluster import DBSCAN import numpy as np # 假设X是我们经过预处理后的特征矩阵 db = DBSCAN(eps=0.5, min_samples=5).fit(X) labels = db.labels_ n_clusters_ = len(set(labels)) - (1 if -1 in labels else 0) print(f'Estimated number of clusters: {n_clusters_}') ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值