1.梯度降落法
上文写的求解损失函数的最小二乘法
除了最小二乘法还能够应用梯度降落求解。
咱们先随机给一个值,而后朝着负梯度的方向挪动,也就是迭代,每次失去的值应用J()比之前更小。
这个是指学习率,或者说是步长,这个影响的迭代的快慢。
咱们函数y = (x - 0.1)²/2为例,应用梯度降落的办法,求其y达到最小时,x的值
代码示例
# coding:utf-8import numpy as npimport matplotlib.pyplot as pltfrom matplotlib import font_managerfont = font_manager.FontProperties(fname="/usr/share/fonts/wps-office/msyhbd.ttf", size=25)class OneGard(object): def __init__(self,fx,hx): """ :param fx: 原函数 :param hx: 导函数 """ self.fx = fx self.hx = hx self.x = None self.GD_X = [] self.GD_Y = [] self.iter_num = 0 self.f_change = None self.f_current = None def gard_fun(self,x, alpha=0.5): """ 梯度降落 :param x: 初始随机x值 :param alpha: 学习率 :return: """ self.x = x self.f_change = self.fx(self.x) self.f_current = self.f_change self.GD_X.append(x) self.GD_Y.append(self.f_current) while self.f_change > 1e-10 and self.iter_num < 100: self.iter_num += 1 self.x = self.x - alpha * self.hx(self.x) tmp = self.fx(self.x) self.f_change = np.abs(self.f_current - tmp) self.f_current = tmp self.GD_X.append(self.x) self.GD_Y.append(self.f_current)def f(x): """ y = (x - 0.1)²/2 :param x: :return: """ return (x - 0.1) ** 2 /2def h(x): """ y = (x - 0.1)²/2的导数 :param x: :return: """ return (x - 0.1)gard = OneGard(f, h)gard.gard_fun(x=4,alpha=0.5)print("最终x:{:.2f},y:{:.2f}" .format(gard.x, gard.f_current))print("迭代次数{}" .format( gard.iter_num))print("迭代过程x的取值:\n{}".format(gard.GD_X))# 画图X = np.arange(-4, 4.5, 0.05)Y = np.array(list(map(lambda t: f(t), X)))plt.figure(figsize=(20,10), facecolor='w')plt.plot(X, Y, 'r-', linewidth=2)plt.plot(gard.GD_X, gard.GD_Y, 'bo--', linewidth=2)plt.show()
后果为
最终x:0.10,y:0.00迭代次数19迭代过程x的取值:[4, 2.05, 1.075, 0.5874999999999999, 0.34374999999999994, 0.221875, 0.1609375, 0.13046875000000002, 0.11523437500000001, 0.10761718750000002, 0.10380859375000001, 0.10190429687500001, 0.1009521484375, 0.10047607421875, 0.10023803710937501, 0.10011901855468751, 0.10005950927734375, 0.10002975463867188, 0.10001487731933595, 0.10000743865966798]
图像如下:
机器学习中梯度降落罕用的有三种:
批量梯度降落(BGD)、随机梯度降落(SGD)、小批量梯度降落(MBGD)。
参考 梯度降落法的三种模式BGD、SGD以及MBGD
(这个写的分明明了,以前学的时候,脑子听成了浆糊,看了这篇文,我是恍然大悟)
2.多项式回归
线性回归针对的是而言是一种,对于样本自身而言,样本能够是非线性的。
例如
这时咱们能够领x1 = x, x2 = x²,
失去如下
这样就转变成咱们的相熟的线性回归。
多项式扩大,就是将低纬度空间的点映射到高纬度空间中。
3.其余线性回归
3.1Ridge回归
线性回归的L2正则化通常称为Ridge回归,也叫作岭回归,与规范线性回归的差别,在于它在损失函数上减少了一个L2正则化的项。
是常数系数,是正则化系数,属于一个超参数,须要调参。
太小就会失去解决过拟合的能力,太大就会因力度过大而呈现欠拟合的景象。
3.2 LASSO回归
应用L1正则的线性回归模型就称为LASSO回归,和Ridge回归区别在于,它加的是L1正则化的项。
3.3 弹性网络
弹性网络,Elasitc Net,同时应用L1正则和L2正则
3.4 Ridge回归和LASSO回归比拟
1)两者都能够都能够来解决规范线性回归的过拟合问题。
2)LASSO能够用来做特征选择,但Ridge回归则不行,因为LASSO可能使得不重要的变量的系数变为0,而Ridge回归则不行。
参考 线性回归、lasso回归、岭回归以及弹性网络的零碎解释
4.代码示例
岭回归预测波士顿房价
from sklearn.datasets import load_bostonfrom sklearn.linear_model import Ridgefrom sklearn.model_selection import train_test_splitfrom sklearn.preprocessing import StandardScalerfrom matplotlib import pyplot as pltfrom matplotlib import font_managerfont = font_manager.FontProperties(fname="/usr/share/fonts/wps-office/msyhbd.ttf", size=25)def radge_fun(): """ 岭回归预测波士顿房价 :return: """ lb = load_boston() x_train, x_test, y_train, y_test = train_test_split(lb.data, lb.target, test_size=0.2) x_std = StandardScaler() y_std = StandardScaler() x_train = x_std.fit_transform(x_train) x_test = x_std.transform(x_test) y_train = y_std.fit_transform(y_train.reshape(-1,1)) y_test = y_std.transform(y_test.reshape(-1,1)) model = Ridge(alpha=1.0) model.fit(x_train, y_train) y_predict = y_std.inverse_transform(model.predict(x_test)) return y_predict, y_std.inverse_transform(y_test)def draw_fun(y_predict, y_test): """ 绘制房价预测与实在值的散点和折线图 :param y_predict: :param y_test: :return: """ x = range(1,len(y_predict)+1) plt.figure(figsize=(25, 10), dpi=80) plt.scatter(x, y_test, label="实在值",color='blue') plt.scatter(x, y_predict,label='预测值', color='red') plt.plot(x,y_test) plt.plot(x,y_predict) x_tick = list(x) y_tick = list(range(0,60,5)) plt.legend(prop=font, loc='best') plt.xticks(list(x), x_tick) plt.yticks(y_tick) plt.grid(alpha=0.8) plt.show()if __name__ == '__main__': y_predict, y_test = radge_fun() draw_fun(y_predict, y_test)
后果