📜  机器学习中的层次聚类(1)

📅  最后修改于: 2023-12-03 15:26:32.980000             🧑  作者: Mango

机器学习中的层次聚类

层次聚类(hierarchical clustering)是机器学习中一种常见的聚类算法,它的目标是将一组数据分成若干个类别,让同一类别的数据尽可能相似,不同类别的数据尽可能不同。

基本思路

层次聚类的基本思路是不断地将数据从上往下划分成若干个子集,直到每个子集只包含一个数据。这个过程可以用一棵树来表示,树的每个节点代表一个子集,可以是单个数据,也可以是多个数据的聚合。树的边则表示子集之间的相似度,通常使用距离来度量相似度。因此,层次聚类的核心任务是计算两个子集之间的距离。

分类

层次聚类可分为两大类:凝聚型和分裂型。

  • 凝聚型聚类:从上往下不断将数据聚合成更大的组别,直到所有数据最终都被聚合在一起,形成一棵树状结构。这种聚类方法比较适合数据分散的情况。

  • 分裂型聚类:从上往下将所有数据包含的最小子集不断分裂成更小的组别,直到所有数据都被分裂成单独的一组。这种聚类方法比较适合聚类结果数已知或者固定的情况。

实现

对于凝聚型聚类,一般采用自下而上的聚类方法,即先将每个数据单独分为一组,然后一步步将这些组合并成更大的组,直到所有数据最终都被合并到同一个组里。

以下是一段采用Python实现的层次聚类代码片段。

import numpy as np
from scipy.spatial.distance import pdist, squareform

def hierarchical_clustering(X):
    """
    层次聚类算法实现
    :param X: 输入数据(numpy数组)
    :return: 聚类树(ndarray)和聚类标签(ndarray)
    """
    # 计算距离矩阵,并转换成方阵
    D = squareform(pdist(X))
    # 初始化一个聚类数组,每个点都是一个聚类
    clusters = np.arange(len(X)).reshape(-1, 1)
    # 构造一个列表,用来存储聚类过程中的距离和组别信息
    linkage_list = []
    # 迭代合并聚类
    while len(clusters) > 1:
        # 计算当前状态下距离最小的两个聚类
        i, j = np.unravel_index(np.argmin(D), D.shape)
        # 记录两个聚类之间的距离和组别信息
        linkage_list.append([i, j, D[i, j], len(clusters)])
        # 合并这两个聚类
        clusters[i] = np.hstack((clusters[i], clusters[j]))
        clusters = np.delete(clusters, j, axis=0)
        # 更新距离矩阵
        D = np.delete(D, j, axis=0)
        D = np.delete(D, j, axis=1)
        new_row = np.min((D[i], D[j]), axis=0)
        D[i] = new_row
        D[:, i] = new_row
    # 将聚类信息转换成标签
    labels = np.zeros(len(X))
    for i, cluster in enumerate(clusters):
        labels[cluster] = i
    return np.array(linkage_list), labels

该代码实现了一个基本的层次聚类算法,输入为原始数据矩阵X,输出为聚类树和聚类标签。

总结

层次聚类的核心任务是计算两个子集之间的距离,常用的距离度量包括欧氏距离、曼哈顿距离、余弦相似度等。另外,层次聚类的聚类结果通常需要通过树形图来展示,树形图的横轴表示数据,纵轴表示距离,结点高度表示距离。层次聚类是机器学习中非常常用的聚类算法,应用广泛。