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
相关产品推荐
相关产品推荐

