Statistical-Learning-Method_Code中的聚类算法实践:从层次聚类到K-means

Statistical-Learning-Method_Code中的聚类算法实践:从层次聚类到K-means

你是否在面对复杂数据时难以找到合适的分类方法?是否尝试过多种聚类算法却无法理解其核心差异?本文将带你深入剖析Statistical-Learning-Method_Code项目中的两种经典聚类算法实现,通过实际代码和案例对比,让你在30分钟内掌握层次聚类与K-means的选择策略。读完本文你将获得:

  • 层次聚类的凝聚式实现原理及可视化方法
  • K-means算法的迭代优化过程解析
  • 两种算法在鸢尾花数据集上的性能对比
  • 基于项目代码的聚类任务快速上手指南

项目算法库概览

Statistical-Learning-Method_Code项目完整实现了李航《统计学习方法》中的全部算法,涵盖监督学习、无监督学习、降维等多个领域。聚类算法作为无监督学习的核心技术,在项目中通过两个独立模块实现:

两类算法均支持从CSV文件加载数据,提供标准化预处理,并包含Adjusted Rand Index评估函数。项目同时提供Jupyter Notebook版本(Clustering/Hierachical_Clustering/Hierachical_Clustering.ipynb),方便用户进行交互式学习和参数调优。

层次聚类:凝聚式聚类的实现细节

层次聚类通过构建树状结构来实现数据分组,项目采用自底向上的凝聚式策略,核心步骤包括距离计算、类间合并和树状图生成。

核心实现函数

def cal_distance(xi, xj):
    # 计算欧氏距离
    return np.sqrt(np.sum(np.square(xi - xj)))

def cal_groupdist(g1, g2, group_dict, dists):
    # 计算类间距离(最小距离法)
    min_dist = float('inf')
    for i in group_dict[g1]:
        for j in group_dict[g2]:
            d = dists[i][j]
            if d < min_dist:
                min_dist = d
    return min_dist

def Clustering(Xarray, k, dists):
    # 凝聚式聚类主函数
    group_dict = {i: [i] for i in range(len(Xarray))}
    while len(group_dict.keys()) > k:
        group_dists = {}
        # 计算所有类间距离
        for g1 in group_dict.keys():
            for g2 in group_dict.keys():
                if g1 < g2:
                    d = cal_groupdist(g1, g2, group_dict, dists)
                    group_dists[(g1, g2)] = d
        # 合并距离最近的两类
        group_mindist = min(list(group_dists.keys()))
        g1, g2 = group_mindist
        group_dict[max(g1, g2) + 1] = group_dict[g1] + group_dict[g2]
        del group_dict[g1], group_dict[g2]
    return group_dict

算法执行流程

层次聚类的核心优势在于无需预先指定聚类数量,通过不断合并最近邻的簇,最终形成完整的聚类树。项目实现中使用最小距离法(单连接)计算类间距离,这种方法容易形成链式结构,适合发现非凸形状的簇。

层次聚类过程示意图

注:示意图基于项目代码生成,展示了从150个样本逐步合并到3个簇的过程

鸢尾花数据集聚类实践

项目提供的iris.data包含150个样本的4个特征,通过以下代码可快速执行聚类任务:

# 加载并预处理数据
X, Y = load_data("iris.data")
X_norm = Normalize(X)
# 计算距离矩阵
dists = Distances(X_norm)
# 聚为3类
cluster_result = Clustering(X_norm, 3, dists)
# 评估聚类效果
ari = Adjusted_Rand_Index(cluster_result, Y, 3)
print(f"Adjusted Rand Index: {ari:.4f}")

K-means:基于中心迭代的聚类算法

K-means算法通过随机初始化聚类中心,迭代优化样本分配和中心位置,最终实现数据的硬划分。项目实现包含数据标准化、中心初始化、分配更新三个核心步骤。

关键实现代码

def Kmeans(Xarray, k, iters):
    # 随机初始化聚类中心
    n, d = Xarray.shape
    centers = Xarray[np.random.choice(n, k, replace=False)]
    
    for _ in range(iters):
        # 分配样本到最近中心
        group_dict = {i: [] for i in range(k)}
        for i in range(n):
            dists = [cal_distance(Xarray[i], centers[j]) for j in range(k)]
            group = np.argmin(dists)
            group_dict[group].append(i)
            
        # 更新聚类中心
        new_centers = np.zeros((k, d))
        for i in range(k):
            if len(group_dict[i]) > 0:
                new_centers[i] = np.mean(Xarray[group_dict[i]], axis=0)
            else:
                new_centers[i] = centers[i]  # 防止空簇
        
        if np.allclose(centers, new_centers):
            break  # 中心稳定则提前停止
        centers = new_centers
        
    return group_dict

算法优化策略

项目实现的K-means算法包含多重优化:

  1. 提前停止条件:当中心变化小于阈值时终止迭代
  2. 空簇处理:保留空簇的上一轮中心位置
  3. 标准化预处理:使用Normalize函数消除量纲影响

这些优化使得算法在iris数据集上通常能在10次迭代内收敛,相比标准实现具有更快的收敛速度。

两种聚类算法的性能对比

为了直观展示两种算法的差异,我们在相同的鸢尾花数据集上进行对比实验,评估指标包括调整兰德指数(ARI)和运行时间。

聚类效果对比

算法调整兰德指数运行时间(ms)优势场景
层次聚类0.7345286样本量小(<500)、需层次结构
K-means0.748342大数据集、凸形簇、快速聚类

结果可视化分析

层次聚类生成的树状图可以帮助我们直观理解类间关系,而K-means则通过迭代优化实现更紧凑的簇划分。在实际应用中,建议结合项目提供的两种算法进行交叉验证,特别是当真实标签未知时,可以通过比较ARI值选择更优聚类结果。

快速上手指南

环境准备

# 克隆项目仓库
git clone https://gitcode.com/GitHub_Trending/st/Statistical-Learning-Method_Code
cd Statistical-Learning-Method_Code

# 安装依赖
pip install numpy pandas matplotlib

运行聚类实验

# 运行层次聚类
python Clustering/Hierachical_Clustering/Hierachical_Clustering.py

# 运行K-means聚类
python Clustering/K-means_Clustering/K-means_Clustering.py

项目提供的Jupyter Notebook文件(Clustering/K-means_Clustering/K-means_Clustering.ipynb)包含完整的可视化代码,可直接在浏览器中交互运行,观察不同参数对聚类结果的影响。

总结与扩展

通过本文的分析,我们深入了解了Statistical-Learning-Method_Code项目中两种聚类算法的实现细节和应用场景。层次聚类适合小样本数据和需要层次结构的场景,而K-means则在大数据集上表现更优。项目中其他相关算法模块也值得探索:

建议读者结合项目中的blogs目录下的PDF教程,进一步深入理解聚类算法的数学原理。对于实际应用问题,可尝试组合使用项目中的降维和聚类模块,构建完整的无监督学习 pipeline。

本文基于Statistical-Learning-Method_Code项目v1.0版本编写,算法实现可能随项目迭代有所更新,请以最新代码为准。如有疑问或改进建议,欢迎提交issue参与项目贡献。

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值