广州游戏网站建设,网站建设准备工作,网站需求怎么做,全国代理网文章目录致谢9 线性回归再相遇9.1 再遇9.1.1 概述9.1.2 矩阵和向量9.1.3 矩阵加减乘除9.1.3.1 矩阵——矩阵加减9.1.3.2 矩阵——标量加减乘9.1.3.3 矩阵——向量相乘9.1.3.4 矩阵——矩阵相乘9.1.3.5 矩阵的逆9.1.3.6 矩阵的转置9.1.4 向量化9.1.5 广义线性模型9.2 正规方程9.…
文章目录致谢9 线性回归再相遇9.1 再遇9.1.1 概述9.1.2 矩阵和向量9.1.3 矩阵加减乘除9.1.3.1 矩阵——矩阵加减9.1.3.2 矩阵——标量加减乘9.1.3.3 矩阵——向量相乘9.1.3.4 矩阵——矩阵相乘9.1.3.5 矩阵的逆9.1.3.6 矩阵的转置9.1.4 向量化9.1.5 广义线性模型9.2 正规方程9.3 线性回归的实现9.4 模型评估9.5 正规方程和梯度下降9.6 关于优化方法9.7 后话致谢 为什么计算函数极值用梯度下降算法而不直接令导数为0求解 - 知乎 (zhihu.com) 解释为什么用梯度下降而不是直接求导数为0的解_weixin_43167121的博客-CSDN博客_梯度下降为什么不直接导数0 python的numpy向量化语句为什么会比for快 - 知乎 (zhihu.com) 机器学习:波士顿房价数据集 - wjunneng - 博客园 (cnblogs.com) 随机梯度下降(SGD)与经典的梯度下降法的区别_米兰小子SHC-CSDN博客_随机梯度下降和梯度下降的区别 1.1-广义线性模型 - sklearn中文文档 (sklearncn.cn) 线性回归模型的评估) - 知乎 (zhihu.com) 9 线性回归再相遇
在第二讲中实际上我们已经谈论了线性回归的基本知识。但是你是否在当时发现了我的一些漏洞呢如果你没有发现你要好好反思自己了。
在当时我们谈到了对于损失函数如何求最小值的问题那时候我对于求导避而不谈转而使用了梯度下降来作为求最小值的方法这是为何呢
首先我们来试想我们用求导来求极小值是怎么求的我们是通过令导函数为0来求导的可是实际问题中如果损失函数非凸那势必会出现yx3y x^3yx3中x0x_0x0位置的拐点。因此我们可以得出并不是所有的函数都可以根据导数求导取得0值的点的我们需要一种更通用的方式来解决损失函数极小值的问题。
在最优化中牛顿迭代和梯度下降都可以计算极值。区别在于梯度下降法的算法复杂度低一些, 但是迭代次数多一些; 牛顿迭代法计算的更快(初值必须设置的很合理), 但是牛顿迭代法因为有除法参与(对矩阵来说就是求逆矩阵), 所以每一步迭代计算量很大. 一般会根据具体的情况取舍。
梯度下降相比于牛顿迭代法还有一个好处就是它的完成方式允许一个简单的并行化即在多个处理器或机器上分配计算所以当你使用神经网络来训练模型时梯度下降变得尤为重要。
好了坑填上了下面进入我们这一讲学习的部分。
9.1 再遇
9.1.1 概述
线性回归并不是我们初中学习的那个一次函数了实际上在机器学习中的线性回归更加地广义。我们初中熟知的一次函数在机器学习中被称为单变量回归。而自变量大于一个的我们叫做多元回归。在第二讲中我们谈到房价预测的模型hθ(x)θ0θ1x1θ2x2h_θ(x) θ_0θ_1x_1θ_2x_2hθ(x)θ0θ1x1θ2x2即为多元回归。
我们给出通用公式h(w)w1x1w2x2...wnxnbwTbh(w) w_1x_1w_2x_2...w_nx_nb w^Tbh(w)w1x1w2x2...wnxnbwTb
其中wx可以理解为矩阵这实际上是向量化的一种应用方式在后面我会提到向量化不必担心。但是在这之前我们必须重温线性代数。
9.1.2 矩阵和向量
矩阵一般用方括号括起里面写有若干个数字。我们一般表示矩阵的维度通常是采用行数×列数来表示的。如下图所示 有时我们也会遇见下图所示的符号 这个看似像R的符号实际上代表任意2×3规模的矩阵集合。
如上面的矩阵所示我们会用AijA_{ij}Aij来表示A矩阵中第i行第j列的某一个元素。
对于向量也是相应的表示方法它实际上是一个n×1的矩阵也就是说实际上标量是0维向量是2维矩阵是三维。
9.1.3 矩阵加减乘除
9.1.3.1 矩阵——矩阵加减
矩阵的加法和减法实际上就是两个矩阵对应元素相加相减即可。但是在这里需要注意如果两个矩阵不是同型即不同维度的的那么两个矩阵是不能相加相减的。 在python中两个矩阵即使不同型也能相加即python的广播机制在后面的论述中我们再细谈。 9.1.3.2 矩阵——标量加减乘
对于一个标量和一个矩阵相加相减如果该标量是n那么实际上我们可以把该标量看成是一个n的单位矩阵n的单位矩阵是主对角线全n可不是矩阵所有元素都是n哈且与另外需要相加相减的矩阵同型。也就是说标量加矩阵即矩阵对应元素全部加上或减去该标量。
同样地标量和矩阵相乘即矩阵所有元素全部乘上该标量。 9.1.3.3 矩阵——向量相乘
矩阵和一个向量相乘假如一个矩阵为m×n则要求向量一定要为n×1否则不能相乘。
相乘的时候矩阵的行元素与向量的列元素对应相乘再相加。 9.1.3.4 矩阵——矩阵相乘
矩阵矩阵相乘和矩阵向量相乘同理假如一个矩阵为m×n则要求另外一个矩阵必须是n×k否则不能相乘。其相乘的结果矩阵为m×k。
相乘的时候A矩阵的行元素和B矩阵的列元素对应相乘再相加。
实际上AB矩阵相乘和BA矩阵相乘是不一样的也就是说其不享有标量运算中的乘法交换律。所以在进行计算的时候这个问题是十分需要注意的。不过有一个特例假如矩阵和单位矩阵进行相乘两者是满足乘法交换律的。
9.1.3.5 矩阵的逆
有些人很奇怪上面怎么都是相加相减相乘可就是没有相除呢这是因为在线性代数中矩阵的除法不太一样。
在线性代数中矩阵的除法叫做逆。比如标量1/3和3/1相乘其必定为1。我们称3/1为1/3的逆。在矩阵中假如有A矩阵和A的逆矩阵A−1A^{-1}A−1则满足A(A−1)I(I为单位矩阵)A(A^{-1}) I(I为单位矩阵)A(A−1)I(I为单位矩阵)。且需要提到的是只有形如m×m的方阵才有逆矩阵。
逆矩阵一般怎么求呢外国学生一般用软件算而中国学生就比较“惨”了一般靠手算。
如果靠手算我们一般使用初等行变换法或者利用伴随矩阵来求这里我们就不过多叙述了因为脱离了主要内容了。
9.1.3.6 矩阵的转置
转置就不多说了直接行列互换即可。假如一个A为m×n则ATA^TAT为n×m。
9.1.4 向量化
在线性回归中我们会把若干个特征放入x向量中而把若干个w放入w向量中最后运用上述的线性代数知识将其加上b。这么做的话相比于用for循环一个特征一个特征的去扫描然后一个样本一个样本训练模型来说使用numpy来启用线性代数机制去计算明显速度要提高几番不止。至于为什么用线性代数机制快你可以去网上查查这里涉及底层知识这里不过多讲解。
9.1.5 广义线性模型
线性模型中实际上有狭义线性模型和广义线性模型。狭义的线性模型就是我们所知的y kxb而广义线性模型即为yw1x1w2x2by w_1x_1w_2x_2byw1x1w2x2b画在图上实际上这个函数是一个平面。甚至于你可以无限扩展其维度变成yw1x1w2x2...wnxnby w_1x_1w_2x_2...w_nx_nbyw1x1w2x2...wnxnb。
然而线性模型也并非一定要线性也可以是非线性的。形如yw1x1w2x22by w_1x_1w_2x_2^2byw1x1w2x22b也被称为线性模型。线性模型实际上追求的不是线性而是追求模型中某个东西一次方即自变量一次或参数一次。
参数和自变量多实际上可以提高模型精度但是不控制好则会导致过拟合这一点在第五讲我们已经做过论述了这里不再提了。
9.2 正规方程
我们在第二讲曾经提到过正规方程。现在是时候填上我们的坑了。
正规方程和梯度下降都是求得损失函数最小值对应参数的方法。但是不同的是正规方程并不需要进行迭代它可以一步求解。而对于梯度下降其必须勤勤恳恳进行迭代无限逼近最小值。
但是正规方程也有不好的地方当特征过多过复杂的时候正规方程求解速度会很慢且常常求不出结果。所以其实际上具有局限性。
正规方程的基本形式为 w(XTX)−1XTyw (X^TX)^{-1}X^Ty w(XTX)−1XTy 由于正规方程的不通用性所以这里我们不做过多讲解初学者只需牢牢掌握梯度下降即可。
9.3 线性回归的实现
结合第二讲和这一讲的叙述相信我们对线性回归都有一定地了解了现在让我们看看我们如何使用sklearn为我们提供的API。 sklearn.linear_model.LinearRegression(fit_intercept True) 通过正规方程优化fit_intercept是否计算偏置LinearRegression.coef_回归系数LinearRegression.intercept_偏置 sklearn.linear_model.SGDRegression(loss “squared_loss”,fit_intercept True,learning_rate ‘invscaling’,eta0 0.01) loss损失类型loss “squared_loss”:普通最小二乘法fit_intercept是否计算偏置learning_ratestring,optinal用于学习率填充‘constant’eta eta0‘optimal’eta 1.0/(alpha*(tt0))[default]‘invscaling’eta eta0/pow(t,power_t) power_t 0.25存在于父类中 对于一个常数值的学习率来说可以使用’constant’并使用eta0来指定学习率SGDRegressor.coef_回归系数SGDRegressor.intercept_偏置 我们利用上面的API对sklearn内置的波士顿房价数据集做预测。 波士顿房价数据集 使用sklearn.datasets.load_boston即可加载相关数据。该数据集是一个回归问题。每个类的观察值数量是均等的共有 506 个观察13 个输入变量和1个输出变量。 每条数据包含房屋以及房屋周围的详细信息。其中包含城镇犯罪率一氧化氮浓度住宅平均房间数到中心区域的加权距离以及自住房平均房价等等。 在上面的数据中我们可以总结出以下处理步骤
获取数据集划分数据集特征工程标准化各项指标有小数有整数需要标准化一下预估器流程模型评估
代码如下所示
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression
from sklearn.linear_model import SGDRegressordef linear_model_1():利用正规方程来优化损失函数# 1 获取数据boston_data load_boston()# 2 划分数据x_train, x_test, y_train, y_test train_test_split(boston_data.data, boston_data.target, random_state22)# 3 标准化transfer StandardScaler()x_train transfer.fit_transform(x_train)x_test transfer.transform(x_test)# 4 预估器estimator LinearRegression()estimator.fit(x_train, y_train)# 5 得出模型print(------经果正规方程的优化后------)print(权重系数为\n, estimator.coef_)print(偏置为\n, estimator.intercept_)def linear_model_2():利用梯度下降来优化损失函数# 1 获取数据boston_data load_boston()# 2 划分数据x_train, x_test, y_train, y_test train_test_split(boston_data.data, boston_data.target, random_state22)# 3 标准化transfer StandardScaler()x_train transfer.fit_transform(x_train)x_test transfer.transform(x_test)# 4 预估器estimator SGDRegressor()estimator.fit(x_train, y_train)# 5 得出模型print(------经果梯度下降的优化后------)print(权重系数为\n, estimator.coef_)print(偏置为\n, estimator.intercept_)linear_model_1()
linear_model_2()9.4 模型评估
在回归任务中其不像分类任务一样直接对比分类效果获得准确率即可。对于模型的好坏采用的是评估指标评估指标一般都是用我们在第二讲讲到的那几个误差函数。在线性回归中常用的误差函数即为平方误差函数即均方误差Mean Square Error,MSE。其他的误差函数在神经网络中会一一涉及。
均方误差如下所示 MSE1m∑i1m(y^−yi)2MSE \frac{1}{m}\sum^m_{i 1}(\hat y - y^i)^2 MSEm1i1∑m(y^−yi)2 MSE的作用就是当你训练出了模型后我用测试集中的数据来对比你预测出来的结果看看差距到底有多大这个多大是用均方误差来估计的。
在sklearn中也有相应的API如下所示 sklearn.metrics.mean_squared_error(y_true, y_pred) 均方误差回归损失y_true真实值y_pred预测值return误差浮点数结果 应用在上面的线性回归中
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression
from sklearn.linear_model import SGDRegressor
from sklearn.metrics import mean_squared_errordef linear_model_1():利用正规方程来优化损失函数# 1 获取数据boston_data load_boston()# 2 划分数据x_train, x_test, y_train, y_test train_test_split(boston_data.data, boston_data.target, random_state22)# 3 标准化transfer StandardScaler()x_train transfer.fit_transform(x_train)x_test transfer.transform(x_test)# 4 预估器estimator LinearRegression()estimator.fit(x_train, y_train)y_predict estimator.predict(x_test)# 5 得出模型print(------经果正规方程的优化后------)print(权重系数为\n, estimator.coef_)print(偏置为\n, estimator.intercept_)# 6 评估模型error mean_squared_error(y_test, y_predict)print(均方误差为\n, error)def linear_model_2():利用梯度下降来优化损失函数# 1 获取数据boston_data load_boston()# 2 划分数据x_train, x_test, y_train, y_test train_test_split(boston_data.data, boston_data.target, random_state22)# 3 标准化transfer StandardScaler()x_train transfer.fit_transform(x_train)x_test transfer.transform(x_test)# 4 预估器estimator SGDRegressor()estimator.fit(x_train, y_train)y_predict estimator.predict(x_test)# 5 得出模型print(------经果梯度下降的优化后------)print(权重系数为\n, estimator.coef_)print(偏置为\n, estimator.intercept_)# 6 评估模型error mean_squared_error(y_test, y_predict)print(均方误差为\n, error)linear_model_1()
linear_model_2()9.5 正规方程和梯度下降
正规方程和梯度下降在上面的案例中已经有了很明显的对比
梯度下降正规方程需要选择学习率不需要需要迭代求解一次运算就能得出特征数量较大可以使用需要解方程时间复杂度很高
在选择优化方法时我觉得真的没必要花里胡哨梯度下降就对了。如果那你真的很想搞事那么sklearn给了一个参考图你可以根据这个来判定你要使用哪种优化方法。
9.6 关于优化方法
实际上我们在上面提到的sklearn.linear_model.SGDRegression并不是传统的梯度下降(GD)而是经过多次改进的随机梯度下降(SGD)。
传统的梯度下降需要在迭代过程中使用所有的训练数据。记得梯度下降怎么做的吗
线性代数的损失函数假设为J(θ1)12m(y^−y)2J(θ_1) \frac {1}{2m}(\hat y - y)^2J(θ1)2m1(y^−y)2则模型参数更新为θjθj−α∂∂θjJ(θ0,θ1)θ_j θ_j - \alpha \frac{\partial}{\partial θ_j} J(θ_0,θ_1)θjθj−α∂θj∂J(θ0,θ1)
因此在经典的梯度下降法中每次对模型参数进行更新时需要遍历所有的数据。当m很大的时候就需要耗费巨大的计算资源和计算时间。为此随机梯度下降(SGD)应运而生。
随机梯度下降不再去求平均数了而是使用随机的单个样本的损失来作为平均损失。它是一种简单但非常有效的方法。适用于支持向量机和回归中。在以前小数据是SGD实际上作用并不明显但是在数据愈发蓬勃发展的时刻它越来越重要。
所以综上所述SGD的优点就是效率高易于实现。而SGD的缺点是其包含众多的超参数需要自己指定而且其对于标准化很敏感。
9.7 后话
实际上回归远不止于此线性回归是回归问题一种最为简单的实现方式。除了线性回归前面学过的决策树也能做回归贝叶斯也可以如果后面有机会我们还会接触到岭回归、逻辑斯蒂回归实际上是分类、最小角回归、弹性网络、感知机、稳健回归等它们都属于广义线性模型。
好了这一讲有点长你也累了晚安。