Пример использования Tensorflow для решения геометрических задач

TensorFlow

Есть такой на Жихупроблема, содержание - координаты трех точек в известном пространстве, найти координаты центра окружности, образованной тремя точками (программная реализация)?

Согласно определению круга, суть этой задачи состоит в том, чтобы найти точку с равными расстояниями до трех известных точек.Используя математические знания, ее можно решить следующим образом:

Например: Учитывая a (x1, y1) b (x2, y2) c (x3, y3), найдите координаты центра описанной окружности O (x, y)
1. Во-первых, центр описанной окружности является пересечением вертикальных биссектрис трех сторон треугольника.В соответствии с равным расстоянием от центра до вершины можно составить следующие уравнения:    
(x1-x)*(x1-x)+(y1-y)*(y1-y)=(x2-x)*(x2-x)+(y2-y)*(y2-y);       
(x2-x)*(x2-x)+(y2-y)*(y2-y)=(x3-x)*(x3-x)+(y3-y)*(y3-y);
2. Упростите, чтобы получить:  
2*(x2-x1)*x+2*(y2-y1)y=x2^2+y2^2-x1^2-y1^2;        
2*(x3-x2)*x+2*(y3-y2)y=x3^2+y3^2-x2^2-y2^2;        
Пусть: A1=2*(x2-x1);      
B1=2*(y2-y1);  
C1=x2^2+y2^2-x1^2-y1^2;            
A2=2*(x3-x2);  
B2=2*(y3-y2);    
C2=x3^2+y3^2-x2^2-y2^2;        
То есть: A1*x+B1y=C1;
A2*x+B2y=C2;
3. Наконец, согласно закону Крамера:  
х=((C1*B2)-(C2*B1))/((A1*B2)-(A2*B1));  
y=((A1*C2)-(A2*C1))/((A1*B2)-(A2*B1));

Конечно, сегодня мы здесь не для того, чтобы изучать математические формулы и математические выводы.TensorflowЭто инструмент глубокого обучения с открытым исходным кодом Google, Фактически, мы можем использовать Tensoflow, чтобы предоставить мощные возможности математических вычислений для решения подобных математических задач.

Мы можем использовать этот вопросАлгоритм градиентного спуска, потому что центр окружности является оптимальным решением, а никакая другая точка не удовлетворяет. (Предполагается, что эти три точки не лежат на прямой, иначе решения нет)

Что ж, давайте сначала посмотрим на код, а потом объясним.

import tensorflow as tf
import numpy

# Parameters
learning_rate = 0.1
training_epochs = 3000
display_step = 50

# Training Data, 3 points that form a triangel
train_X = numpy.asarray([3.0,6.0,9.0])
train_Y = numpy.asarray([7.0,9.0,7.0])

# tf Graph Input
X = tf.placeholder("float")
Y = tf.placeholder("float")

# Set vaibale for center
cx = tf.Variable(3, name="cx",dtype=tf.float32)
cy = tf.Variable(3, name="cy",dtype=tf.float32)

# Caculate the distance to the center and make them as equal as possible
distance = tf.pow(tf.add(tf.pow((X-cx),2),tf.pow((Y-cy),2)),0.5)
mean = tf.reduce_mean(distance)
cost = tf.reduce_sum(tf.pow((distance-mean),2)/3)
# Gradient descent
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)

# Initialize the variables (i.e. assign their default value)
init = tf.global_variables_initializer()

# Start training
with tf.Session() as sess:
    sess.run(init)

    # Fit all training data
    for epoch in range(training_epochs):
        sess.run(optimizer, feed_dict={X: train_X, Y: train_Y})
        c = sess.run(cost, feed_dict={X: train_X, Y:train_Y})
        if (c - 0) < 0.0000000001:
            break
        #Display logs per epoch step
        if (epoch+1) % display_step == 0:
            c = sess.run(cost, feed_dict={X: train_X, Y:train_Y})
            m = sess.run(mean, feed_dict={X: train_X, Y:train_Y})
            print "Epoch:", '%04d' % (epoch+1), "cost=", "{:.9f}".format(c), \
                "CX=", sess.run(cx), "CY=", sess.run(cy), "Mean=", "{:.9f}".format(m)

    print "Optimization Finished!"
    training_cost = sess.run(cost, feed_dict={X: train_X, Y: train_Y})
    print "Training cost=", training_cost, "CX=", round(sess.run(cx),2), "CY=", round(sess.run(cy),2), "R=", round(m,2), '\n'

Запустив приведенный выше код Python, результат будет следующим:

