Python 如何在scikit学习中实现可调用距离度量?

Python 如何在scikit学习中实现可调用距离度量?,python,scipy,scikit-learn,euclidean-distance,keyword-argument,Python,Scipy,Scikit Learn,Euclidean Distance,Keyword Argument,我正在使用python的scikit learn中的集群模块,我想使用标准化的欧几里德距离。这个(据我所知)没有内置的距离,这里有一个 所以,我想用一个可调用的。该函数是我的distance模块的一部分,称为distance.normalized\u euclidean\u distance。它需要三个输入:X、Y和SD 然而,归一化欧几里德距离要求总体样本的标准偏差。但是,scipy中的成对距离只允许两个输入:X和Y 我如何允许它接受额外的参数 我试着把它作为一个**kwarg,但这似乎不起作

我正在使用python的scikit learn中的集群模块,我想使用标准化的欧几里德距离。这个(据我所知)没有内置的距离,这里有一个

所以,我想用一个可调用的。该函数是我的
distance
模块的一部分,称为
distance.normalized\u euclidean\u distance
。它需要三个输入:
X
Y
SD

然而,归一化欧几里德距离要求总体样本的标准偏差。但是,scipy中的成对距离只允许两个输入:
X
Y

我如何允许它接受额外的参数

我试着把它作为一个
**kwarg
,但这似乎不起作用:

cluster = DBSCAN(eps=1.0, min_samples=1,metric = distance.normalized_euclidean, SD = stdv)
其中,
distance.normalized_euclidean
是我编写的函数,它接受两个数组,
X
Y
,并计算它们之间的规范化欧几里德距离

…但这会引发一个错误:

TypeError: __init__() got an unexpected keyword argument 'SD'
使用其他关键字参数的方法是什么


它说
任何进一步的参数都直接传递给距离函数。
,这使我认为这是可以接受的。

您可以使用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})

我曾想过为stdv使用一个全局变量,但这似乎是一个危险的解决方案。什么是距离?标准化的欧几里德函数?这是我为计算NED编写的函数。那么如何使用
SD
?是的,它也是距离的参数。我认为这是目前唯一的方法,因为dbscan没有kwargs。我认为这是一个合理的界面。