如何为 sklearn 创建具有多个参数的自定义距离函数

How to create custom distance function with multiple arguments for sklearn

要为 sklearn 创建一个距离函数,我需要一个将两个一维数组作为输入并 return 一个距离作为输出的函数。我想尝试与论文 Similarity Measures for Categorical Data: A Comparative Evaluation 不同的距离函数。一些需要有关数据的额外信息。

以汉明距离为例,假设x为标签编码数据:

from sklearn.neighbors import DistanceMetric

def hamming(a,b):
    return sum(a!=b)/len(a)

x = np.array([[1, 1, 1],[1, 1, 1],[2, 2, 3],[2, 2, 4]])

dist = DistanceMetric.get_metric(metric='pyfunc', func=hamming)
dist.pairwise(x)

这很好用,但对于某些距离函数,我需要将原始数据作为参数传递(例如计算属性值的相对频率)。

在汉明距离的示例中,它看起来像这样:

def hamming(a,b, x):
    return sum(a!=b)/x.shape[1]

我不知道如何将这样的函数(带有更多参数)传递给 sklearn。 尽管汉明距离不是必需的,但从这个例子中我可以推导出如何实现这个以供进一步的例子使用。

我已经通过为我的距离创建 class 解决了这个问题:

class distances():
    def __init__(self, x):
        self.ncol = x.shape[1]

    def hamming(self, a, b):
        return sum(a != b) / self.ncol

dist = distances(x)

dist = DistanceMetric.get_metric(metric='pyfunc', func=dist.hamming)
dist.pairwise(x)