层次聚类是无监督机器学习中一种著名的聚类技术。与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”表示,但在层次聚类中,集合的数量要么是一个,要么类似于数据观测的数量。
这两种聚类技术的另一个区别是,K-means聚类在更大的数据集上比层次聚类更有效。但层次聚类适用于小数据集。
1. 性能:层次聚类在数据观测的形状上表现良好,并返回准确的结果。与K-means聚类不同,这里更好的性能不仅限于数据的球形形状;具有任何值的数据都适用于层次聚类。
2. 易用性:层次聚类易于使用,并提供更好的用户指导和良好的社区支持。有大量内容和良好的文档可供使用,以获得更好的用户体验。
3. 更多方法:有两种方法可以用来训练和测试数据集,即聚合和分裂。因此,如果提供的数据集复杂且难以训练,可以使用另一种方法。
4. 在小数据集上的性能:层次聚类算法在小数据集上有效,并以较低的训练和测试时间返回准确可靠的结果。