我有一个包含分类(名义和序数)和数字属性的数据集。我想使用这些混合属性在我的观察中计算(dis)相似性矩阵。使用R中集群包的daisy()函数,我可以很容易地得到如下的相异矩阵:
if(!require("cluster")) { install.packages("cluster"); require("cluster") }
data(flower)
as.matrix(daisy(flower, metric = "gower"))
这使用gower指标来处理名义变量。 R中是否存在与daisy()
函数相当的Python?
或者是否允许使用Gower指标或其他类似的任何其他模块函数来计算具有混合(名义,数字)属性的数据集的(dis)相似度矩阵?
答案 0 :(得分:13)
仅仅实现Gower功能与pdist一起使用就不够了。
在内部,如果使用带有混合数据的矩阵,pdist会进行几次数值转换。
根据原始论文,我实现了Gower功能,以及pdist模块中必需的各种功能(我不能简单地覆盖这些功能,因为pdist模块中的defs是私有的。)
到目前为止,我获得的结果与R的雏菊函数相同。
这个jupyter笔记本的源代码是可用的: https://sourceforge.net/projects/gower-distance-4python/files/
答案 1 :(得分:8)
我相信你正在寻找scipy.spatial.distance.pdist
。
如果您在一对观察值上实现计算Gower距离的函数,则可以将该函数传递给pdist
,它将成对应用它并返回成对距离的结果矩阵。 Gower距离似乎不是内置选项之一。
同样,如果单个观察具有混合属性,则可以定义自己的函数,例如,使用类似数值属性子集上的欧几里德距离,分类属性子集上的Gower距离,并添加它们 - 或者对于您的应用程序来说,计算两个孤立观察之间距离的任何其他实现。
对于Python中的聚类,通常您希望使用scikits.learn和this question and answer page确切地讨论使用自定义距离度量(在您的情况下为Gower)中使用scikits的问题 - 这似乎不可能
您可以使用pdist
提供的选项之一以及该链接答案页面上的实现 - 或者您可以实现Gower相似性的功能并使用它。但是如果你想要scikits中的开箱即用的群集工具,它似乎不是直接可能的。