簡體   English   中英

帶有加權距離度量的 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)

這將返回:

"NameError: name 'u' is not defined"

callable(minkowski)返回 True!

我知道我沒有通過 u 和 v,所以不出所料,錯誤出現了。 對於使用 sklearn 支持的指標之外的其他指標,此文檔有點差。 例如,如何使用 scipy 的加權指標?

您嘗試包含權重的方式是您的問題。 由於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)
...

您現在可以使用'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)

如果您想對p=1使用 Minkowski 距離,您只需將NearestNeighbors metric參數設置為'manhattan''l1' (這些是字符串)。 您還可以將metric設置為'minkowski'並相應地設置p參數。

詳情請看這里

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM