J'utilise actuellement où; A, B sont des vecteurs de 5 dimensions. Cela fonctionne bien maintenant, mais si j'ajoute des poids pour chaque dimension, est-il toujours possible d'utiliser Scipy? P> Qu'est-ce que j'ai maintenant: Ce que je veux: merci p> p> sciped code> pour calculer la distance euclidienne
SQRT ((A1-B1) ^ 2 + (A2 -b2) ^ 2 + ... + (a5-b5) ^ 2) code> p>
sqrt (w1 (A1-B1) ^ 2 + w2 (A2 -b2) ^ 2 + ... + w5 (A5-B5) ^ 2) code> à l'aide d'écrasé ou d'un autre moyen efficace de le faire. p>
3 Réponses :
Définissez simplement-le vous-même. Quelque chose comme ça devrait faire l'astuce:
Ce n'est pas la norme contenue dans la question - vous avez au carré des poids. De plus, le .sum () code> est totalement redondant,
q * q.t code> est le produit intérieur du vecteur avec lui-même, c'est-à-dire. C'est est i> la somme.
Vous êtes correct sur les poids, j'aurais dû être plus prudent, mais votre critique sur le .sum () code> étant complètement redondant est égaré. Le résultat de
q * q.t code> serait une matrice 1x1, qui constituerait un type de retour inattendu pour une fonction NORM, la somme la transformera en scalaire.
Mais pourquoi utiliser somme () code> pour lancer un scalaire?
np.asscalar code> sera plusieurs fois plus vite "?
Je ne connais pas la raison, mais c'est ainsi que c'est comment il est mis en œuvre dans scipy.spatial.distance.euclidien code> .. Je suppose juste que les auteurs de Scipy savent ce qui est le meilleur
La suggestion d'écrire votre propre norme L2 pondérée est une bonne, mais le calcul fourni dans Cette réponse est incorrecte . Si l'intention est de calculer
p>
alors cela devrait alors faire Le travail: p>
Si vous voulez continuer à utiliser la fonction SCIPY, vous pouvez pré-traiter le vecteur comme celui-ci. Cependant, il a l'air plus lent que P> def weightedL2(a, b, w):
q = a-b
return np.sqrt((w*q*q).sum())