机器学习(3)

机器学习(3)

本章主要介绍线性回归模型的原理

一,线性回归

线性模型其实就是对输入的特征值加权求和,再加上一个偏置项的常数

在这里插入图片描述

其中,在这里插入图片描述是预测值,n是特征的数量,在这里插入图片描述是第i个特征值,在这里插入图片描述是第j个模型参数

这也可以更为简洁的向量化形式表达

在这里插入图片描述

其中,在这里插入图片描述在这里插入图片描述的转置向量(为行向量,而不再是列向量),X是实例的特征向量。

我们如何来训练模型呢?训练模型就是设置模型参数直到模型最适应训练集的过程。要到达这个目的,我们首先需要知道怎么衡量模型对训练数据的拟合程度是好还是差。回归模型最常见的性能指标是均方根误差(RMSE),因此在训练线性回归模型时,需要找到最小的RMSE的的值。在实践中将均方误差(MSE)最小化比最小化RMSE更为简单,二者效果相同。线性回归模型的MSE成本函数:

在这里插入图片描述

可以直接改写成:

在这里插入图片描述

1.1,标准方程

推导:https://blog.csdn.net/joob000/article/details/81295144

为了得到使成本函数最小的值,有一个闭式解方法–也就是一个直接得出结果的数学方程,即标准方程:

在这里插入图片描述

其中,在这里插入图片描述是使成本函数最小的值,y是目标值向量。

我们生成一些线性数据来预测这个公式:

import numpy as np
import matplotlib.pyplot as plt
X = 2 * np.random.rand(100,1)#随机生成一些x点
y = 4 + 3 * X + np.random.randn(100,1)#y = 4 + 3 * X + 高斯噪声
X_b = np.c_[np.ones((100, 1)), X]  # 添加 x0 = 1 到每一个实例中
theta_best = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(y)#按照标准方程计算theta值
print(theta_best)
#得到结果3.87和3.17,然而我们期望的是4和3,不过已经很接近了。接下来我们开始预测
X_new = np.array([[0], [2]])#生成x的值为0和2
#np.r_是按列连接两个矩阵,就是把两矩阵上下相加,要求列数相等。
#np.c_是按行连接两个矩阵,就是把两矩阵左右相加,要求行数相等
X_new_b = np.c_[np.ones((2, 1)), X_new]  # 增加 x0 = 1 到每一个实例
y_predict = X_new_b.dot(theta_best)#dot函数返回两个数组的点积

plt.plot(X_new, y_predict, "r-")
plt.plot(X, y, "b.")
plt.axis([0, 2, 0, 15])
plt.show()

结果如图(因数据随机,所以每次运行都略有差别):

在这里插入图片描述

在这里插入图片描述

Scikit-Learn的等效代码为:

import numpy as np
X = 2 * np.random.rand(100,1)
y = 4 + 3 * X + np.random.randn(100,1)
X_new = np.array([[0], [2]])
from sklearn.linear_model import LinearRegression
lin_reg = LinearRegression()
lin_reg.fit(X, y)
print(lin_reg.intercept_, lin_reg.coef_)
print(lin_reg.predict(X_new))

结果为:

在这里插入图片描述

1.2,计算复杂度

标准方程求逆的矩阵在这里插入图片描述是一个nxn的矩阵(n是特征数量),对这种矩阵求逆的计算复杂度通常为在这里插入图片描述之间。换句话说,如果将特征数量翻倍,那么计算时间将乘以大约在这里插入图片描述倍 到在这里插入图片描述倍之间。

特征数量比较大时标准方程的计算将极其缓慢。

好的一面是,相对于训练集中的实例数量来说,方程是线性的,所以能够有效的处理大量的数据集,只要内存足够。同样,线性回归模型一经训练,预测就非常快速,因为计算复杂度相对于想要预测的实例数量和特征数量来说都是线性的。

二,梯度下降

梯度下降法的基本思想可以类比为一个下山的过程。假设这样一个场景:一个人被困在山上,需要从山上下来(i.e. 找到山的最低点,也就是山谷)。但此时山上的浓雾很大,导致可视度很低。因此,下山的路径就无法确定,他必须利用自己周围的信息去找到下山的路径。这个时候,他就可以利用梯度下降算法来帮助自己下山。具体来说就是,以他当前的所处的位置为基准,寻找这个位置最陡峭的地方,然后朝着山的高度下降的地方走,同理,如果我们的目标是上山,也就是爬到山顶,那么此时应该是朝着最陡峭的方向往上走。然后每走一段距离,都反复采用同一个方法,最后就能成功的抵达山谷。

在这里插入图片描述

我们同时可以假设这座山最陡峭的地方是无法通过肉眼立马观察出来的,而是需要一个复杂的工具来测量,同时,这个人此时正好拥有测量出最陡峭方向的能力。所以,此人每走一段距离,都需要一段时间来测量所在位置最陡峭的方向,这是比较耗时的。那么为了在太阳下山之前到达山底,就要尽可能的减少测量方向的次数。这是一个两难的选择,如果测量的频繁,可以保证下山的方向是绝对正确的,但又非常耗时,如果测量的过少,又有偏离轨道的风险。所以需要找到一个合适的测量方向的频率,来确保下山的方向不错误,同时又不至于耗时太多!

首先,我们有一个可微分的函数。这个函数就代表着一座山。我们的目标就是找到这个函数的最小值,也就是山底。根据之前的场景假设,最快的下山的方式就是找到当前位置最陡峭的方向,然后沿着此方向向下走,对应到函数中,就是找到给定点的梯度 ,然后朝着梯度相反的方向,就能让函数值下降的最快!因为梯度的方向就是函数之变化最快的方向
所以,我们重复利用这个方法,反复求取梯度,最后就能到达局部的最小值,这就类似于我们下山的过程。而求取梯度就确定了最陡峭的方向,也就是场景中测量方向的手段。那么为什么梯度的方向就是最陡峭的方向呢?

2.1,微分

看待微分的意义,可以有不同的角度,最常用的两种是:

  • 函数图像中,某点的切线的斜率

  • 函数的变化率
    几个微分的例子:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

aqiu12316

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值