복붙노트

[PYTHON] 사용자 정의 메트릭을 사용하여 Sklearn kNN 사용

PYTHON

사용자 정의 메트릭을 사용하여 Sklearn kNN 사용

현재 주어진 포인트에 대해 가장 가까운 k 개의 이웃을 찾기 위해 kNN 알고리즘을 사용할 필요가있는 프로젝트를 수행하고 있습니다. 예를 들어, Python을 사용하여 sk, 작업을 수행하기위한 sklearn 패키지를 만들지 만 사전 정의 된 메트릭은 기본값이 아닙니다. 측정 항목 그래서 여기에 여기에서 찾을 수있는 sklearn의 문서에서 사용자 정의 된 메트릭을 사용해야합니다.

sklearn kNN의 최신 버전이 사용자 정의 메트릭을 지원하는 것으로 보이지만이를 사용하는 방법을 찾을 수 없습니다.

import sklearn
from sklearn.neighbors import NearestNeighbors
import numpy as np
from sklearn.neighbors import DistanceMetric
from sklearn.neighbors.ball_tree import BallTree
BallTree.valid_metrics

mydist = max (x-y)라는 메트릭을 정의한 다음 DistanceMetric.get_metric을 사용하여 DistanceMetric 객체로 만듭니다.

dt=DistanceMetric.get_metric('pyfunc',func=mydist)

문서에서이 줄은 다음과 같아야합니다.

nbrs = NearestNeighbors(n_neighbors=4, algorithm='auto',metric='pyfunc').fit(A)
distances, indices = nbrs.kneighbors(A)

그러나 dt를 어디에 넣을 수 있습니까? 감사

해결법

  1. ==============================

    1.메트릭을 메트릭 매개 변수로, 추가 메트릭 인수를 키워드 매개 변수로 NN 생성자에 전달합니다.

    메트릭을 메트릭 매개 변수로, 추가 메트릭 인수를 키워드 매개 변수로 NN 생성자에 전달합니다.

    >>> def mydist(x, y):
    ...     return np.sum((x-y)**2)
    ...
    >>> X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
    
    >>> nbrs = NearestNeighbors(n_neighbors=4, algorithm='ball_tree',
    ...            metric='pyfunc', func=mydist)
    >>> nbrs.fit(X)
    NearestNeighbors(algorithm='ball_tree', leaf_size=30, metric='pyfunc',
             n_neighbors=4, radius=1.0)
    >>> nbrs.kneighbors(X)
    (array([[  0.,   1.,   5.,   8.],
           [  0.,   1.,   2.,  13.],
           [  0.,   2.,   5.,  25.],
           [  0.,   1.,   5.,   8.],
           [  0.,   1.,   2.,  13.],
           [  0.,   2.,   5.,  25.]]), array([[0, 1, 2, 3],
           [1, 0, 2, 3],
           [2, 1, 0, 3],
           [3, 4, 5, 0],
           [4, 3, 5, 0],
           [5, 4, 3, 0]]))
    
  2. ==============================

    2.이전 답변에 작은 추가. 추가 인수를 사용하는 사용자 정의 메트릭을 사용하는 방법

    이전 답변에 작은 추가. 추가 인수를 사용하는 사용자 정의 메트릭을 사용하는 방법

    >>> def mydist(x, y, **kwargs):
    ...     return np.sum((x-y)**kwargs["metric_params"]["power"])
    ...
    >>> X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
    >>> Y = np.array([-1, -1, -2, 1, 1, 2])
    >>> nbrs = KNeighborsClassifier(n_neighbors=4, algorithm='ball_tree',
    ...            metric=mydist, metric_params={"power": 2})
    >>> nbrs.fit(X, Y)
    KNeighborsClassifier(algorithm='ball_tree', leaf_size=30,                                                                                                                                                          
           metric=<function mydist at 0x7fd259c9cf50>, n_neighbors=4, p=2,
           weights='uniform')
    >>> nbrs.kneighbors(X)
    (array([[  0.,   1.,   5.,   8.],
           [  0.,   1.,   2.,  13.],
           [  0.,   2.,   5.,  25.],
           [  0.,   1.,   5.,   8.],
           [  0.,   1.,   2.,  13.],
           [  0.,   2.,   5.,  25.]]),
     array([[0, 1, 2, 3],
           [1, 0, 2, 3],
           [2, 1, 0, 3],
           [3, 4, 5, 0],
           [4, 3, 5, 0],
           [5, 4, 3, 0]]))
    
  3. from https://stackoverflow.com/questions/21052509/sklearn-knn-usage-with-a-user-defined-metric by cc-by-sa and MIT license