Scikit-learn最近邻搜索加权距离度量

时间:2018-01-16 18:56:22

标签: python scikit-learn distance nearest-neighbor weighted

尝试使用minkowski距离并传递权重,但sklearn指标不允许这样做。从scipy尝试了pdist和cdist,但是这些计算了之前的距离!

    import pandas as pd
    from sklearn.neighbors import NearestNeighbors

        X = pd.read_csv('.file.csv')

        weights = [1] * X.shape[1] # filled with 1's for now

        nbrs = NearestNeighbors(
                                algorithm = 'brute',
                                metric = minkowski(u, v, p=1, w=weights), n_jobs = -1)
                               .fit(X)

    distances, indices = nbrs.kneighbors(X=X, n_neighbors=50, return_distance=True)

返回:

"NameError: name 'u' is not defined"

callable(minkowski)返回True!

我知道我没有通过你,而且不出所料,错误就出现了。对于使用sklearn支持的其他指标以外的其他指标,这方面的文档有点差。我怎样才能使用scipy的加权指标?

3 个答案:

答案 0 :(得分:1)

您尝试包含权重的方式是您的问题。由于uv未定义且内部传递给公制可调度,因此您不应将它们实际包含在代码中。您应该使用minkowski中的functools.partial创建一个部分函数,​​其值为pw

from functools import partial

w_minkowski = partial(minkowski, p=1, w=weights)
nbrs = NearestNeighbors(algorithm='brute', metric=w_minkowski, n_jobs=-1)
nbrs.fit(X)
...

答案 1 :(得分:1)

您现在可以使用'wminkowski'度量标准,并使用metric_params将权重传递给该度量标准。

import numpy as np
from sklearn.neighbors import NearestNeighbors

seed = np.random.seed(9)
X = np.random.rand(100, 5)
weights = np.random.choice(5, 5, replace=False)

nbrs = NearestNeighbors(algorithm='brute',
                        metric='wminkowski',
                        metric_params={'w': weights},
                        p=1,
                        n_jobs=-1)
nbrs.fit(X)

输出:

NearestNeighbors(algorithm='brute', leaf_size=30, metric='wminkowski',
                 metric_params={'w': array([2, 0, 3, 4, 1])}, n_jobs=-1,
                 n_neighbors=5, p=1, radius=1.0)

答案 2 :(得分:0)

如果您想使用p=1的Minkowski距离,您只需将NearestNeighbors metric参数设置为'manhattan''l1'(这些是字符串)。您也可以将metric设置为'minkowski'并相应地设置p参数。

有关详细信息,请参阅here