14

我有一个包含分类(名义和有序)和数字属性的数据集。我想使用这些混合属性在我的观察中计算(不)相似度矩阵。使用 R 中 cluster 包的daisy()函数,我可以很容易地得到一个相异矩阵,如下所示:

if(!require("cluster")) { install.packages("cluster");  require("cluster") }
data(flower)
as.matrix(daisy(flower, metric = "gower"))

这使用 gower 度量来处理名义变量。是否有与daisy()R 中的函数等效的 Python?

或者任何其他允许使用 Gower 度量或类似方法来计算具有混合(名义、数字)属性的数据集的(不)相似度矩阵的任何其他模块函数?

4

2 回答 2

17

仅仅实现一个与 pdist 一起使用的 Gower 函数是不够的。

如果您使用具有混合数据的矩阵,pdist 会在内部进行几个数值转换,这些转换将失败。

根据原始论文,我实现了 Gower 函数,以及 pdist 模块中所需的相应适应(我不能简单地覆盖这些函数,因为 pdist 模块中的 defs 是私有的)。

到目前为止,我得到的结果与 R 的菊花函数相同。

源代码在这个 jupyter 笔记本上可用: https ://sourceforge.net/projects/gower-distance-4python/files/

于 2017-01-17T20:55:55.440 回答
10

相信你正在寻找scipy.spatial.distance.pdist

如果您实现了一个计算单对观测值的 Gower 距离的函数,您可以将该函数传递给pdist它,它将成对应用它并返回结果成对距离矩阵。Gower 距离似乎不是内置选项之一。

同样,如果单个观察具有混合属性,您可以定义自己的函数,例如,在数值属性的子集上使用欧几里得距离,在分类属性的子集上使用 Gower 距离,然后添加它们——或者对于您的应用程序而言,计算两个孤立观测值之间的距离对您意味着什么的任何其他实现。

对于 Python 中的集群,通常您希望使用scikits.learn并且此问答页面准确讨论了在 scikits 中使用自定义距离度量(在您的情况下为 Gower)的问题——这似乎是不可能的。

您可以使用提供的选项之一pdist以及该链接答案页面上的实现 - 或者您可以实现 Gower 相似性的函数并使用它。但是如果你想要 scikits 的开箱即用的集群工具,它似乎并不直接可行。

于 2014-10-15T16:54:30.153 回答