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

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

Напомним, что наша цель — объяснить переменную Y с помощью одной или нескольких переменных Xi. Например, мы можем захотеть предсказать цену автомобиля (обозначается Y), используя его марку (обозначается X1), цвет (обозначается X2), количество уже пройденных километров (обозначается X3) и т. д. Мы также можем рассматривать это как оценку функции h, которая принимает переменные Xi в качестве входных данных и дает оценку значения y в качестве выходных данных, которую можно математически сформулировать следующим образом:

Для линейной регрессии мы предполагаем, что переменная Y может быть смоделирована как средневзвешенное значение входных переменных с дополнительным смещением, как показано ниже.

Что можно переформулировать в матричной форме следующим образом

Каждый вес, соответствующий каждой данной переменной, можно рассматривать как важность, придаваемую этой переменной в окончательном прогнозе Y.

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

Как правило, наиболее часто используемой функцией стоимости является евклидово расстояние между прогнозируемым значением и реальным значением нашей переменной y, эта функция достаточно чувствительна и позволяет нам увидеть, выше ли функция стоимости при приращении одного из параметров функция h, функция стоимости определяется следующим образом:

Где m — общее количество выборок в нашем наборе данных.

Эту функцию стоимости можно переписать в матричной форме следующим образом.

С небольшим матричным вычислением мы можем упростить эту функцию следующим образом

Что может быть дополнительно упрощено как:

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

Что может быть дополнительно упрощено как:

Предполагая, что произведение матриц X' X обратимо, мы имеем,

Поэтому мы можем использовать эту оценку Θ, чтобы найти оптимальные параметры, которые лучше всего соответствуют нашим данным.

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

import math
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
import pandas as pd
df=pd.read_csv('https://raw.githubusercontent.com/navoneel1092283/multivariate_regression/master/data2.txt', header=None)
df.columns=['SqFt','Bedrooms','Price']

Запуск кода дает следующий вывод

Затем мы нормализуем данные, используя следующую команду

df = (df - df.min())/(df.max()-df.min())
df.head()

Запуск кода дает следующий вывод

Теперь мы оценим параметры Θ, которые лучше всего соответствуют нашим данным, используя гипотезу линейной регрессии. Для этого мы можем использовать следующие команды.

#Setting the matrixes
X = df.iloc[:,0:2]
ones = np.ones([X.shape[0],1])
X = np.concatenate((ones,X),axis=1)
y = df.iloc[:,2:3].values
#Calculate the solution
theta = np.dot(np.linalg.inv(np.dot(X.T, X)), np.dot(X.T, y))

Что дает следующее приближенное решение

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

def computeCost(X,y,theta): 
   tobesummed = np.power(((X @ theta.T)-y),2)
   return np.sum(tobesummed)/(2 * len(X))
finalCost = computeCost(X,y,theta.reshape(-1,3))

Что дает следующее значение,

Что приблизительно равно нулю, мы можем сделать вывод, что этот параметр дает оптимальное соответствие нашим данным.

Теперь мы попытаемся найти оптимальные параметры, но с помощью метода градиентного спуска мы можем использовать следующую команду для этого.

def gradientDescent(X,y,theta,iters,alpha):
  cost = np.zeros(iters)
  for i in range(iters):
     theta = theta - (alpha/len(X)) * np.sum(X * (X @ theta.T - y),    axis=0)
     cost[i] = computeCost(X, y, theta)
   return theta,cost
#set hyper parameters
alpha = 0.01
iters = 1000
g,cost = gradientDescent(X,y,theta,iters,alpha)
finalCost = computeCost(X,y,g)

Что дает следующее приближенное решение

Мы видим, что данное решение отличается от приведенного выше, а его стоимость несколько выше, чем у предыдущего. Теперь вопрос в том, как выбрать лучший метод, чтобы найти оптимальные параметры, которые лучше всего соответствуют нашим данным?

Во-первых, у нас может быть два случая, первый — если произведение матриц X ^ TX обратимо, второй — если то if необратимо. В первом случае, если количество выборок m, которое у нас есть, не очень велико, мы можем использовать прямой метод, который даст адекватное решение для наших наборов данных в случае, когда размер нашего набора данных слишком большой, мы отдаем предпочтение методу градиентного спуска, который будет сходиться к адекватному решению после определенного количества итераций.

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

Вывод

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

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