【问题标题】:How to create custom distance function with multiple arguments for sklearn如何为 sklearn 创建具有多个参数的自定义距离函数
【发布时间】:2021-02-08 21:29:05
【问题描述】:

要为 sklearn 创建一个距离函数,我需要一个函数,它以两个一维数组作为输入并返回一个距离作为输出。我想尝试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。 尽管汉明距离不是必需的,但从这个例子中我可以推导出如何在更多例子中实现这一点。

【问题讨论】:

  • 这个问题有复杂的解决方案,但简单的解决方案就是简单地使用全局变量。你能提供一个全局变量不够用的例子吗?

标签: python function scikit-learn arguments distance


【解决方案1】:

我已经通过为我的距离创建一个类来解决它:

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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-16
    • 1970-01-01
    • 2021-12-17
    • 2017-04-18
    • 1970-01-01
    • 2021-09-28
    • 2023-03-15
    • 1970-01-01
    相关资源
    最近更新 更多