使用加权距离度量的 Scikit-learn 最近邻搜索
Scikit-learn Nearest Neighbor search with weighted distance metric
尝试使用 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)
这个returns:
"NameError: name 'u' is not defined"
callable(minkowski)
returns 对!
我知道我没有传递 u 和 v,所以出现错误也就不足为奇了。对于使用 sklearn 支持的指标之外的其他指标,此文档有点差。例如,如何使用 scipy 中的加权指标?
您尝试包含权重的方式是您的问题。由于 u
和 v
未定义并且在内部传递给可调用的指标,因此您实际上不应将它们包含在您的代码中。您应该使用 functools.partial
from minkowski
创建一个部分函数,其中预定义了 p
和 w
的值。
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)
...
如果你想为 p=1
使用 Minkowski 距离,你只需将 NearestNeighbors
metric
参数设置为 'manhattan'
或 'l1'
(这些是字符串) .您还可以将 metric
设置为 'minkowski'
并相应地设置 p
参数。
详情见here
您现在可以使用 '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)
尝试使用 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)
这个returns:
"NameError: name 'u' is not defined"
callable(minkowski)
returns 对!
我知道我没有传递 u 和 v,所以出现错误也就不足为奇了。对于使用 sklearn 支持的指标之外的其他指标,此文档有点差。例如,如何使用 scipy 中的加权指标?
您尝试包含权重的方式是您的问题。由于 u
和 v
未定义并且在内部传递给可调用的指标,因此您实际上不应将它们包含在您的代码中。您应该使用 functools.partial
from minkowski
创建一个部分函数,其中预定义了 p
和 w
的值。
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)
...
如果你想为 p=1
使用 Minkowski 距离,你只需将 NearestNeighbors
metric
参数设置为 'manhattan'
或 'l1'
(这些是字符串) .您还可以将 metric
设置为 'minkowski'
并相应地设置 p
参数。
详情见here
您现在可以使用 '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)