Tensorflow – линейные уравнения
Содержание:
При помощи функции tf.matrix_solve TensorFlow может решать системы линейных уравнений.
При помощи функции tf.matrix_solve TensorFlow может решать и системы линейных уравнений (набор связанных функций, записанных, например, следующим образом):
3x+2y=15
4x−y=10
В принципе, эти уравнения можно решить при помощи целого ряда всевозможных методов, но в этой статье мы посмотрим на то, как для этого использовать tf.matrix_solve в TensorFlow.
Пример c обычной прямой
Для начала, давайте рассмотрим простой пример. Вот две точки: p1 и p2, лежащие в двумерном (x, y) пространстве:
p1=(1,2)
p2=(0,−1)
Давайте найдем уравнение прямой, проходящей через них.
Напомню, что уравнение прямой выглядит следующим образом:
y=ax+b
Перепишем это уравнение прямой в следующем виде:
y–ax=b
1/b*y–a/b*x=1
Это стандартное матричное уравнение вида
AX=B
Где
A=[1/b a/b];
X=[x y];
B=1
Полная запись уравнения будет следующей:
[1/b a/b][x y]=[1]
Из этого уравнения надо найти a и b при известном X. Т.е. просто посчитать A:
A=BX−1
С учетом того, что вы уже знакомы с матричными операциями в TensorFlow, сделать это вам не составит труда:
import tensorflow as tf
# Точка p1 = [1, 2]
x1 = tf.constant(1, dtype=tf.float32)
y1 = tf.constant(2, dtype=tf.float32)
point1 = tf.stack([x1, y1])
# Точка p2 = [0, -1]
x2 = tf.constant(0, dtype=tf.float32)
y2 = tf.constant(-1, dtype=tf.float32)
point2 = tf.stack([x2, y2])
# Собираем точки в X = [[1,2],[0 -1]]
X = tf.transpose(tf.stack([point1, point2]))
# B = [1, 1]
B = tf.ones((1, 2), dtype=tf.float32)
Определим операцию умножения и получим A:
# Операция уможения B на X^-1
parameters = tf.matmul(B, tf.matrix_inverse(X))
# Запускаем сессию и получаем результат
with tf.Session() as session:
A = session.run(parameters)
Теперь мы легко получим a и b:
b = 1 / A[0][1]
a = -b * A[0][0]
print(u"Через точки проходит прямая: y = {a}x + {b}".format(a=a, b=b))
Код в Jupyter Notebook:
y=3.0x–1.0
Пример с окружностью
Предположим, у нас есть 3 точки, которые лежат на окружности:
p1=(2,1)
p2=(0,5)
p3=(−1,2)
Давайте найдем уравнение этой окружности.
Каноническое уравнение окружности в общем виде выглядит следующим образом:
x2+y2+dx+ey+f=0
Для определения параметров d, e и f мы создадим отдельный массив A из точек p1, p2 и p3, дополняя его единицами, чтобы создать квадратную матрицу. Т.к. мы ищем три параметра, то наша матрица A должна иметь форму (3, 3).
Т.к. в квадратах x и y нет дополнительных параметров, то наше выражение можно переписать следующим образом:
x2+y2+dx+ey+f=0
dx+ey+f=−( x2+y2)
Далее все происходит по аналогии: матрица A состоит из значений x и y со столбцом состоящим из единиц, а наша матрица B будет отрицанием суммы квадратов x и y. Для пояснения пример для TensorFlow:
import tensorflow as tf
# просто пояснение, никакого смысла
# в переменной points нет
points = tf.constant([[2, 1],
[0, 5],
[-1, 2]], dtype=tf.float64)
# матрица А
A = tf.constant([
[2, 1, 1],
[0, 5, 1],
[-1, 2, 1]
], dtype='float64')
# матрица B
B = -tf.constant([[5], [25], [5]], dtype=tf.float64)
Затем мы используем tf.matrix_solve, чтобы найти массив X, который является параметрами нашего уравнения. Запустив следующий код в сеансе, мы получим три значения: D, E и F:
X = tf.matrix_solve(A, B)
with tf.Session() as session:
result = session.run(X)
D, E, F = result.flatten()
print(u"Искомое уравнение: x**2 + y**2 + {D}x + {E}y + {F} = 0".format(**locals()))
Давайте проверим наш результат:
Давайте проверим наш результат:
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-2.0, 4.0, 100)
y = np.linspace(0.0, 6.0, 100)
X, Y = np.meshgrid(x,y)
F = X**2 + Y**2 -2.0*X -6.0*Y + 5.0
fig = plt.figure(figsize=(8,6))
plt.contour(X,Y,F,[0])
plt.plot([2,0,-1], [1,5,2], 'ro')
plt.gca().set_aspect('equal')
plt.grid()
plt.show()
Результатом будет наша замечательная окружность с обозначением на ней наших точек:
Для записи уравнений используйте MathJax. Посмотреть код формулы можно кликнув правой кнопкой мыши на формулу (Show Math As -> TeX commands)