python 中分类数据的层次聚类

Hierarchical clustering for categorical data in python

我有一个包含字符串值的分类属性。其中三个包含日名(mon---sun)月名和时间间隔(早上下午晚上),我之前提到的另外两个包含地区和街道名称。其次是性别、角色、评论(它是一个预定义的固定字段,具有好、坏、强烈同意等值)姓氏,第一个 name.my 目的是将它们聚类并可视化。我使用这个 WEKA 应用了 k-mean 聚类,但它没有用。 现在我想对其应用层次聚类。我找到了这段代码:

import scipy
import scipy.cluster.hierarchy as sch
X = scipy.randn(100, 2)     # 100 2-dimensional observations
d = sch.distance.pdist(X)   # vector of (100 choose 2) pairwise distances
L = sch.linkage(d, method='complete')
ind = sch.fcluster(L, 0.5*d.max(), 'distance')

但是,上面代码中的X是数字;我有分类数据。 有什么方法可以使用分类数据的 numarray 来查找距离? 换句话说,我可以使用字符串值的分类数据来查找距离吗? 然后我会在 sch.linkage(d, method='complete')

中使用该距离

我想我们已经确定了问题,那么:您将 X 值保持原样,字符串数据。您可以将它们传递给 pdist,但您还必须为距离度量提供一个 2 元函数(2 个输入,数字输出)。

最简单的是相等的class化验有0距离;其他都是 1。你可以用

d = sch.distance.pdist(X, lambda u, v: u != v)

如果您还有其他 class 歧视,只需将逻辑编码为 return 所需的距离,将其包装在一个函数中,然后将函数名称传递给 pdist。我们对此无能为力,因为您没有告诉我们任何关于您的 classes 或模型语义的信息。

这让你感动吗?

另一种可能性是使用汉明距离。

Y = pdist(X, 'hamming')

Computes the normalized Hamming distance, or the proportion of those vector elements between two n-vectors u and v which disagree. To save memory, the matrix X can be of type boolean.

如果您的分类数据由单个字符表示,例如:"m"/"f",它可能就是您要查找的内容。

https://en.wikipedia.org/wiki/Hamming_distance

https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.distance.pdist.html#scipy.spatial.distance.pdist