【问题标题】:How to implement callable distance metric in scikit-learn?如何在 scikit-learn 中实现可调用距离度量?
【发布时间】:2015-10-30 10:19:43
【问题描述】:

我在 python 的 scikit learn 中使用集群模块,我想使用归一化欧几里得距离。这没有内置距离(我知道)这是list

所以,我想使用可调用对象来实现我自己的归一化欧几里德距离。该函数是我的distance 模块的一部分,称为distance.normalized_euclidean_distance。它需要三个输入:XYSD

但是,归一化欧几里得距离需要总体样本的标准差。但是,scipy 中的成对距离只允许两个输入:XY

如何让它接受额外的参数?

我尝试将其作为**kwarg 输入,但这似乎不起作用:

cluster = DBSCAN(eps=1.0, min_samples=1,metric = distance.normalized_euclidean, SD = stdv)

distance.normalized_euclidean 是我编写的函数,它接收两个数组 XY 并计算它们之间的归一化欧几里得距离。

...但这会引发错误:

TypeError: __init__() got an unexpected keyword argument 'SD'

使用附加关键字参数的方法是什么?

Here 上面写着Any further parameters are passed directly to the distance function.,这让我觉得这是可以接受的。

【问题讨论】:

  • 我曾想过为stdv 使用全局变量,但这似乎是一个危险的解决方案。
  • 什么是distance.normalized_euclidean
  • 这是我为计算 NED 编写的函数。
  • SD是怎么用的呢?不也是distance.normalized_euclidean的论据吗?
  • 对,也是distance.normalized_euclidean的参数。

标签: python scipy scikit-learn euclidean-distance keyword-argument


【解决方案1】:

您可以使用 lambda 函数作为度量,它接受两个输入数组:

cluster = DBSCAN(eps=1.0, min_samples=1,metric=lambda X, Y: distance.normalized_euclidean(X, Y, SD=stdv))

【讨论】:

  • 我认为这是目前唯一的方法,因为 dbscan 没有 kwargs。我认为这是一个合理的界面。
【解决方案2】:

另一种方法是使用 metric_param arg,稍后将其作为 kwargs 发送到函数:

cluster = DBSCAN(eps=1.0, min_samples=1, metric=normalized_euclidean, metric_params={"SD": stdv})

【讨论】:

    猜你喜欢
    • 2016-09-15
    • 2012-02-15
    • 1970-01-01
    • 2016-03-12
    • 2015-11-25
    • 2012-06-22
    • 2015-09-16
    • 1970-01-01
    • 2018-05-01
    相关资源
    最近更新 更多