【问题标题】:Python equivalent of daisy() in the cluster package of RR 的 cluster 包中的 daisy() 的 Python 等价物
【发布时间】:2014-12-10 19:58:04
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: python r similarity categorical-data r-daisy


    【解决方案1】:

    仅仅实现一个用于 pdist 的 Gower 函数是不够的。

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

    根据原始论文,我实现了 Gower 函数,并在 pdist 模块中进行了相应的调整(我不能简单地覆盖这些函数,因为 pdist 模块中的 defs 是私有的)。

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

    源代码可以在这个 jupyter notebook 上找到: https://sourceforge.net/projects/gower-distance-4python/files/

    【讨论】:

    • 这看起来很棒 :) 是否有计划将其包含在 sklearn 中或以其他方式发布?
    • 是的,有一张 sklearn (github.com/scikit-learn/scikit-learn/issues/5884) 的票在路上,我在审查我的拉取请求后修复了一些问题,希望我们能把这个实现推送到这个的主人项目。
    • 请问-高尔距离和相似度之间有区别吗?我的假设是相似度 = 1-距离?
    • 您好,高尔距离是一种相似性度量,实际上在原论文(members.cbio.mines-paristech.fr/~jvert/svn/bibli/local/…)中并没有提到相异性。
    • 嗨,@MarceloBeckmann 感谢您的实施。但是,它不能很好地扩展。对于 5000 个数据点,Mahalanobis 需要 1 秒,但您的 Gower 需要 3 分钟。你能向量化代码吗?谢谢 :)
    【解决方案2】:

    我相信您正在寻找scipy.spatial.distance.pdist

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

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

    对于 Python 中的聚类,通常您希望使用 scikits.learnthis question and answer page 讨论了在 scikits 中使用自定义距离度量(在您的情况下为 Gower)的问题——这似乎是不可能的。

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

    【讨论】:

    • 谢谢,您知道 scikitlearn 中可用的任何开箱即用的距离指标,可以联合处理分类变量和数值变量吗?
    • 我没有。他们的文档很好,因此如果存在,搜索应该会很快显示结果。然而,我的方法是定义我自己的小距离函数来处理我想要的,并将其传递给pdist。这样我就可以控制计算的不同方面的相对重要性。如果这变得很慢,我会使用 numba 或 Cython 来定位在较低级别实现该功能以加快速度。
    猜你喜欢
    • 2014-04-21
    • 2020-09-14
    • 2018-07-18
    • 2016-06-14
    • 2016-05-23
    • 1970-01-01
    • 2022-10-13
    • 1970-01-01
    • 2020-04-17
    相关资源
    最近更新 更多