层次聚类算法详解

层次聚类是无监督机器学习中一种著名的聚类技术。与K-means和层次聚类相比,层次聚类算法因其后端工作机制而表现出色。本文将讨论层次聚类的类型、工作原理、核心直觉、使用该聚类策略的优缺点,并以一些需要记住的基础知识作为结尾。了解这些概念将有助于理解层次聚类的工作原理,并更有效地回答与层次聚类相关的面试问题。

目录

  • 引言
  • 概述
  • 层次聚类的类型
  • 层次聚类与K-means比较
  • 优点
  • 缺点
  • 结论
  • 常见问题

概述

层次聚类是一种无监督的机器学习聚类策略。与K-means聚类不同,层次聚类使用树状形态对数据集进行分组,并使用树状图来创建聚类的层次结构。在这里,树状图是数据集的树状形态,其中树状图的X轴代表数据集的特征或列,Y轴代表数据观测之间的欧几里得距离。

import scipy.cluster.hierarchy as schs import matplotlib.pyplot as plt plt.figure(figsize=(11,7)) plt.title("树状图") # 假设shc.linkage(data, method='ward')是已经计算好的层次聚类结果 dendrogram = schs.dendrogram(shc.linkage(data, method='ward'))

典型的树状图看起来像这样:

层次聚类的类型

层次聚类有两种类型:聚合聚类和分裂聚类。

在聚合聚类中,每个数据集是一个特定的数据观测和一个集合。基于组之间的距离,相似的集合根据算法迭代后的损失值合并。再次计算损失值,相似的聚类再次合并。这个过程一直持续,直到达到损失的最小值。

import pandas as pd from sklearn.cluster import AgglomerativeClustering # 假设'toy_dataset.csv'是数据文件 data = pd.read_csv('toy_dataset.csv') data.drop(columns=['Illness', 'City', 'Gender'], inplace=True) # 初始化聚合聚类模型 cluster = AgglomerativeClustering(n_clusters=5, affinity='l1', linkage='single') cluster.fit_predict(data)

分裂聚类与聚合聚类相反。整个数据集被视为一个集合,计算损失。根据数据观测之间的欧几里得距离和相似性,在下一次迭代中,整个单一集合被分成多个聚类,因此得名“分裂”。这个过程一直持续,直到达到最小损失值。

虽然在Sklearn中没有实现分裂聚类的方法,但可以使用以下代码手动实现:

import numpy as np import pandas as pd import copy import matplotlib.pyplot as plt from distance_matrix import distanceMatrix class DianaClustering: def __init__(self, datak): self.data = datak self.n_samples, self.n_features = datak.shape def fit(self, no_clusters): self.n_samples, self.n_features = self.data.shape similarity_matrix = distanceMatrix(self.data) clusters = [list(range(self.n_samples))] while True: # 省略了部分代码以节省空间... pass if __name__ == '__main__': data = pd.read_csv('thedata.csv') data = data.drop(columns="Name") data = data.drop(columns="Class") dianak = DianaClustering(data) clusters = dianak.fit(3) print(clusters)

聚类中的损失函数

在大多数聚类技术中,轮廓系数可以用来计算特定聚类算法的损失。使用两个参数来计算轮廓系数:凝聚力和分离度。凝聚力对应于数据中两个观测之间的相似性,其中b是数据中两个观测之间的距离或差异。对于数据集中的每个数据观测,都会计算凝聚力(a)和分离度(b),并仔细考虑数据集中的每个观测。

轮廓系数的公式是:

层次聚类与K-means比较

K-means和层次聚类之间的一个区别是,在K-means聚类中,聚类的数量是预定义的,用“K”表示,但在层次聚类中,集合的数量要么是一个,要么类似于数据观测的数量。

这两种聚类技术的另一个区别是,K-means聚类在更大的数据集上比层次聚类更有效。但层次聚类适用于小数据集。

优点

1. 性能:层次聚类在数据观测的形状上表现良好,并返回准确的结果。与K-means聚类不同,这里更好的性能不仅限于数据的球形形状;具有任何值的数据都适用于层次聚类。

2. 易用性:层次聚类易于使用,并提供更好的用户指导和良好的社区支持。有大量内容和良好的文档可供使用,以获得更好的用户体验。

3. 更多方法:有两种方法可以用来训练和测试数据集,即聚合和分裂。因此,如果提供的数据集复杂且难以训练,可以使用另一种方法。

4. 在小数据集上的性能:层次聚类算法在小数据集上有效,并以较低的训练和测试时间返回准确可靠的结果。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485