在我之前的一个 Stack Overflow 问题 (here) 中,有人建议我使用层次聚类根据汉明距离对列表中包含的字符串进行分组。我发现其他几位发帖者对 Python SciPy 包有疑问,特别是链接函数(here 和 here),他们有与我类似的问题。
如果我对SciPy的链接功能的理解是正确的,我需要传入一个数组并根据汉明距离指定链接到聚类。但是,当我尝试在几个字符串的列表上实现它时:
import scipy.cluster.hierarchy as sch
X = [[i] for i in ['apples','applez','appelz','apppel','orange','oranze','oranqg','orangs']]
Z = sch.linkage(X,method='complete',metric='Hamming')
我收到以下错误:
Traceback (most recent call last):
File "C:/Users/nguyenthoh/Desktop/UMI_grouping/scratch_script.py", line 15, in <module>
Z = sch.linkage(X,method='complete',metric='Hamming')
File "C:\Users\User\AppData\Roaming\Python\Python27\site-packages\scipy\cluster\hierarchy.py", line 694, in linkage
y = _convert_to_double(np.asarray(y, order='c'))
File "C:\Users\User\AppData\Roaming\Python\Python27\site-packages\scipy\cluster\hierarchy.py", line 1216, in _convert_to_double
X = X.astype(np.double)
ValueError: could not convert string to float: apples
这显然表明链接的输入需要是数字数组,而不是字符串。
有没有一种方法可以使用带有 SciPy 链接的字符串,或者我是否需要提供带有链接的汉明距离函数以便它可以对字符串进行聚类?
请您参考如下方法:
ValueError: could not convert string to float: apples
您需要对分类变量进行标签编码,并将类别列为字符串(这些也可以是在 Python 中转换为字符串的数字)。
在 python 中,我们有:from sklearn.preprocessing import LabelEncoder。
查看文档并实现它。它会将您的字符串类别分别标记为每个类别的整数。
例子:
CODE: le.transform(["tokyo", "tokyo", "paris"])
OUTPUT: array([2, 2, 1]...)
然后您可以将其用于层次/凝聚聚类。 也许还检查所有变量是否都是数字形式,例如 int 或 float。
祝你有美好的一天!
