Вычисление коэффициента линейной регрессии

Вопрос или проблема

class LR:

    def __init__(self, x, y):
        self.x = x
        self.y = y
        self.xmean = np.mean(x)
        self.ymean = np.mean(y)
        self.x_xmean = self.x - self.xmean
        self.y_ymean = self.y - self.ymean
        self.covariance = sum(self.x_xmean * self.y_ymean)
        self.variance = sum(self.x_xmean * self.x_xmean)

    def getYhat(self, input_x):
        input_x = np.array(input_x)
        return self.intercept + self.slope * input_x    

    def getCoefficients(self):
        self.slope = self.covariance/self.variance
        self.intercept = self.ymean - (self.xmean * self.slope)
        return self.intercept, self.slope

Я использую приведенный выше класс для расчета перехвата и наклона для простой линейной регрессии. Однако я хотел бы немного изменить его, чтобы он работал и для множественной линейной регрессии, но БЕЗ использования матричной формулы $(XX^T)^{-1}X^TY$.

Пожалуйста, подскажите.

Хотя я не уверен, нужно ли вам производить вычисления в классе, есть относительно более простой способ извлечь коэффициенты перехвата и наклона, используя linear_model из sklearn и pandas, если это вам подходит.

Предположим, что у нас есть следующие переменные:

y: [-0.006,-0.001,0.015,0.017,-0.0019,-0.005]
x1: [-0.018,-0.008,0.011,0.017,-0.008,-0.002]
x2: [-0.04,-0.003,0.012,0.011,-0.004,-0.009]
x3: [-0.06,-0.007,0.3,0.09,-0.005,-0.006]

Теперь давайте запустим линейную регрессию, используя sklearn:

from pandas import DataFrame
from sklearn import linear_model
import statsmodels.api as sm

dataset = {'y': [-0.006,-0.001,0.015,0.017,-0.0019,-0.005],
                'x1': [-0.018,-0.008,0.011,0.017,-0.008,-0.002],
                'x2': [-0.04,-0.003,0.012,0.011,-0.004,-0.009],
                'x3': [-0.06,-0.007,0.3,0.09,-0.005,-0.006]       
                }

df = DataFrame(dataset,columns=['y','x1','x2','x3'])

X = df[['x1','x2','x3']]
Y = df['y']

# Модель регрессии
regr = linear_model.LinearRegression()
regr.fit(X, Y)

print('Перехват: \n', regr.intercept_)
print('Коэффициенты: \n', regr.coef_)

После этого наши коэффициенты перехвата и наклона будут напечатаны:

>>> print('Перехват: \n', regr.intercept_)
Перехват: 
 0.0022491408670789535
>>> print('Коэффициенты: \n', regr.coef_)
Коэффициенты: 
 [ 0.62742415 -0.06618899  0.02384715]

Надеюсь, это будет полезно, если вы просто хотите извлечь коэффициенты перехвата и наклона.

Что я обнаружил в этом роде задач, так это то, что очень полезно хотя бы один раз закодировать это непосредственно в numpy и действительно попытаться понять, что происходит.

Я решил это (для собственного обучения) в ядре kaggle.

Код, который я использовал, это

def predict(my_X, my_W, my_B):
    return np.dot(my_W, my_X) + my_B

def error(y, y_hat):
    diff = sum(y - y_hat)
    squared_diff = diff ** 2
    error = (1/n) * squared_diff
    return error

def derivative(X, w, b, y):
    n = len(y)
    y_hat = predict(X, w, b)
    diff_sum = sum(y-y_hat)

    w_derivative = (2/n) * sum((y_hat - y) * X)
    b_derivative = (2/n) * sum(y_hat-y)

    return w_derivative, b_derivative

lr = 0.01
for iteration in range(0, 100):
    y_hat = predict(X, w, b)

    if iteration % 10 == 0:
        print("Итерация ", iteration, "Ошибка", error(y, y_hat))

    W_derivative, b_derivative = derivative(X, w, b, y)

    w = w - (lr * W_derivative)
    b = b - (lr * b_derivative)

