6
votes

Distance euclidienne avec des poids

J'utilise actuellement sciped pour calculer la distance euclidienne xxx

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?

Qu'est-ce que j'ai maintenant: SQRT ((A1-B1) ^ 2 + (A2 -b2) ^ 2 + ... + (a5-b5) ^ 2)

Ce que je veux: sqrt (w1 (A1-B1) ^ 2 + w2 (A2 -b2) ^ 2 + ... + w5 (A5-B5) ^ 2) à l'aide d'écrasé ou d'un autre moyen efficace de le faire.

merci


0 commentaires

3 Réponses :


1
votes

Définissez simplement-le vous-même. Quelque chose comme ça devrait faire l'astuce: xxx


4 commentaires

Ce n'est pas la norme contenue dans la question - vous avez au carré des poids. De plus, le .sum () est totalement redondant, q * q.t est le produit intérieur du vecteur avec lui-même, c'est-à-dire. C'est est la somme.


Vous êtes correct sur les poids, j'aurais dû être plus prudent, mais votre critique sur le .sum () étant complètement redondant est égaré. Le résultat de q * q.t 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 () pour lancer un scalaire? np.asscalar 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 .. Je suppose juste que les auteurs de Scipy savent ce qui est le meilleur



9
votes

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

Entrez la description de l'image ici

alors cela devrait alors faire Le travail: xxx


0 commentaires

1
votes

Si vous voulez continuer à utiliser la fonction SCIPY, vous pouvez pré-traiter le vecteur comme celui-ci. xxx pré>

Cependant, il a l'air plus lent que P>

def weightedL2(a, b, w):
    q = a-b
    return np.sqrt((w*q*q).sum())


0 commentaires