[PYTHON] Calculer l'angle entre les vecteurs à n dimensions avec TensorFlow

Je pense que les bons points de TensorFlow sont qu'il est tout à fait excellent en tant qu'outil d'apprentissage automatique, et que les fonctions du système de calcul numérique ne sont pas cachées dans la bibliothèque et peuvent être librement implémentées à l'extérieur. Donc, comme le titre l'indique, * j'ai calculé l'angle entre les vecteurs à n dimensions *.

La formule de calcul est effectuée en utilisant le produit interne des vecteurs. Exprimé sous la forme d'une expression, "cosx=un B/ (|a||b|)Alors, trouvez cosx et convertissez-le enfin en angle.

Prenons d'abord le cas du calcul entre vecteurs bidimensionnels. Je veux définir l'entrée librement plus tard, utilisez donc un espace réservé au lieu de variables et de constantes

import tensorflow as tf

a = tf.placeholder(tf.types.float32, [1, 2])
b = tf.placeholder(tf.types.float32, [1, 2])

Ensuite, le produit interne "a · b" est calculé. Puisque chaque élément des deux vecteurs est connu, il peut être calculé par la formule "a1 b1 + a2 b2". Utilisez tf.matmul () pour multiplier les entrées de grande dimension.

a_dot_b = tf.matmul(a, b, transpose_b=True)
# transpose_b=Si True, permute le nombre de dimensions du deuxième argument(Translocation)Prêt à.
#Cette fois, le vecteur b est[1, 2] -> [2, 1]Modifications de la forme de

Ensuite, la magnitude de chaque vecteur|a|, |b|Demander. La grandeur du vecteur peut être calculée en prenant la racine de la somme des carrés de chaque élément. L'écriture à l'aide de tensorflow ressemble à ceci.

a_abs = tf.sqrt(tf.matmul(a, a, transpose_b=True))
b_abs = tf.sqrt(tf.matmul(b, b, transpose_b=True))

Après cela, la première formule "a ・ b/ (|a||b|)S'applique pour calculer le cosx.

cos = tf.div(a_dot_b, tf.mul(a_abs, b_abs))

Jusqu'à présent, nous avons créé une formule pour trouver "cosx = cosinus calculé par l'angle entre les vecteurs". Entrez un vecteur bidimensionnel spécifique dans cette formule pour calculer le cosinus.

with tf.Session() as sess:
    y = sess.run([cos], feed_dict={a: [[1, 1]], b: [[1, 0]]})[0][0]
# feed_Chaque valeur du dictionnaire passée à dict correspond aux vecteurs d'entrée a et b de cos.
#Puisque ce résultat de calcul est pris comme valeur de la matrice, seule la partie constante contenue est affectée à y.

Jusqu'à présent, le cosinus calculé par l'angle entre les vecteurs a été obtenu. Après cela, si vous utilisez la fonction cosinus inverse arccos, vous pouvez trouver l'angle, mais malheureusement, il n'a pas été implémenté dans tensorflow.

J'étais sur le point d'abandonner, alors! J'ai trouvé que numpy implémentait la fonction arccos! ... Donc, à la fin, utilisez la fonction numpy pour convertir la valeur cosinus en angle.

import numpy as np
print np.arccos(y) * 180 / np.pi
#Le résultat du calcul d'arccos étant le radian, l'angle est calculé en multipliant par 180 et en divisant par le camembert.

l'a fait. Lorsque j'essaye de calculer a = [[1, 1]], b = [[1, 0]] que j'ai entré ci-dessus, il est affiché comme [[45.]]. En effet, les angles formés par a et b sont la base et la diagonale du triangle isocèle 1: 1: √2 qui est familier en mathématiques au lycée, donc l'angle entre eux est de 45 degrés, ce qui est correct. De plus, si a = [[1, 1,73205]], b = [[1, 0]](= 1: 2: √3 triangle rectangle contient deux côtés), une valeur de près de 60 degrés est renvoyée. Allons.

Nous savons maintenant que nous pouvons calculer pour un vecteur bidimensionnel. Ensuite, celui-ci est étendu pour qu'il puisse correspondre à un vecteur de n'importe quel nombre de dimensions ainsi qu'à deux dimensions.

Tout ce que vous avez à faire est de définir le nombre de dimensions du premier espace réservé sur Aucun.

a = tf.placeholder(tf.types.float32, [1, None])
b = tf.placeholder(tf.types.float32, [1, None])
# shape(2ème argument de l'espace réservé)Si None est spécifié pour l'élément de, il sera possible de gérer n'importe quelle valeur de n'importe quel nombre de dimensions.

C'est fait. Après cela, mettez votre valeur préférée dans le vecteur d'entrée et essayez de calculer. Par exemple

with tf.Session() as sess:
    y = sess.run([cos], feed_dict={a: [[1, 1, 1]], b: [[1, 1, 0]]})[0][0]
print np.arccos(y) * 180 / np.pi
# => [35.26438522]

Les vecteurs d'entrée a et b représentent "l'angle formé par la ligne diagonale de la surface inférieure du cube carré et la ligne diagonale pénétrant au centre". Si vous calculez, c'est certainement autour de 35-36 degrés.

En utilisant TensorFlow de cette manière, le calcul vectoriel peut être facilement effectué. De même, il semble que la matrice puisse être calculée de manière flexible, je vais donc essayer cela également.

Voici le code mis en œuvre cette fois. (Correspondant au vecteur à n dimensions)

import tensorflow as tf
import numpy as np

a = tf.placeholder(tf.types.float32, [1, None])
b = tf.placeholder(tf.types.float32, [1, None])

a_dot_b = tf.matmul(a, b, transpose_b=True)
a_abs = tf.sqrt(tf.matmul(a, a, transpose_b=True))
b_abs = tf.sqrt(tf.matmul(b, b, transpose_b=True))

cos = tf.div(a_dot_b, tf.mul(a_abs, b_abs))

with tf.Session() as sess:
    y = sess.run([cos], feed_dict={a: [[1, 1, 1]], b: [[1, 1, 0]]})[0][0]
print np.arccos(y) * 180 / np.pi

Recommended Posts

Calculer l'angle entre les vecteurs à n dimensions avec TensorFlow
Calculez le décalage horaire entre deux colonnes avec Pandas DataFrame
Calculez la correspondance entre deux divisions
Calculez la similitude entre les phrases avec Doc2Vec, une évolution de Word2Vec
Ajustez l'espacement entre les chiffres avec Matplotlib
Calculez le nombre total de combinaisons avec python
Chargez le fichier de modèle TensorFlow .pb avec readNetFromTensorflow ().
Zundokokiyoshi avec TensorFlow
Casser des blocs avec Tensorflow
Examiner la relation entre TensorFlow et Keras pendant la période de transition
Identifiez le nom de l'image de la fleur avec des keras (flux tenseur)
Calculer le coefficient de régression d'une analyse de régression simple avec python
Calculer le produit des matrices avec une expression de caractère?