Линейная регрессия. Реализация линейной и полиномиальной регрессии в Python c применением numpy Постановка задачи
Скачать 322.77 Kb.
|
Реализация линейной и полиномиальной регрессии в Python c применением numpy Постановка задачи Предположим нам необходимо вычислить параметры линейной регрессии функции одной переменной. Для решения задачи необходимо получить или сгенерировать набор данных (х) с соответствующими значениями y (или рассчитать значение функции в точках, заданным набором x), построить график функции, расcчитать параметры линейной регрессии, используя x и y как обучающее множество. Напомним, что задача регрессии формулируется как поиск минимальной функции стоимости 2 ) ( ) ( 1 ) ) ( ( 2 1 min ) ( i i m i y x h m J − = = где m – множество примеров, h – функция гипотезы, которая может быть линейной ( x h 1 0 + = ) или нелинейной (например, 2 2 1 0 x x h + + = ) c различным набором параметров i В случае линейной регрессии функция гипотезы является линейной. Для нахождения оптимальной функции ) (x h применяется алгоритм градиентного спуска (gradient descent), суть которого заключается в последовательном изменении параметров 1 0 , с использованием выражения ) , ( : 1 0 J j j j − = , где – параметр обучения, а ) , ( 1 0 J j является производной функции стоимости по j При этом шаги алгоритма выполняются так, что вначале происходит одновременное изменение обоих параметров на основании выражения 3.2 и только затем присваивание им новых значений. Другими словами, алгоритмическая последовательность одного шага алгоритма для случая двух параметров, выраженная на псевдокоде, будет следующей: ) , ( : 1 0 0 0 0 J temp − = ; ) , ( : 1 0 1 1 1 J temp − = ; 0 0 : temp = ; 1 1 : temp = С учетом дифференцирования В зависимости от параметра обучения алгоритм может достигать минимума (сходиться) или же, при слишком большом , не сходиться. Отметим, что x0 =1. Вместо алгоритма градиентного спуска для нахождения параметров j можно использовать матричное выражение y X X X T T 1 ) ( − = , (1) где – вектор параметров, 1 ) ( − X X T – обратная матрица X X T , T X – транспонированная матрица X Преимуществом матричных операций является то, что нет необходимости подбирать параметр и выполнять несколько итераций алгоритма. Недостаток связан с необходимостью получения обратной матрицы, сложность вычисления которой пропорциональна ) ( 3 n O , а также невозможностью получения обратной матрицы в некоторых случаях. Данные Для создания набора данных воспользуемся командой x=np.linspace(0,10,30) или x=np.array(np.linspace(0,10,30)) Таким образом, в наборе данных будет 30 значений от 0 до 10. Для расчета значений зависимой переменной воспользуемся выражением y=np.power(x,2)+1 График фукции приведен на рисунке Метод решения Для решения задачи можно использовать несколько методов. Во первых, можно реализовать алгоритм градиентного спуска для нахождения параметров линейной регрессии. Во вторых, можно использовать матричное выражение, которое в Python реализуется выражением theta=np.dot( np.linalg.inv(np.dot(X.T,X)) , np.dot(X.T,y) ) В третьих, можно воспользоваться моделью линейной регрессии, входящей в состав sklearn, импортировав его следующей директивой from sklearn.linear_model import LinearRegression Реализуем алгоритм градиентного спуска во первых подключим необходимые библиотеки % matplotlib inline import matplotlib.pyplot as plt import numpy as np import time Time позволит нам рассчитать время выполнения программы. После формированияобучающего множества xr=np.matrix(np.linspace(0,10,30)) x=xr.T y=np.power(x,2)+1 и его визуализации в виде графика plt.plot(x,y) рассчитаем количество обучающих примеров и сформируем матрицу примеров m=x.size on=np.ones([m,1]) X=np.concatenate((on,x),axis=1) Это матрица в первой колонке которой стоят единицы. а во второй значения х. Затем зададим начальные значения коэффициентов регрессии theta=np.matrix('0.1;1.3') и рассчитаем значения функции гипотезы h=np.dot(X,theta) plt.plot(x,h) Получим график вида где красная прямая - фенкция гипотезы при заданных нами начальных параметрах theta. Зададим параметр обучения и число итераций alpha=0.05 iter=500 Цикл нахождения парамертов регрессии выглядит следующим образом for i in range(iter): theta[0][0]=theta[0][0]-alpha*(1/m)*np.sum(h-y) theta[1][0]=theta[1][0]-alpha*(1/m)*np.sum(np.multiply((h-y),x)) h=np.dot(X,theta) Результат может выглядеть примерно так где зеленая прямая - найденная нами регрессионная зависимость. Среднеквадратическая ошибка рассчитывается так mse=np.sum(np.power((h-y),2)) Вызов функции и оценка времени ее работы t0=time.time() regressionByIteration() t1=time.time() #print(t0) print('regressionByIteration takes ',(t1-t0)) Полный листинг программы приведен ниже Листинг программы linReg_Python_numpy_001 % matplotlib inline import time def regressionByIteration(): import matplotlib.pyplot as plt import numpy as np xr=np.matrix(np.linspace(0,10,30)) #xr=np.linspace(0,10,30) x=xr.T y=np.power(x,2)+1 plt.plot(x,y) m=x.size on=np.ones([m,1]) X=np.concatenate((on,x),axis=1) theta=np.matrix('0.1;1.3') h=np.dot(X,theta) plt.plot(x,h) #print(h) alpha=0.05 iter=500 j=0 for i in range(iter): theta[0][0]=theta[0][0]-alpha*(1/m)*np.sum(h-y) theta[1][0]=theta[1][0]-alpha*(1/m)*np.sum(np.multiply((h-y),x)) h=np.dot(X,theta) plt.figure(1) plt.plot(x,h,label='regressionByIteration') leg=plt.legend(loc='upper right',shadow=True,fontsize='x-small') leg.get_frame().set_facecolor('#0055DD') leg.get_frame().set_facecolor('#eeeeee') leg.get_frame().set_alpha(0.5) plt.show() mse=np.sum(np.power((h-y),2)) print('regressionByIteration mse= ', mse) t0=time.time() regressionByIteration() t1=time.time() #print(t0) print('regressionByIteration takes ',(t1-t0)) Задача 1 1 1) Реализуйте расчет параметров полиномиальной регрессии второго порядка. Вы должны получить примерно следующее при числе итераций равном 50. для удобства начальные значения заданы в виде точек зеленого цвета plt.plot(x,y,'og') Задача 2 2 1 решение в linReg_Python_numpy_001_full 2 решение в linReg_Python_numpy_001_full Реализуйте расчет параметров полиномиальной регрессии второго порядка матричным способом (уравнение 1). Вы должны получить примерно следующее. |