关于机器学习:机器学习二理解线性回归与梯度下降并做简单预测

50次阅读

共计 4304 个字符,预计需要花费 11 分钟才能阅读完成。

预测从瞎猜开始

按上一篇文章所说,机器学习是利用数学方法在数据中发现法则的过程。既然数学是对事实世界的解释,那么咱们回归事实世界,做一些对照的设想。

设想咱们背后有一块塑料泡沫做的白板,白板上散布排列着数枚蓝色的图钉,隐约地它们仿佛存在着某种法则,咱们试着找出法则。

白板上的图钉(数据 )如上图所示,咱们有没有一种办法( 数学算法 )来寻找法则( 模型解释)呢?既然不晓得怎么做,那咱们瞎猜吧!

我拿起两根木棒在白板前比划,试着用木棒示意数据的法则。我轻易放了放,如下图所示:

它们仿佛都在肯定水平上能示意蓝色图钉的法则,那么问题来了,绿色(虚线)和红色(实线)哪一个示意更好呢?

损失函数(老本函数)

好与坏是很主观的表白,主观的感触是不牢靠的,咱们必须找到一种主观的度量形式。咱们想当然的认为误差最小的示意,是最好的。那么,咱们引出一种量化误差的办法 — 最小二乘法。

最小二乘法:使误差的平方和最小的方法,是一种误差统计办法,二乘就是平方的意思。
$$ SE = \sum{(y_{pred} -y_{true})^2} $$

最小二乘法的解释是这样的,咱们用 预测值 - 理论值 示意单点的误差,再把它们的 平方和 加到一起来示意整体误差。(平方的益处能够解决掉负数值,用绝对值的和也不是不能够。)咱们用这个最终值来示意损失(老本),而能够示意损失(老本)的函数就叫做损失函数(老本函数)。

如上图咱们能够看到,蓝色点到实线的间隔就是咱们要带入公式的误差。尽管它们看上去相近,但通过计算的后果是红色实线 (y=3x+2) 的损失为 27.03,而绿色实线(y=4x+4)的损失为 29.54,显然红色模型优于绿色模型。

那么,还有没有比红色实线更好的模型来示意数据呢?有没有一种形式来找到它呢?

梯度降落

咱们把木棒(实线、模型)的示意数学化,咱们既然能够用 3、4 做为 x 的系数,那咱们当然能够尝试别的数字。咱们用如下公式示意这种关系:

$$ y = wx + b $$

其中,x 和 y 是已知的,咱们一直调整 w( 权重 ) 和b(偏差 ),而后再带入损失函数以求得最小值的过程,就是 梯度降落

咱们从 -50 开始到 50 完结设置 w 的值,咱们通过随机数来是指偏置b,而后再带入损失函数计算咱们的预测和理论值的误差损失,失去如下曲线:

须要留神的是,咱们绘制的图像是依据权重和损失绘制的曲线。而咱们的模型表示是一条直线。
咱们能够看到,在上图中咱们是能够找到极小值的,大略在 5 左右,此处是咱们损失最小的地位,这时咱们的模型最能示意数据的法则。

梯度能够 齐全 了解为导数,梯度降落的过程就是咱们一直求导的过程。

学习率(步长)

一直调整权重和偏差来来寻找损失函数最小值的过程就是咱们应用梯度降落办法拟合数据寻找最佳模型的过程。那么既然咱们有了解决方案,是不是该思考如何晋升效率了,咱们如何疾速地找到最低点?

设想一下,当你迷失在山上的浓雾之中,你能感觉到的只有你脚下路面的坡度。疾速达到山脚的一个策略就是沿着最陡的方向下坡。梯度降落中的一个重要的参数就是每一步的 步长 学习率),如果步长太小,算法须要通过大量迭代才会收敛,如果步长太大,你可能会间接越过山谷,导致算法发散,值越来越大。

设置步长为过小:

设置步长过大:

设置步长适当:

步长是算法本人学习不进去的,它必须由外界指定。
这种算法不能学习,须要人为设定的参数,就叫做 超参数

线性回归

最终咱们找到了 线性 模型来解释自变量 x 与因变量 y 之间的关系,这就是 线性回归 。回归的解释是,事物总是偏向于朝着某种“均匀”倒退,这种 趋势 叫做回归,所以回归多用于预测。

上图,红线是咱们拟合出的最佳模型,在此模型上咱们能够寻找到 2.2,2.6,2.8 的预测值,别离对应图中的三个红点。

这也是线性回归的根本意义。

代码实际

筹备数据:

import numpy as np
import matplotlib.pyplot as plt

np.random.seed(42)
X = 2 * np.random.rand(10)
y = 4 + 3 * X + np.random.randn(10)

plt.plot(X, y, "bo")
plt.xlabel("$X$", fontsize=18)
plt.ylabel("$y$", rotation=0, fontsize=18)
plt.axis([0, 2, 0, 15])
plt.show()

绘制 y=3x+2y=4x+4两条直线:

