2016-12-16 1 views
2

J'ai joué avec BallTree et les différentes métriques qu'il fournit. Cependant, quand je l'utilise wminkowski, il semble que les poids ont aucun impact sur les résultats:Utilisation de la métrique minkowski pondérée dans BallTree de sklearn

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 

et la sortie est:

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]] 

J'ai essayé d'exécuter le code ci-dessus avec un nombre différent de des caractéristiques et des échantillons et je chaque fois que les trois arbres retournent exactement la même sortie, alors que je m'attends à ce que la sortie retournée par tree3 soit différente. Pourquoi donc? J'utilise sklearn version 0.18.1 en passant.

Répondre

1

Ma conjecture est parce que, dans l'exemple que vous affectez à tree2d3,i3 - la ligne incriminée:

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

Lorsque vous signifie probablement:

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

Changement tree2-tree3, sous différents résultats en tree3.

+0

Oh wouah. C'était ça. Merci de l'avoir remarqué. Je vais garder ce post, car il y a très peu de littérature sur l'utilisation de BallTrees et de wminkowski. Il pourrait venir quelqu'un d'autre dans le futur. – shahins