2016-12-16 3 views
2

私はBallTreeとそれが提供するさまざまな指標で遊んでいます。SklearnのBallTreeで重み付けされたミンコフスキーのメトリックを使用する

df = pd.DataFrame() 
num_features = 4 
num_samples = 100 
for i in range(num_features): 
    df['A_%s'%(i+1)] = np.random.rand(num_samples) 
    df['A_%s'%(i+1)] = df['A_%s'%(i+1)].apply(lambda x: 500 - (1000 * x ** 3)) 
point = np.array([int(1000 * r ** 3) for r in np.random.rand(num_features)]).reshape(1, -1) 
weights = [int(10000 * r ** 2) for r in np.random.rand(num_features)] 

tree1 = sklearn.neighbors.BallTree(df, metric='minkowski') 
tree2 = sklearn.neighbors.BallTree(df, metric='wminkowski', p=2, w=[1] * num_features) # Should be just like tree1 
tree3 = sklearn.neighbors.BallTree(df, metric='wminkowski', p=2, w=weights) 

d1, i1 = tree1.query(point, k=5) 
d2, i2 = tree2.query(point, k=5) 
d3, i3 = tree2.query(point, k=5) 

print 'Point:' 
print point 
print 'Weights:' 
print weights 
print 'Distances:' 
print d1 
print d2 
print d3 
print 'Indices:' 
print i1 
print i2 
print i3 

、出力は次のとおりです:

Point: 
[[ 16 58 0 884]] 
Weights: 
[2869, 46, 1558, 5835] 
Distances: 
[[ 451.55203926 537.61234492 601.29840519 601.74059138 647.46934474]] 
[[ 451.55203926 537.61234492 601.29840519 601.74059138 647.46934474]] 
[[ 451.55203926 537.61234492 601.29840519 601.74059138 647.46934474]] 
Indices: 
[[61 31 86 43 93]] 
[[61 31 86 43 93]] 
[[61 31 86 43 93]] 

私は、異なる数で上記のコードを実行しようとした私はwminkowskiを使用する場合しかし、重みが結果に全く影響を与えないようですtree3によって返される出力が異なると予想している間に、3つのツリーがすべて同じ出力を返すたびに、私は、何故ですか?私はSklearnバージョン0.18.1を使っています。

答えて

1

tree2d3,i3に例では、あなたが代入しているので、私の推測ではある - 問題の行:

d3, i3 = tree2.query(point, k=5) 

あなたはおそらく意味:

d3, i3 = tree3.query(point, k=5) 

tree3tree2を変更し、別の提供結果はtree3になります。

+0

ああ。それはそれだった。気づいてくれてありがとう。 BallTreesとwminkowskiの使い方についての文献はほとんどないので、私はこのポストを残しておきます。将来誰かに来るかもしれない。 – shahins

関連する問題