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