plt.plot(X, y, "bo")
plt.plot(X, 3*X+2, "r-", lw="5", label = "y=3x+2")
plt.plot(X, 4*X+4, "g:", lw="5", label = "y=4x+4")
plt.xlabel("$X$", fontsize=18)
plt.ylabel("$y$", rotation=0, fontsize=18)
plt.axis([0, 2, 0, 15])
plt.legend(loc="upper left")
plt.show()

计算损失,并比拟 y=3x+2y=4x+4两条直线:

fig, ax_list = plt.subplots(nrows=1, ncols=2,figsize=(20,10))
ax_list[0].plot(X, y, "bo")
ax_list[0].plot(X, 3*X+2, "r-", lw="5", label = "y=3x+2")
loss = 0
for i in range(10):
    ax_list[0].plot([X[i],X[i]], [y[i],3*X[i]+2], color='grey')
    loss= loss + np.square(3*X[i]+2-y[i])
    pass
ax_list[0].axis([0, 2, 0, 15])
ax_list[0].legend(loc="upper left")
ax_list[0].title.set_text('loss=%s'%loss)


ax_list[1].plot(X, y, "bo")
ax_list[1].plot(X, 4*X+4, "g:", lw="5", label = "y=4x+4")
loss = 0
for i in range(10):
    ax_list[1].plot([X[i],X[i]], [y[i],4*X[i]+4], color='grey')
    loss= loss + np.square(4*X[i]+4-y[i])
    pass
ax_list[1].axis([0, 2, 0, 15])
ax_list[1].legend(loc="upper left")
ax_list[1].title.set_text('loss=%s'%loss)
fig.subplots_adjust(wspace=0.1,hspace=0.5)
fig.suptitle("Calculate loss",fontsize=16)

训练模型,并预测:

from sklearn.linear_model import LinearRegression
lr = LinearRegression()
lr.fit(X.reshape(-1,1),y.reshape(-1,1))

X_test = [[2.2],[2.6],[2.8]]
y_test = lr.predict(X_test)
X_pred = 3 * np.random.rand(100, 1)
y_pred = lr.predict(X_pred)
plt.scatter(X,y, c='b', label='real')
plt.plot(X_test,y_test, 'r', label='predicted point' ,marker=".", ms=20)
plt.plot(X_pred,y_pred, 'r-', label='predicted')
plt.xlabel("$X$", fontsize=18)
plt.ylabel("$y$", rotation=0, fontsize=18)
plt.axis([0, 3, 0, 15])
plt.legend(loc="upper left")
loss = 0
for i in range(10):
    loss = loss + np.square(y[i]-lr.predict([[X[i]]]))
plt.title("loss=%s"%loss)
plt.show()

其余回归

要怎么真正了解回归 (regression) 呢?通过大量的数据统计,个体小的豆子往往偏向于产生比其更大的后辈,而个体大的豆子往往偏向于产生比其更小的后辈,新产生的个体有向着豆子的平均值的一种趋势,这种趋势就是回归。咱们本篇文章讲的线性回归就是利用于 预测 的一种技术。这时,回归往往与分类绝对。

线性回归、逻辑回归、多项式回归、逐步回归、岭回归、套索 (Lasso) 回归、弹性网络 (ElasticNet) 回归是最罕用的回归技术。我先对这些技术做一个简略整顿,让大家把脉络理清,等大家理论须要再深刻摸索。试图去穷尽常识只会把本人拖向疲累

名称 解释 公式
线性回归(Linear Regression) 一种以线性模型来建模自变量与因变量关系的办法 $$ y = wx+b $$
逻辑回归(Logistic Regression) 对特定类别进行建模,用于二分类 $$ y=\frac{1}{1+e^{-x}} $$
多项式回归(Polynomial Regression) 自变量 x 和因变量 y 之间的关系被建模为对于 x 的 n 次多项式 $$ y=\beta_0 + \beta_1x + \beta_2x^2 + … + \beta_mx^m + \varepsilon $$(cαiyongji 水印)
逐步回归(Stepwise Regression) 将多个变量一个一个地引入到模型,找到其对模型影响大的变量
套索回归(Lasso Regression) 稠密矩阵,打消不重要的特色,MSE+L1 范数 $$ J(\theta)=MSE(\theta) + \alpha\sum\mid\theta\mid $$,其中,α 越大模型权重越小
岭回归(Ridge Regression) 正则化线性回归,减少模型自由度,避免过拟合,MSE+L2 范数 $$ J(\theta)=MSE(\theta) + \alpha\frac{1}{2}\sum\theta^2 $$,其中,α 越大模型权重越小
弹性网络(ElasticNet) 介于岭回归和 Lasso 回归之间 $$ J(\theta)=MSE(\theta) + \gamma\alpha\sum\mid\theta\mid + \alpha\frac{1-\gamma}{2}\sum\theta^2 $$,其中,γ 介于 0 和 1 之间,靠近 0 则更偏向于岭回归,靠近 1 则更偏向于 Lasso 回归

正文完
 0