You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中基于SciPy实现字符串层次聚类的疑问

用SciPy Linkage做基于汉明距离的字符串层次聚类?看这篇就够了!

嘿,我太懂你在用SciPy的linkage函数结合汉明距离给字符串分组时卡壳的感觉了!之前帮朋友调过类似的坑,给你捋一套实打实的操作流程,避开那些容易踩的雷:

先搞懂核心前提

SciPy的linkage函数不直接支持对字符串计算汉明距离——它只认数值型的输入,要么是样本的特征数组,要么是两两之间的距离矩阵。所以第一步必须把字符串转换成能计算汉明距离的数值格式。

步骤1:把字符串转成数值数组

汉明距离是比较两个等长字符串对应位置的差异数,所以首先确保你的所有字符串长度一致(要是不一样,要么统一截断/补全,要么换别的距离比如编辑距离)。然后把每个字符转成数值,比如最简单的转成整数:

举个实际例子,假设你的字符串列表是这样:

strings = ["0101", "0111", "1000", "1001"]

转成数值数组的代码:

import numpy as np

# 把每个字符串拆成单个字符,再转成整数数组
X = np.array([[int(c) for c in s] for s in strings])

如果是字母字符串,也可以转成ASCII码(用ord(c)),或者用独热编码(字符种类少的时候更合适)。

步骤2:计算汉明距离矩阵

用SciPy的pdist函数来算两两样本的汉明距离。这里要注意:SciPy的hamming metric返回的是差异位置的比例,不是绝对的差异数。如果要得到实际不同字符的数量,记得乘以字符串的长度!

代码如下:

from scipy.spatial.distance import pdist

# 先算比例,再乘长度得到绝对差异数
hamming_distances = pdist(X, metric='hamming') * X.shape[1]

步骤3:喂给Linkage函数聚类

现在有了压缩后的距离矩阵(就是pdist返回的格式,不用转成方阵),直接传给linkage就行。聚类方法可以选ward、single、complete这些,根据你的需求来:

from scipy.cluster.hierarchy import linkage

# 这里用ward方法,你可以换成自己需要的
cluster_linkage = linkage(hamming_distances, method='ward')

那些容易踩的坑我帮你列出来

  • 字符串长度不一致:汉明距离只对等长字符串生效,长度不一样的话直接报错,先处理好长度问题!
  • 直接传字符串给linkage:别犯这个傻,linkage不认字符串,必须转数值或者提前算距离矩阵。
  • 忘记乘长度:如果你的需求是“几个字符不一样”,而不是“差异比例”,一定要记得乘字符串长度,不然结果会和预期差很多。

(可选)画个树状图看结果

想直观看看聚类效果?用dendrogram画个树状图就行:

from scipy.cluster.hierarchy import dendrogram
import matplotlib.pyplot as plt

dendrogram(cluster_linkage, labels=strings)
plt.title("Hierarchical Clustering Dendrogram (Hamming Distance)")
plt.show()

这样一套流程走下来,应该就能顺利完成你要的字符串聚类啦!

内容的提问来源于stack exchange,提问作者superasiantomtom95

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 07:47:58