Рубрики

Линейная регрессия с использованием тензорного потока

Предпосылки

Мы кратко подведем итоги линейной регрессии перед ее реализацией с использованием Tensorflow. Поскольку мы не будем вдаваться в подробности ни линейной регрессии, ни Tensorflow, пожалуйста, прочитайте следующие статьи для получения более подробной информации:

Краткое изложение линейной регрессии

Линейная регрессия является очень распространенным статистическим методом, который позволяет нам изучать функцию или отношение из данного набора непрерывных данных. Например, нам даны некоторые точки данных x и соответствующих y и нам нужно изучить связь между ними, которая называется гипотезой .

В случае линейной регрессии гипотеза является прямой линией, т.е.

Где w — вектор с именем Weights, а b — скаляр с именем Bias . Веса и смещения называются параметрами модели.

Все, что нам нужно сделать, это оценить значение w и b из заданного набора данных, так что результирующая гипотеза дает наименьшую стоимость J которая определяется следующей функцией стоимости

где m — количество точек данных в данном наборе данных. Эта функция стоимости также называется средняя квадратическая ошибка .

Для нахождения оптимизированного значения параметров, для которых J минимально, мы будем использовать обычно используемый алгоритм оптимизатора, называемый градиентным спуском . Ниже приведен псевдокод для градиентного спуска:

Repeat untill Convergence {
    w = w - α * δJ/δw
    b = b - α * δJ/δb
}

где αгиперпараметр, называемый скоростью обучения .

Tensorflow

Tensorflow — это вычислительная библиотека с открытым исходным кодом, созданная Google. Это популярный выбор для создания приложений, которые требуют высокопроизводительных численных вычислений и / или нуждаются в использовании графических процессоров для вычислительных целей. Это основные причины, по которым Tensorflow является одним из самых популярных решений для приложений машинного обучения, особенно для глубокого обучения. Он также имеет API-интерфейсы, такие как Estimator, которые обеспечивают высокий уровень абстракции при создании приложений машинного обучения. В этой статье мы не будем использовать какие-либо высокоуровневые API, скорее мы будем строить модель линейной регрессии с использованием низкоуровневого Tensorflow в режиме отложенного выполнения, во время которого Tensorflow создает направленный ациклический граф или DAG, который отслеживает все вычисления, а затем выполняет все вычисления, сделанные внутри сеанса Tensorflow .

Реализация

Начнем с импорта необходимых библиотек. Мы будем использовать Numpy вместе с Tensorflow для вычислений и Matplotlib для построения графиков.

import numpy as np

import tensorflow as tf

import matplotlib.pyplot as plt

Чтобы сделать случайные числа предсказуемыми, мы определим фиксированные начальные числа для Numpy и Tensorflow.

np.random.seed(101)

tf.set_random_seed(101)

Теперь давайте сгенерируем случайные данные для обучения модели линейной регрессии.

# Генерирование случайных линейных данных
# Будет 50 точек данных в диапазоне от 0 до 50

x = np.linspace(0, 50, 50)

y = np.linspace(0, 50, 50)

  
# Добавление шума к случайным линейным данным

x += np.random.uniform(-4, 4, 50)

y += np.random.uniform(-4, 4, 50)

  

n = len(x) Количество точек данных

Позвольте нам визуализировать данные обучения.

# График обучающих данных
plt.scatter(x, y)

plt.xlabel('x')

plt.xlabel('y')

plt.title("Training Data")

plt.show()

Выход:

Теперь мы начнем создавать нашу модель с определения заполнителей X и Y , чтобы мы могли подавать наши обучающие примеры X и Y в оптимизатор во время учебного процесса.

X = tf.placeholder("float")

Y = tf.placeholder("float")

Теперь мы объявим две обучаемые переменные Tensorflow для весов и смещений и инициализируем их случайным образом, используя np.random.randn() .

W = tf.Variable(np.random.randn(), name = "W")

b = tf.Variable(np.random.randn(), name = "b")

Теперь мы определим гиперпараметры модели, скорость обучения и количество эпох.

learning_rate = 0.01

training_epochs = 1000

Теперь мы будем строить гипотезу, функцию стоимости и оптимизатор. Мы не будем внедрять оптимизатор градиентного спуска вручную, поскольку он встроен в Tensorflow. После этого мы будем инициализировать переменные.

