Python相当于R的集群包中的daisy()

Zhu*_*arb 12 python r similarity categorical-data r-daisy

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

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

这使用gower度量来处理名义变量.是否有一个Python相当于daisy()R 中的函数?

或者也许任何其他模块函数允许使用Gower指标或类似的东西计算具有混合(名义,数字)属性的数据集的(dis)相似性矩阵?

Mar*_*ann 15

仅仅实现Gower函数与pdist一起使用就不够了.

在内部,如果使用带有混合数据的矩阵,pdist会进行几次数值转换.

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

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

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

  • 是的,sklearn的路上有一张票(https://github.com/scikit-learn/scikit-learn/issues/5884),我在审查了我的拉动请求之后修了几个点,希望我们能够将此实现推送到此项目的主人. (3认同)

ely*_*ely 8

我相信你在找scipy.spatial.distance.pdist.

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

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

对于Python中的聚类,通常你想使用scikits.learn,这个问题和答案页面正好讨论了使用自定义距离测量(在你的情况下是Gower)与scikits的问题 - 这似乎是不可能的.

您可以使用其中一个选项pdist以及该链接答案页面上的实现 - 或者您可以实现Gower相似性的功能并使用它.但是如果你想要scikits的开箱即用的群集工具,它似乎不是直接可能的.

  • 我不.他们的文档很好,所以如果存在,搜索应该快速显示结果.但是,我的方法是定义我自己的小距离函数来处理我想要的,并将其传递给`pdist`.这样我就可以控制计算的不同方面的相对重要性.如果这变得很慢,我会使用numba或Cython来定位在较低级别实现该功能以加快速度. (2认同)