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

时间:2015-08-07 04:41:37

标签: python scipy scikit-learn euclidean-distance kwargs

我在python的scikit中使用了聚类模块,我想使用Normalized Euclidean Distance。没有内置距离(我知道)这是一个list

所以,我想用可调用的方法实现我自己的Normalized Euclidean Distance。该函数是我的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.,这让我觉得这是可以接受的。

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:0)

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

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