【问题标题】:Using a user-defined distance metric for k-nn in scikit-learn在 scikit-learn 中为 k-nn 使用用户定义的距离度量
【发布时间】:2018-04-13 22:22:34
【问题描述】:

我有这个代码:

import pandas as pd
import numpy as np 
import matplotlib.pyplot as plt 
import sklearn.neighbors as ng 

def mydist(x, y):
    return np.sum((x-y)**2)

if __name__ == '__main__':
    nn = ng.KNeighborsClassifier(n_neighbors=3, algorithm='ball_tree',metric='mydist')

我正在使用 sci-kit learn 0.18.1,但出现此错误

ValueError: Metric 'mydist' not valid for algorithm 'ball_tree'

我也尝试使用 algorithm = 'brute' 但错误仍然存​​在。

这是什么原因造成的?如何正确使用用户定义的距离度量?

【问题讨论】:

    标签: python scikit-learn


    【解决方案1】:

    以下是ball_tree 算法的有效指标列表 - scikit-learn 在内部检查指定指标是否在其中:

    In [114]: from sklearn.neighbors import BallTree
    
    In [115]: BallTree.valid_metrics
    Out[115]:
    ['euclidean',
     'l2',
     'minkowski',
     'p',
     'manhattan',
     'cityblock',
     'l1',
     'chebyshev',
     'infinity',
     'seuclidean',
     'mahalanobis',
     'wminkowski',
     'hamming',
     'canberra',
     'braycurtis',
     'matching',
     'jaccard',
     'dice',
     'kulsinski',
     'rogerstanimoto',
     'russellrao',
     'sokalmichener',
     'sokalsneath',
     'haversine',
     'pyfunc']       # <--- NOTE
    

    所以尝试指定metric='pyfunc'metric_params={"func":mydist}

    knn = ng.KNeighborsClassifier(n_neighbors=3, algorithm='ball_tree',
                                  metric='pyfunc', metric_params={"func":mydist})
    

    【讨论】:

      猜你喜欢
      • 2016-09-15
      • 1970-01-01
      • 2015-10-30
      • 2015-09-16
      • 2016-03-12
      • 2016-06-01
      • 2012-06-22
      • 2015-11-25
      • 2011-07-28
      相关资源
      最近更新 更多