news 2026/7/8 5:33:33

Python scikit-learn 1.3 聚类实战:3种算法对比与欧洲语言数据集应用

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python scikit-learn 1.3 聚类实战:3种算法对比与欧洲语言数据集应用

Python scikit-learn 1.3 聚类实战:3种算法对比与欧洲语言数据集应用

聚类分析是机器学习中无监督学习的重要分支,它能帮助我们发现数据中隐藏的自然分组。本文将带你用Python的scikit-learn 1.3版本,实战三种主流聚类算法:系统聚类、K-Means和AgglomerativeClustering,并应用于一个有趣的欧洲语言数据集。

1. 环境准备与数据加载

在开始之前,确保你已经安装了以下Python库:

pip install scikit-learn==1.3.0 pandas matplotlib seaborn numpy

我们将使用一个特殊的欧洲语言距离矩阵作为示例数据。这个数据集记录了6种欧洲语言(英语、挪威语、德语、法语、西班牙语、意大利语)之间的"距离",这个距离是基于数字1-10的拼写差异计算的。

import numpy as np import pandas as pd from scipy.spatial.distance import squareform # 语言缩写:E(英语), N(挪威语), G(德语), Fr(法语), S(西班牙语), I(意大利语) languages = ['E', 'N', 'G', 'Fr', 'S', 'I'] # 距离矩阵(下三角) dist_matrix = np.array([ [0], # E [2, 0], # N [6, 6, 0], # G [6, 6, 2, 0], # Fr [6, 6, 6, 6, 0], # S [6, 6, 6, 6, 2, 0] # I ]) # 转换为完整的对称距离矩阵 full_dist_matrix = squareform(dist_matrix)

2. 三种聚类算法原理与实现

2.1 系统聚类(Hierarchical Clustering)

系统聚类通过连续合并或分裂簇来构建树状图(dendrogram)。scikit-learn中的AgglomerativeClustering实现了这种方法。

核心参数解析

参数说明常用值
n_clusters最终簇的数量整数
linkage链接策略'ward', 'complete', 'average', 'single'
affinity距离度量'euclidean', 'manhattan', 'cosine', 'precomputed'
from sklearn.cluster import AgglomerativeClustering import matplotlib.pyplot as plt from scipy.cluster.hierarchy import dendrogram # 系统聚类实现 def plot_dendrogram(model, **kwargs): counts = np.zeros(model.children_.shape[0]) n_samples = len(model.labels_) for i, merge in enumerate(model.children_): current_count = 0 for child_idx in merge: if child_idx < n_samples: current_count += 1 else: current_count += counts[child_idx - n_samples] counts[i] = current_count linkage_matrix = np.column_stack([model.children_, model.distances_, counts]).astype(float) dendrogram(linkage_matrix, **kwargs) model = AgglomerativeClustering(distance_threshold=0, n_clusters=None, affinity='precomputed', linkage='complete') model = model.fit(full_dist_matrix) plt.figure(figsize=(10, 6)) plt.title('欧洲语言谱系聚类图') plot_dendrogram(model, labels=languages, orientation='right') plt.show()

2.2 K-Means聚类

K-Means是最著名的动态聚类算法,虽然通常用于欧式空间数据,但我们可以通过多维缩放(MDS)将距离矩阵转换为适合K-Means的形式。

from sklearn.manifold import MDS from sklearn.cluster import KMeans # 将距离矩阵转换为2维坐标 mds = MDS(n_components=2, dissimilarity='precomputed', random_state=42) coordinates = mds.fit_transform(full_dist_matrix) # K-Means聚类 kmeans = KMeans(n_clusters=3, random_state=42) kmeans_labels = kmeans.fit_predict(coordinates) # 可视化 plt.figure(figsize=(8, 6)) plt.scatter(coordinates[:, 0], coordinates[:, 1], c=kmeans_labels, cmap='viridis') for i, lang in enumerate(languages): plt.annotate(lang, (coordinates[i, 0], coordinates[i, 1])) plt.title('K-Means聚类结果') plt.show()

2.3 有序约束聚类(AgglomerativeClustering模拟)

虽然scikit-learn没有直接实现有序聚类,但我们可以通过调整AgglomerativeClustering的参数来模拟类似效果。

# 使用AgglomerativeClustering模拟有序约束 ordered_model = AgglomerativeClustering(n_clusters=3, affinity='precomputed', linkage='single') ordered_labels = ordered_model.fit_predict(full_dist_matrix) # 结果展示 result_df = pd.DataFrame({ 'Language': languages, 'SystemCluster': model.labels_, 'KMeans': kmeans_labels, 'OrderedLike': ordered_labels }) print(result_df)

3. 算法对比与结果分析

让我们从几个关键维度比较这三种算法:

1. 计算复杂度对比

算法时间复杂度空间复杂度适合数据规模
系统聚类O(n³)O(n²)中小型(n<10000)
K-MeansO(nki)O(n+k)大型
有序约束O(n²)O(n²)中小型

2. 我们的语言数据集结果

from sklearn.metrics import silhouette_score # 计算轮廓系数(仅适用于K-Means和有序约束) kmeans_score = silhouette_score(coordinates, kmeans_labels) ordered_score = silhouette_score(coordinates, ordered_labels) print(f"K-Means轮廓系数: {kmeans_score:.3f}") print(f"有序约束轮廓系数: {ordered_score:.3f}")

3. 实际应用建议

  • 当数据有明确的距离/相似性定义时,系统聚类是首选
  • 对于大型数据集,K-Means更高效
  • 当数据有潜在的顺序关系时,可尝试单链接(single linkage)的层次聚类

4. 高级技巧与优化

4.1 最佳簇数确定

对于K-Means,我们可以使用肘部法则和轮廓分析:

from sklearn.metrics import silhouette_samples # 肘部法则 inertia = [] for k in range(2, 6): kmeans = KMeans(n_clusters=k, random_state=42) kmeans.fit(coordinates) inertia.append(kmeans.inertia_) plt.figure(figsize=(8, 4)) plt.plot(range(2, 6), inertia, 'bo-') plt.xlabel('簇数') plt.ylabel('SSE') plt.title('肘部法则') plt.show()

4.2 距离度量选择

当使用层次聚类时,链接策略的选择至关重要:

  • 完全链接(complete): 适合发现紧凑的、大小相近的簇
  • 单链接(single): 能发现非凸形状的簇,但对噪声敏感
  • 平均链接(average): 平衡了上述两种方法的优缺点

4.3 特征工程技巧

对于距离矩阵数据,可以考虑:

  1. 多维缩放(MDS) - 如我们前面所用
  2. t-SNE - 更适合可视化
  3. 等距映射(Isomap) - 保留全局几何结构
from sklearn.manifold import TSNE tsne = TSNE(n_components=2, metric='precomputed', random_state=42) tsne_coords = tsne.fit_transform(full_dist_matrix) plt.figure(figsize=(8, 6)) plt.scatter(tsne_coords[:, 0], tsne_coords[:, 1], c=kmeans_labels, cmap='viridis') for i, lang in enumerate(languages): plt.annotate(lang, (tsne_coords[i, 0], tsne_coords[i, 1])) plt.title('t-SNE可视化') plt.show()

在实际项目中,我发现t-SNE虽然能产生漂亮的可视化效果,但随机性较强,不适合直接用于聚类。而MDS虽然计算成本较高,但结果更稳定可靠。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/8 5:30:14

从HE到空间生态位:Cell研究为何需要空间单细胞蛋白组作为标尺

病理HE图像长期用于观察组织形态&#xff0c;但肿瘤微环境的关键信息往往隐藏在细胞身份、功能状态和空间邻域之中。Cell发表的“Cellular architecture and neighborhood-informed virtual spatial tumor profiling from histopathology”提供了一个值得关注的研究框架&#x…

作者头像 李华
网站建设 2026/7/8 5:30:02

JTAG 与 劳德巴赫的连接问题

最近环境搭建的过程中&#xff0c;总是遇到硬件连接的问题。JTAG刷写switch过程中总是报错&#xff0c;最后发现是线束不稳定导致了&#xff0c;后来换了个JTAG和线束&#xff0c;问题就解决了。劳德巴赫也遇到一个问题&#xff0c;正常连电脑都是好的&#xff0c;接上不连电源…

作者头像 李华
网站建设 2026/7/8 5:29:51

Obsidian:英雄联盟Wad文件编辑器的完整使用指南

Obsidian&#xff1a;英雄联盟Wad文件编辑器的完整使用指南 【免费下载链接】Obsidian Wad archive editor for League of Legends 项目地址: https://gitcode.com/gh_mirrors/obsidian2/Obsidian 在《英雄联盟》的游戏世界中&#xff0c;Wad文件是存储游戏资源的核心容…

作者头像 李华
网站建设 2026/7/8 5:26:59

langchain中间件之人工审核件:HumanInTheLoopMiddleware

HumanInTheLoopMiddleware的意义HumanInTheLoopMiddleware 是 LangChain 中用于在 Agent 执行过程中插入人工审核节点的中间件。它允许你在工具被实际调用前或调用后暂停流程&#xff0c;等待人工批准、修改或拒绝&#xff0c;是构建安全、可控智能体的核心组件。HumanInTheLoo…

作者头像 李华
网站建设 2026/7/8 5:24:44

Token(词元),5分钟彻底搞懂

需要注意的是&#xff0c;Token 的实际切分由各模型厂商自研的 Tokenizer&#xff08;分词器&#xff09;独立完成&#xff0c;因此相同文本在不同模型上会产生不同的 Token 数量与序列。以上提及的换算比例等数据&#xff0c;均为行业通用估算参考。 下面通过代码实战&#xf…

作者头像 李华
网站建设 2026/7/8 5:24:18

多模态 RAG 实战:图片与表格检索从零搭建

多模态 RAG 实战&#xff1a;图片与表格检索从零搭建 你好&#xff0c;欢迎来到这篇实战教程。 WEB项目地址&#xff1a;演示地址 安卓APP下载地址&#xff1a;演示地址 你是否有过这样的经历——做了一个 RAG 系统&#xff0c;用户问“这张图表里第三季度的数据是多少”&…

作者头像 李华