Введение:
Линейная регрессия — это фундаментальный алгоритм машинного обучения, который широко используется в различных приложениях, таких как финансы, маркетинг и инженерия. Это метод прогнозирования непрерывной выходной переменной на основе одной или нескольких входных переменных путем нахождения линейной зависимости между ними. В этом сообщении блога мы рассмотрим, как реализовать линейную регрессию с помощью библиотеки Python NumPy.
import numpy as np # Generate some random training data num_examples = 100 num_features = 3 num_targets = 2 X = np.random.randn(num_examples, num_features) # input data W_true = np.random.randn(num_targets, num_features) # true model weights b_true = np.random.randn(num_targets, 1) # true bias y_true = X.dot(W_true.T) + b_true.T # true target variable noise = 0.1 * np.random.randn(num_examples, num_targets) # add some noise to target variable y = y_true + noise # observed target variable # Initialize model parameters W = np.zeros((num_targets, num_features)) b = np.zeros((num_targets, 1)) # Set hyperparameters learning_rate = 0.01 num_iterations = 1000 # Gradient descent loop for i in range(num_iterations): # Compute predicted values y_pred = X.dot(W.T) + b.T # Compute gradient of cost function with respect to W and b grad_W = -(2/num_examples) * (y - y_pred).T.dot(X) grad_b = -(2/num_examples) * np.sum(y - y_pred, axis=0, keepdims=True).T # Update model parameters W = W - learning_rate * grad_W b = b - learning_rate * grad_b # Compute cost function cost = np.mean((y - y_pred)**2) # Print progress if i % 100 == 0: print(f"Epoch {i}: Cost = {cost}") print(f"{y_pred.shape} = {X.shape}x{W.T.shape} + {b.T.shape}") print(f"grad_W: {grad_W.T.shape}, grad_b: {grad_b.T.shape}") # Print final results print("True weights:\n", W_true) print("Estimated weights:\n", W) print("True bias:\n", b_true) print("Estimated bias:\n", b)
Генерация случайных обучающих данных:
Первым шагом в нашей реализации линейной регрессии является создание некоторых случайных обучающих данных. Мы создадим 100 примеров, в каждом из которых будет 3 функции и 2 цели. Мы будем использовать функцию NumPy random.randn
для генерации случайных значений Гаусса для входных данных, истинных весов модели, истинного смещения и шума. Затем мы вычислим истинную целевую переменную, умножив входные данные на истинные веса модели и добавив истинное смещение. Наконец, мы добавим некоторый гауссовский шум к истинной целевой переменной, чтобы создать наблюдаемую целевую переменную.
Инициализация параметров модели:
Следующим шагом является инициализация параметров модели. Мы установим веса в нули и смещение в нули. Мы будем использовать функцию NumPy zeros
для создания массивов соответствующей формы.
Установка гиперпараметров:
Следующим шагом является установка гиперпараметров. Мы установим скорость обучения на 0,01 и количество итераций на 1000.
Цикл градиентного спуска:
Сердцем нашей реализации линейной регрессии является цикл градиентного спуска. На каждой итерации цикла мы будем вычислять прогнозируемые значения, умножая входные данные на веса и добавляя смещение. Затем мы вычислим градиент функции стоимости относительно весов и смещения. Мы обновим веса и смещение, используя градиент и скорость обучения. Наконец, мы вычислим функцию стоимости и распечатаем прогресс.
Печать окончательных результатов:
После завершения цикла градиентного спуска мы напечатаем истинные веса, оценочные веса, истинное смещение и оценочное смещение. Мы будем использовать функцию NumPy mean
для вычисления среднеквадратичной ошибки между наблюдаемой целевой переменной и прогнозируемой целевой переменной.
Заключение:
В этом сообщении блога мы рассмотрели, как реализовать линейную регрессию с помощью библиотеки Python NumPy. Мы сгенерировали некоторые случайные обучающие данные, инициализировали параметры модели, установили гиперпараметры, реализовали цикл градиентного спуска и распечатали окончательные результаты. Линейная регрессия — это простой, но мощный алгоритм, который можно использовать для получения точных прогнозов в различных приложениях. Понимая основы линейной регрессии, мы можем строить более сложные модели и решать более сложные задачи.