2016-10-23 8 views
0

カスタムメトリックを持つK最近傍を使用する必要があります。私は私のオブジェクトのプロパティのために働く数式を持っています。それは私が行列を持っていることを意味します。この行列はベクトルで構成され、すべてのベクトルには数式で使用される3つのスカラー値が含まれます。K最近傍のカスタムメトリックの平均所得値は何ですか?

ライブラリsklearnのクラスKNeighborsClassifierのカスタムメトリックを使用する方法を見つけました。これは単に文字列または呼び出し可能なmetricというパラメータを取るだけです。だから...私は関数を作成しましたが、この関数は2つの同じ配列に最初に10個のスカラー値を含みます。私はすべての配列が3つの値の代わりに10の値を含んでいることを意味します。その後の各関数では、関数は私の行列から値をとります。

私はコールスタックを見てきましたが、クラスBallTreeから呼び出された関数を見てきました。私はこの構造について読んだことがありますが、私のデータがどのように変わってきたのか、それが最初に私のメトリクスに渡すものを理解できません。

最初の同じ2つの配列は何を意味しますか?

私は

clf = KNeighborsClassifier(n_jobs=4, metric=custom_metric) 
clf.fit(X, Y) 

Xは、このような値が含まれ、このコードによって分類子をインスタンス化します。

array([[2.400154, 0.07744107744107744, 96.80566400000001], 
     [2.39325, 0.07744107744107744, 97.219544], 
     [2.395162, 0.07744107744107744, 97.10519599999999], 
     [3.101635, 0.009788768675940238, 65.88368], 
     [3.09882, 0.009788768675940238, 65.97364499999999], 
     [3.099576, 0.009788768675940238, 65.956018]], dtype=object) 

custom_metricが私の機能です。今は何も入っていません。

def custom_metric(x: np.ndarray, y: np.ndarray) -> float: 
    pass 

xの例とyそれらが同じである上に、私が書いている

array([ 0.02274535, 0.21161613, 0.41314247, 0.39046054, 0.1670481 , 
     0.15515555, 0.13329802, 0.59103014, 0.26246693, 0.7727967 ]) 

私の英語が不明な場合は、

答えて

0

あなたのスニペットは提供はあまり意味がありません、KNNメトリックは、それを示すためにあなたがそれを上の訓練を受けたものとは異なる空間から引数何か、最小限の例として、取得することはありません:

import numpy as np 
x = np.array(range(10)).reshape(5,-1) 
y = np.array(range(5)) 

from sklearn.neighbors import KNeighborsClassifier as KNN 
def foo(X, Y): 
    print 'X', X, X.shape 
    print 'Y', Y, Y.shape 
    return 0 

clf = KNN(metric=foo) 
clf.fit(x, y) 
clf.predict(x) 

プリントを

を予想通り
X [ 0. 1.] (2,) 
Y [ 2. 3.] (2,) 
X [ 0. 1.] (2,) 
Y [ 4. 5.] (2,) 
X [ 0. 1.] (2,) 
Y [ 6. 7.] (2,) 
X [ 0. 1.] (2,) 
Y [ 8. 9.] (2,) 
X [ 2. 3.] (2,) 
Y [ 4. 5.] (2,) 
X [ 2. 3.] (2,) 
Y [ 6. 7.] (2,) 
X [ 2. 3.] (2,) 
Y [ 8. 9.] (2,) 
X [ 4. 5.] (2,) 
Y [ 6. 7.] (2,) 
X [ 4. 5.] (2,) 
Y [ 8. 9.] (2,) 
X [ 6. 7.] (2,) 
Y [ 8. 9.] (2,) 
X [ 0. 1.] (2,) 
Y [ 0. 1.] (2,) 
X [ 2. 3.] (2,) 
Y [ 2. 3.] (2,) 
X [ 4. 5.] (2,) 
Y [ 4. 5.] (2,) 
X [ 6. 7.] (2,) 
Y [ 6. 7.] (2,) 
X [ 8. 9.] (2,) 
Y [ 8. 9.] (2,) 

したがって、マトリックでは、それぞれ3次元の2つのベクトルを受け取り、それらの間に有効な距離を返す必要があります。

predictにそのような次元のものを渡すと、10のディメンションしか得られません。 BallTreeに隠された「魔法の」ものは何もありません。あなたのデータに入っている必要があります。

+0

こんにちは!あなたのsklearn、numpy、scipyのバージョンを教えてもらえますか? – ANtlord

+0

ナンシーはここでは関係ありません。 Sklearnは最新です(0.18) – lejlot

+0

ああ!あなたはPython 2をお持ちですか?私はあなたのコードをテストしました。あなたが示したものを出力しますが、Python 3ではメトリック関数の戻り値についてエラーがあります。メトリックは浮動小数点値を返す必要があります。 – ANtlord

関連する問題