Затем вы можете проверить переменные W и b и увидеть сами, что происходит 🙂

Ответ или решение

Вычисление коэффициентов линейной регрессии: Пошаговое руководство

Линейная регрессия – это классический метод статистического анализа, используемый для моделирования зависимостей между одной целевой переменной и одной или несколькими независимыми переменными. Данная статья описывает, как рассчитать коэффициенты линейной регрессии с использованием Python, а именно, как адаптировать стандартный алгоритм для работы с множественной линейной регрессией без использования матричных формул.

Основы линейной регрессии

В простейшем виде уравнение линейной регрессии записывается как:

[ Y = \beta_0 + \beta_1X_1 + \beta_2X_2 + … + \beta_nX_n + \epsilon ]

где:

  • (Y) – зависимая переменная,
  • (X_i) – независимые переменные,
  • (\beta_0) – коэффициент свободного членa (пересечение),
  • (\beta_i) – коэффициенты, соответствующие независимым переменным,
  • (\epsilon) – ошибка.

Модификация кода для множественной линейной регрессии

Исходный класс LR, который мы видим, предоставляет функциональность для простой линейной регрессии. Чтобы расширить этот функционал для множественной линейной регрессии, необходимо реализовать расчеты для каждого из коэффициентов. Вот шаги, которые вам нужно предпринять:

  1. Обновление конструктора: Подготовьте метод для работы с множественными переменными. Вначале вычислите средние значения всех независимых переменных.

  2. Расчет коэффициентов: Вместо прямых вычислений с использованием covariance и variance для одной независимой переменной, используйте метод наименьших квадратов для многомерных данных.

Вот как можно изменить класс:

import numpy as np

class LinearRegression:

    def __init__(self, X, y):
        self.X = np.array(X)
        self.y = np.array(y)
        self.n = len(y)
        self.coefficients = np.zeros(self.X.shape[1] + 1)  # для beta_0 и beta_1, beta_2, ...

    def fit(self):
        # Добавьте колонку единиц для вычисления свободного члена beta_0
        X_b = np.c_[np.ones((self.n, 1)), self.X]  # добавляем x0 = 1
        self.coefficients = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(self.y)

    def predict(self, X_new):
        X_new_b = np.c_[np.ones((X_new.shape[0], 1)), X_new]  # добавляем x0 = 1
        return X_new_b.dot(self.coefficients)

    def get_coefficients(self):
        return self.coefficients

Объяснение кода

  1. Конструктор __init__: В качестве аргументов передаются данные X (независимые переменные) и y (зависимая переменная). Код создаёт массивы и инициализирует коэффициенты.

  2. Метод fit: В этом методе мы вычисляем матрицу коэффициентов методом наименьших квадратов. Добавляется колонка единиц для учёта свободного члена.

  3. Метод predict: Метод для предсказания значений на основе обученной модели.

  4. Метод get_coefficients: Этот метод возвращает найденные коэффициенты.

Пример использования

# Данные
y = [-0.006,-0.001,0.015,0.017,-0.0019,-0.005]
x1 = [-0.018,-0.008,0.011,0.017,-0.008,-0.002]
x2 = [-0.04,-0.003,0.012,0.011,-0.004,-0.009]
x3 = [-0.06,-0.007,0.3,0.09,-0.005,-0.006]

X = np.array([x1, x2, x3]).T  # Транспонируем, чтобы получить правильную форму
model = LinearRegression(X, y)

# Обучение модели
model.fit()

# Получение коэффициентов
print("Коэффициенты:", model.get_coefficients())

Заключение

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

Советы по быстрой проверке работоспособности кода включают использование тестовых данных и сравнение с библиотеками как scikit-learn для валидации ваших результатов.

Оцените материал
Добавить комментарий

Капча загружается...