2017-12-31 65 views
0

私は 'KDtree'(これは最適なオプションです。他の 'KNN'アルゴリズムは私のプロジェクトには最適ではありません)とカスタム距離メトリックを使用します。私は似たような質問のためにここでいくつかの答えをチェックしたが、これはうまくいくはずだが...。定義によってでなければなりませんようカスタム距離メトリックを持つ 'KDツリー'

distance_matrixは対称型です:

array([[ 1., 0., 5., 5., 0., 3., 2.], 
    [ 0., 1., 0., 0., 0., 0., 0.], 
    [ 5., 0., 1., 5., 0., 2., 3.], 
    [ 5., 0., 5., 1., 0., 4., 4.], 
    [ 0., 0., 0., 0., 1., 0., 0.], 
    [ 3., 0., 2., 4., 0., 1., 0.], 
    [ 2., 0., 3., 4., 0., 0., 1.]]) 

私は私のメトリックが「正式メトリック」ではありません知っているが、documentationで、それは私の機能は、「正式メトリック」である必要があることを述べている場合にのみ、Iボールツリーを使用しています(User-defined distance:)。また

ValueError 
Traceback (most recent call last) 
<ipython-input-27-b5fac7810091> in <module>() 
    7  return dist 
    8 X = np.array([[1,0], [1,2], [1,3]]) 
----> 9 tree = KDtree(X, metric=dist) 
ValueError: metric PyFuncDistance is not valid for KDTree 

私は:私はこのエラーを取得する

from sklearn.neighbors import KDTree 
def dist(x, y): 
    dist = 0 
    for elt_x, elt_y in zip(x, y): 
     dist += distance_matrix[elt_x, elt_y] 
    return dist 
X = np.array([[1,0], [1,2], [1,3]]) 
tree = KDTree(X, metric=lambda a,b: dist(a,b)) 

:私も試した

NameError 
Traceback (most recent call last) 
<ipython-input-27-b5fac7810091> in <module>() 
    7  return dist 
    8 X = np.array([[1,0], [1,2], [1,3]]) 
----> 9 tree = KDtree(X, metric=dist) 
NameError: name 'KDtree' is not defined 

:私はこのエラーを取得する

from sklearn.neighbors import DistanceMetric 
def dist(x, y): 
    dist = 0 
    for elt_x, elt_y in zip(x, y): 
     dist += distance_matrix[elt_x, elt_y] 
    return dist 
X = np.array([[1,0], [1,2], [1,3]]) 
tree = KDtree(X, metric=dist) 

: はここに私のコードです試しました:

from sklearn.neighbors import NearestNeighbors 
nbrs = NearestNeighbors(n_neighbors=1, algorithm='kd_tree', metric=dist_metric) 

私はエラーを以下の取得:

ValueError        Traceback (most recent call last) 
<ipython-input-32-c78d02cacb5a> in <module>() 
     1 from sklearn.neighbors import NearestNeighbors 
----> 2 nbrs = NearestNeighbors(n_neighbors=1, algorithm='kd_tree',  metric=dist_metric) 

/usr/local/lib/python3.5/dist-packages/sklearn/neighbors/unsupervised.py in __init__(self, n_neighbors, radius, algorithm, leaf_size, metric, p, metric_params, n_jobs, **kwargs) 
    121       algorithm=algorithm, 
    122       leaf_size=leaf_size, metric=metric, p=p, 
--> 123       metric_params=metric_params,  n_jobs=n_jobs, **kwargs) 

/usr/local/lib/python3.5/dist-packages/sklearn/neighbors/base.py in  _init_params(self, n_neighbors, radius, algorithm, leaf_size, metric, p, metric_params, n_jobs) 
    138     raise ValueError(
    139      "kd_tree algorithm does not support callable  metric '%s'" 
--> 140      % metric) 
    141   elif metric not in VALID_METRICS[alg_check]: 
    142    raise ValueError("Metric '%s' not valid for algorithm  '%s'" 

ValueError: kd_tree algorithm does not support callable metric '<function  dist_metric at 0x7f58c2b3fd08>' 

は、私はすべての他のアルゴリズム(自動車、ブルート、...)を試してみましたが、それは同じエラーを出します。

私は、要素が特性のコードであり、5が3より1に近くなるようにベクトルの要素に距離行列を使用する必要があります。私が必要とするのは、最も近いものから最も近いものからソートされた上位3近傍を取得することです。

答えて

3

Scikit-learnのKDTreeは、カスタム距離メトリックをサポートしていません。 BallTreeは、カスタム距離メトリックをサポートしていますが、指定されたメトリックがactually a valid metricであることを確認するのはユーザーの責任です。そうでない場合、アルゴリズムはうれしくクエリの結果を返しますが、結果は正しくありません。

また、カスタムのPython関数をメトリックとして使用するのは、一般に、ツリーのトラバース内でPythonコールバックのオーバーヘッドが発生するため、使用するには時間がかかりすぎることに注意してください。