Tensorflow – линейные уравнения
О технологиях

Tensorflow – линейные уравнения

478
5 минут

При помощи функции 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)

TensorFlow-Linear-Equations-Example-1-Points.png
Давайте найдем уравнение прямой, проходящей через них.

TensorFlow-Linear-Equations-Example-1-Points-with-line.png

Напомню, что уравнение прямой выглядит следующим образом:

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:

TensorFlow-Linear-Equations-Example-1-Result.png

y=3.0x–1.0

Пример с окружностью

TensorFlow-Linear-Equations-Example-2-Result-Graph.png

Предположим, у нас есть 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()))
Давайте проверим наш результат:
TensorFlow-Linear-Equations-Example-2-Result.png

Давайте проверим наш результат:


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()

Результатом будет наша замечательная окружность с обозначением на ней наших точек:

TensorFlow-Linear-Equations-Example-2-Result-Graph.png

Для записи уравнений используйте MathJax. Посмотреть код формулы можно кликнув правой кнопкой мыши на формулу (Show Math As -> TeX commands)

25 июня 2024
1С в облаке: как повысить производительность приложений
Ни для кого не секрет, что 1С — достаточно требовательна с точки зрения размещения, будь то локальное «железо» или облачная инфраструктура.

В этой статье мы поговорим о тюнинге производительности систем 1С. Обсудим, какие узкие места в инфраструктуре могут повлиять на скорость отклика 1С, и дадим рекомендации по их устранению.
1 минута
1005
19 февраля 2024
Cloud Security Services: безопасное облако для бизнеса
По данным из открытых источников, 9 из 10 опрошенных российских компаний с выручкой от 15 млрд руб. в год активно используют облачные сервисы. Но вместе с востребованностью облачной модели возрастает и обеспокоенность бизнеса: можно ли в облаке выстроить надежную защиту данных?
1 минута
639
20 ноября 2023
Что такое Kubernetes? Знакомимся с дико популярной платформой контейнерной оркестрации
С появлением микросервисной архитектуры и технологии контейнеризации разработчики и администраторы стали совсем по-другому тестировать и развертывать современное ПО.
1 минута
3317
1 ноября 2023
Незаменимых нет. Сервис на базе Nextcloud вместо привычных корпоративных облаков

Привет, Хабр! Меня зовут Александр Фикс, я менеджер по развитию бизнеса K2 Cloud. Сегодня поговорим о тренде локализации, о том, что происходит на рынке файлообменников с уходом западных решений и какие альтернативные продукты есть у бизнеса в данный момент.

1 минута
917
12 января 2023
Российский Kubernetes, какой он? Знакомьтесь, платформа Deckhouse

Если бизнес работает в цифре, строит свои решения на базе микросервисной архитектуры и контейнеров и до последнего времени использовал для этого западную платформу контейнеризации, то актуальная задача сегодня — найти ей адекватную замену.

2 минуты
1326
scrollup