Epoch: 0050 cost= 0.290830940 CX= 5.5859795 CY= 2.6425467 Mean= 5.657848835
Epoch: 0100 cost= 0.217094064 CX= 5.963002 CY= 3.0613017 Mean= 5.280393124
Epoch: 0150 cost= 0.173767462 CX= 5.997781 CY= 3.5245996 Mean= 4.885882378
Epoch: 0200 cost= 0.126330480 CX= 5.9999194 CY= 4.011508 Mean= 4.485837936
Epoch: 0250 cost= 0.078660280 CX= 5.9999976 CY= 4.4997787 Mean= 4.103584766
Epoch: 0300 cost= 0.038911112 CX= 5.9999976 CY= 4.945466 Mean= 3.775567770
Epoch: 0350 cost= 0.014412695 CX= 5.999998 CY= 5.2943544 Mean= 3.535865068
Epoch: 0400 cost= 0.004034557 CX= 5.999998 CY= 5.5200934 Mean= 3.390078306
Epoch: 0450 cost= 0.000921754 CX= 5.999998 CY= 5.6429324 Mean= 3.314131498
Epoch: 0500 cost= 0.000187423 CX= 5.999998 CY= 5.7023263 Mean= 3.278312683
Epoch: 0550 cost= 0.000035973 CX= 5.999998 CY= 5.7292333 Mean= 3.262284517
Epoch: 0600 cost= 0.000006724 CX= 5.999998 CY= 5.7410445 Mean= 3.255288363
Epoch: 0650 cost= 0.000001243 CX= 5.999998 CY= 5.746154 Mean= 3.252269506
Epoch: 0700 cost= 0.000000229 CX= 5.999998 CY= 5.7483506 Mean= 3.250972748
Epoch: 0750 cost= 0.000000042 CX= 5.999998 CY= 5.749294 Mean= 3.250416517
Epoch: 0800 cost= 0.000000008 CX= 5.999998 CY= 5.749697 Mean= 3.250178576
Epoch: 0850 cost= 0.000000001 CX= 5.999998 CY= 5.749871 Mean= 3.250076294
Epoch: 0900 cost= 0.000000000 CX= 5.999998 CY= 5.7499437 Mean= 3.250033140
Optimization Finished!
Training cost= 9.8869656e-11 CX= 6.0 CY= 5.75 R= 3.25 

После более чем 900 итераций центральное положение равно (6,0, 5,75), а радиус равен 3,25.

# Parameters
learning_rate = 0.1
training_epochs = 3000
display_step = 50
  • Learning_rate — скорость градиентного спуска.Чем больше значение, тем быстрее сходимость, но также может пропустить оптимальное решение
  • training_epochs — количество итераций обучения
  • display_step — количество итераций для отображения текущего результата расчета.
# Training Data, 3 points that form a triangel
train_X = numpy.asarray([3.0,6.0,9.0])
train_Y = numpy.asarray([7.0,9.0,7.0])

# tf Graph Input
X = tf.placeholder("float")
Y = tf.placeholder("float")

# Set vaibale for center
cx = tf.Variable(3, name="cx",dtype=tf.float32)
cy = tf.Variable(3, name="cy",dtype=tf.float32)
  • train_X, train_Y — координаты x, y трех точек, здесь мы выбрали (3, 7) (6, 9) (9, 7) три точки
  • X, Y - это ввод расчета, во время расчета мы будем использовать обучающие данные для ввода X, Y
  • cx, cy - центральная точка, которую мы хотим найти, начальное значение установлено в (3, 3), общий алгоритм обучения будет использовать случайное начальное значение, здесь я выбираю точку в треугольнике, это обычно снижает частоту итераций .
# Caculate the distance to the center and make them as equal as possible
distance = tf.pow(tf.add(tf.pow((X-cx),2),tf.pow((Y-cy),2)),0.5)
mean = tf.reduce_mean(distance)
cost = tf.reduce_sum(tf.pow((distance-mean),2)/3)
# Gradient descent
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)

Эти несколько строк кода являются сердцем алгоритма.

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

Вот процесс обучения:

# Start training
with tf.Session() as sess:
    sess.run(init)

    # Fit all training data
    for epoch in range(training_epochs):
        sess.run(optimizer, feed_dict={X: train_X, Y: train_Y})
        c = sess.run(cost, feed_dict={X: train_X, Y:train_Y})
        if (c - 0) < 0.0000000001:
            break
        #Display logs per epoch step
        if (epoch+1) % display_step == 0:
            c = sess.run(cost, feed_dict={X: train_X, Y:train_Y})
            m = sess.run(mean, feed_dict={X: train_X, Y:train_Y})
            print "Epoch:", '%04d' % (epoch+1), "cost=", "{:.9f}".format(c), \
                "CX=", sess.run(cx), "CY=", sess.run(cy), "Mean=", "{:.9f}".format(m)

    print "Optimization Finished!"
    training_cost = sess.run(cost, feed_dict={X: train_X, Y: train_Y})
    print "Training cost=", training_cost, "CX=", round(sess.run(cx),2), "CY=", round(sess.run(cy),2), "R=", round(m,2), '\n'
  • Инициализировать сеанс tf
  • начать итерацию
  • Рассчитайте значение стоимости.Когда стоимость меньше определенного значения, запускается итерация, указывающая, что мы нашли центр круга.
  • Наконец, распечатайте результаты обучения

Оригинальное название — точка в пространстве, а мой пример — точка на плоскости, но принципиальной разницы нет. Вы можете добавить данные по оси Z. Этот вопрос, трехмерный на самом деле избыточный, можно решить, спроецировав три точки пространства на плоскость.

Я реализовал это с помощью JSдругой алгоритм, но не всегда сходится. Вы можете взглянуть на:

Среди них три точки состояния зеленого цвета, красный кружок — конечный результат обучения, а желтая центральная точка — траектория обучения.

Используя этот пример, я пытаюсь сказать:

  • Tensorflow — это не просто инструмент глубокого обучения, он предоставляет мощные возможности обработки данных и может использоваться для решения многих математических задач.
  • Суть машинного обучения состоит в том, чтобы найти ответ через набор данных, что также является ролью математики, поэтому многие математические задачи могут быть решены с помощью идеи машинного обучения.