Ich denke, die guten Punkte von TensorFlow sind, dass es sich hervorragend als Werkzeug für maschinelles Lernen eignet und dass die Funktionen des numerischen Berechnungssystems nicht in der Bibliothek verborgen sind und außerhalb frei implementiert werden können. Wie der Titel schon sagt, * habe ich den Winkel zwischen n-dimensionalen Vektoren berechnet *.
Die Berechnungsformel wird unter Verwendung des inneren Produkts von Vektoren durchgeführt. Ausgedrückt als Ausdruck "cosx=a ・ b/ (|a||b|)Finden Sie also cosx und konvertieren Sie es schließlich in einen Winkel.
Betrachten Sie zunächst den Fall der Berechnung zwischen zweidimensionalen Vektoren. Ich möchte die Eingabe später frei einstellen, also verwende Platzhalter anstelle von Variablen und Konstanten
import tensorflow as tf
a = tf.placeholder(tf.types.float32, [1, 2])
b = tf.placeholder(tf.types.float32, [1, 2])
Als nächstes wird das innere Produkt "a · b" berechnet.
Da jedes Element der beiden Vektoren bekannt ist, kann es durch die Formel "a1 b1 + a2 b2" berechnet werden.
Verwenden Sie tf.matmul ()
, um hochdimensionale Eingaben zu multiplizieren.
a_dot_b = tf.matmul(a, b, transpose_b=True)
# transpose_b=Wenn True, tauschen Sie die Anzahl der Dimensionen des zweiten Arguments aus(Translokation)Bereit zu.
#Diesmal ist der Vektor b[1, 2] -> [2, 1]Änderungen an der Form von
Dann die Größe jedes Vektors|a|, |b|Fragen. Die Größe des Vektors kann berechnet werden, indem die Wurzel der Quadratsumme jedes Elements gezogen wird. Das Schreiben mit Tensorflow sieht so aus.
a_abs = tf.sqrt(tf.matmul(a, a, transpose_b=True))
b_abs = tf.sqrt(tf.matmul(b, b, transpose_b=True))
Danach wird die erste Formel "a ・ b/ (|a||b|)Wird angewendet, um cosx zu berechnen.
cos = tf.div(a_dot_b, tf.mul(a_abs, b_abs))
Bisher haben wir eine Formel erstellt, um "cosx = Cosinus berechnet durch den Winkel zwischen Vektoren" zu finden. Geben Sie einen bestimmten zweidimensionalen Vektor in diese Formel ein, um den Kosinus zu berechnen.
with tf.Session() as sess:
y = sess.run([cos], feed_dict={a: [[1, 1]], b: [[1, 0]]})[0][0]
# feed_Jeder an dikt übergebene Wert im Wörterbuch entspricht den Eingabevektoren a und b, die cos hat.
#Da dieses Berechnungsergebnis als Wert der Matrix herausgenommen wird, wird y nur der enthaltene konstante Teil zugewiesen.
Bisher wurde der durch den Winkel zwischen den Vektoren berechnete Kosinus erhalten. Wenn Sie danach die inverse Kosinusfunktion arccos verwenden, können Sie den Winkel finden, der jedoch leider nicht im Tensorflow implementiert wurde.
Ich wollte also aufgeben! Ich fand, dass numpy eine Arccos-Funktion implementiert hat! ... Verwenden Sie am Ende die Funktion numpy, um den Kosinuswert in den Winkel umzuwandeln.
import numpy as np
print np.arccos(y) * 180 / np.pi
#Da das Berechnungsergebnis von Arccos Bogenmaß ist, wird der Winkel durch Multiplizieren mit 180 und Teilen durch den Kuchen berechnet.
erledigt. Wenn ich versuche, a = [[1, 1]], b = [[1, 0]] zu berechnen, das ich oben eingegeben habe, wird es als [[45.]] angezeigt. Dies liegt daran, dass der von a und b gebildete Winkel die Basis und die schräge Seite des gleichschenkligen Dreiecks von 1: 1: √2 ist, das in der Mathematik der High School bekannt ist, sodass ersichtlich ist, dass der Winkel zwischen ihnen bei 45 Grad korrekt ist. Wenn außerdem a = [[1, 1.73205]], b = [[1, 0]](= 1: 2: √3 rechtwinkliges Dreieck enthält zwei Seiten), wird ein Wert von fast 60 Grad zurückgegeben. Komm schon.
Jetzt wissen wir, dass wir für einen zweidimensionalen Vektor berechnen können. Als nächstes wird dies erweitert, so dass es einem Vektor einer beliebigen Anzahl von Dimensionen sowie zwei Dimensionen entsprechen kann.
Sie müssen lediglich die Anzahl der Dimensionen des ersten Platzhalters auf Keine setzen.
a = tf.placeholder(tf.types.float32, [1, None])
b = tf.placeholder(tf.types.float32, [1, None])
# shape(2. Argument des Platzhalters)Wenn für das Element von Keine angegeben ist, können beliebige Werte beliebig viele Dimensionen verarbeitet werden.
Es ist fertig. Geben Sie danach Ihren Lieblingswert in den Eingabevektor ein und versuchen Sie zu berechnen. Zum Beispiel
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]
Die Eingabevektoren a und b repräsentieren "den Winkel, der durch die diagonale Linie der Bodenfläche des quadratischen Würfels und die diagonale Linie, die die Mitte durchdringt, gebildet wird". Wenn Sie rechnen, ist dies sicherlich um 35-36 Grad.
Mit TensorFlow auf diese Weise kann die Vektorberechnung einfach durchgeführt werden. Ebenso scheint es, dass die Matrix flexibel berechnet werden kann, also werde ich das auch versuchen.
Unten ist der diesmal implementierte Code. (Entspricht dem n-dimensionalen Vektor)
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