# Гипотеза

y_pred = tf.add(tf.multiply(X, W), b)

  
# Средняя функция ошибки квадрата

cost = tf.reduce_sum(tf.pow(y_pred-Y, 2)) / (2 * n)

  
# Оптимизатор градиентного спуска

optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)

  
# Global Variables Initializer

init = tf.global_variables_initializer()

Теперь мы начнем учебный процесс внутри сеанса Tensorflow.

# Запуск сеанса Tensorflow
with tf.Session() as sess:

      

    # Инициализация переменных

    sess.run(init)

      

    # Перебирая все эпохи

    for epoch in range(training_epochs):

          

        # Подача каждой точки данных в оптимизатор с помощью Feed Dictionary

        for (_x, _y) in zip(x, y):

            sess.run(optimizer, feed_dict = {X : _x, Y : _y})

          

        # Отображение результата через каждые 50 эпох

        if (epoch + 1) % 50 == 0:

            # Расчет стоимости за каждую эпоху

            c = sess.run(cost, feed_dict = {X : x, Y : y})

            print("Epoch", (epoch + 1), ": cost =", c, "W =", sess.run(W), "b =", sess.run(b))

      

    # Хранение необходимых значений для использования вне сеанса

    training_cost = sess.run(cost, feed_dict ={X: x, Y: y})

    weight = sess.run(W)

    bias = sess.run(b)

Выход:

Epoch: 50 cost = 5.8868036 W = 0.9951241 b = 1.2381054
Epoch: 100 cost = 5.7912707 W = 0.99812365 b = 1.0914398
Epoch: 150 cost = 5.7119675 W = 1.0008028 b = 0.96044314
Epoch: 200 cost = 5.6459413 W = 1.0031956 b = 0.8434396
Epoch: 250 cost = 5.590799 W = 1.0053328 b = 0.7389357
Epoch: 300 cost = 5.544608 W = 1.007242 b = 0.6455922
Epoch: 350 cost = 5.5057883 W = 1.008947 b = 0.56222
Epoch: 400 cost = 5.473066 W = 1.01047 b = 0.48775345
Epoch: 450 cost = 5.4453845 W = 1.0118302 b = 0.42124167
Epoch: 500 cost = 5.421903 W = 1.0130452 b = 0.36183488
Epoch: 550 cost = 5.4019217 W = 1.0141305 b = 0.30877414
Epoch: 600 cost = 5.3848577 W = 1.0150996 b = 0.26138115
Epoch: 650 cost = 5.370246 W = 1.0159653 b = 0.21905091
Epoch: 700 cost = 5.3576994 W = 1.0167387 b = 0.18124212
Epoch: 750 cost = 5.3468933 W = 1.0174294 b = 0.14747244
Epoch: 800 cost = 5.3375573 W = 1.0180461 b = 0.11730931
Epoch: 850 cost = 5.3294764 W = 1.0185971 b = 0.090368524
Epoch: 900 cost = 5.322459 W = 1.0190892 b = 0.0663058
Epoch: 950 cost = 5.3163586 W = 1.0195289 b = 0.044813324
Epoch: 1000 cost = 5.3110332 W = 1.0199214 b = 0.02561663

Теперь давайте посмотрим на результат.

# Расчет прогнозов

predictions = weight * x + bias

print("Training cost =", training_cost, "Weight =", weight, "bias =", bias, '\n')

Выход:

Training cost = 5.3110332 Weight = 1.0199214 bias = 0.02561663

Обратите внимание, что в этом случае и вес, и смещение являются скалярами. Это потому, что мы рассмотрели только одну зависимую переменную в наших данных обучения. Если в нашем обучающем наборе данных есть m зависимых переменных, то Weight будет m-мерным вектором, а смещение будет скалярным.

Наконец, мы наметим наш результат.

# График результатов

plt.plot(x, y, 'ro', label ='Original data')

plt.plot(x, predictions, label ='Fitted line')

plt.title('Linear Regression Result')

plt.legend()
plt.show()

Выход:

Рекомендуемые посты:

Линейная регрессия с использованием тензорного потока

0.00 (0%) 0 votes