如何在 scikit-learn 中实现可调用距离度量?

How to implement callable distance metric in scikit-learn?

我正在使用 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.,这让我觉得这是可以接受的。

您可以使用 lambda 函数作为采用两个输入数组的指标:

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

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

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