如何为 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)
要为 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)