邯郸网站设计价格,国际新闻报道,rp做网站原型要缩小尺寸吗,做网站好还是阿里巴巴好本文转载至本人原创公众号《算法实验室》#xff0c;欢迎关注#xff0c;有问题可随时联系#xff0c;转载请注明出处。
原文链接#xff1a;线性回归公式推导及代码实现
一、概述
本文有以下几个方面构成#xff0c;在每一部分都给出了详细的公式推导及numpy代码。 ①…本文转载至本人原创公众号《算法实验室》欢迎关注有问题可随时联系转载请注明出处。
原文链接线性回归公式推导及代码实现
一、概述
本文有以下几个方面构成在每一部分都给出了详细的公式推导及numpy代码。 ①、线性回归的累加及矩阵公式 ②、损失函数的表达MSE、极大似然估计 ③、损失函数求解最小二乘法梯度下降法 ④、sklearn的代码求解 ⑤、总结 本文所有的向量都默认为列向量粗体均表示向量或矩阵。 xij 表示第 i 个样本的第 j 个特征设共有 m 个样本 n 个特征其中 w0 为偏置项b xi0 表示第 i 个样本的第0个特征为1 xi表示第 i 个样本。 ①线性回归的累加形式表达式为 ②矩阵形式的表达式为 二、损失函数
下面介绍两种得到线性回归损失函数的思路
1、MSE 要想最后拟合的结果比较好那么要保证函数实际值与估计值之间的差距小也即 使得上式结果最小的参数 w即为最优解但是绝对值对于求导等计算不太方便所以采用取平方计算同时为了使得损失函数不至于太大除以样本数m所以上式的损失函数等价于下式如果不除以样本量那么在数据量特别多的情况下损失函数计算的的结果过大不利于计算以及后面采用梯度下降算法更新迭代时所需的每步的步长就需要特别小 将该损失函数称作MSEMean Squared Error均方误差。
2、极大似然估计 上面讲述了得到损失函数的第一种方式下面从概率的角度讲解第二种方式。 由于是拟合结果真实值与估计值之间总是存在误差的。真实值可以表示为估计值与误差的和: 由于误差是一个随机变量他是符合均值为0方差为的 σ2 高斯分布。对于第i个样本误差的概率密度为 那么如何求得参数w的最优值呢我们可以从极大似然估计的角度来考虑极大似然估计的基本思路就是假设未知参数已经定下来了但是参数未知所有样本发生的概率我们也能求出来当取到某些特定的样本时概率最大的参数就是这个未知参数。换句话说就是使样本最有可能发生的的情况下的参数。 根据极大似然函数法构建似然函数似然函数的最大值就是参数w的最有可能的取值具体过程如下 要使似然函数最大也就是最小化减号后面的项所以最终的损失函数为 同理为了避免损失函数过大在后面采用梯度下降算法时除以样本数得到MSE 代码如下
#累加形式损失函数
def loss_function_sum(x,y,theta):anp.dot(x,theta)-yreturn np.sum(a**2)/x.shape[0]
矩阵形式的损失函数 代码如下
#矩阵形式损失函数
def loss_function_matrix(x,y,theta):anp.dot(x,theta)-yreturn np.dot(a.T,a)/x.shape[0] 采用sklearn中的波士顿房价数据集验证损失函数是否一致。注意以下两点 ①、在文章一开始我就说了所有向量默认为列向量所以为了保证计算的正确性一定要将所有向量变成默认的列向量形式。 ②、在特征矩阵前拼接一个全为1的列向量表示偏置项。 import numpy as np
import pandas as pd
from sklearn.datasets import load_boston
from sklearn.preprocessing import StandardScaler
dataload_boston().data
yload_boston().target.reshape(-1,1)
dataStandardScaler().fit_transform(data)
x0np.ones([data.shape[0],1]) #构建全为1的列向量与特征矩阵拼接
datanp.hstack([x0,data])
thetanp.ones(data.shape[1]).reshape(-1,1) #初始化theta也就是参数w
print(loss_function_matrix(data,y,theta),loss_function_sum(data,y,theta)) 可以看出损失给定任意参数w损失函数的值一样证明矩阵及向量形式的损失函数我们并没有写错并且结果一样因此为了方便以后我们仅采用向量形式进行损失函数的代码编写。
三、损失函数求解 下面采用两种方法来求解损失函数最小二乘法、梯度下降法并且每种方法分别采用累加和矩阵两种形式推导并给出响应的python代码验证。
1、先导知识
为了对损失函数进行求导需要有矩阵求导的先导知识 2、 最小二乘法 最小二乘法的思想就是高中数学的求极值的思想对损失函数求导令导函数也就是梯度为 0求解的参数就是极值参数。
2.1、累加形式的梯度 2.2、矩阵形式的梯度 令梯度为0就是最小二乘法最后的结果所以 代码实现如下
inv_matrixnp.linalg.inv(np.dot(data.T,data))
wnp.dot(inv_matrix,np.dot(data.T,y))
print(w)
3、梯度下降
这里不再对梯度下降的原理进行过多阐述总而言之就是利用梯度来不断迭代更新参数值梯度迭代停止的条件有 ①、每次更新的梯度的值小于某一阈值 ②、两次迭代之间的差值小于某一阈值 ③、自定义迭代次数达到这一次数时迭代停止。 梯度下降分为批量梯度下降BGD、随机梯度下降SGD、小批量梯度下降MBGD。 首先先写出累加及矩阵形式的梯度下降函数
#累加形式梯度函数
def gradient_function_sum(x,y,theta):sum0for i in range(x.shape[0]):_(np.dot(x[i,:],theta)-y[i] )*np.array(x[i,:]).reshape(-1,1)sumsum_ return sum*2/x.shape[0]#矩阵形式梯度函数
def gradient_function_matrix(x,y,theta):anp.dot(x,theta)-yreturn 2*np.dot(x.T,a)/x.shape[0] 以上两种形式所得到的的结果也是一模一样的为了计算方便下面仅采用矩阵表达式。
3.1、BGD BGD是一次利用所有样本进行计算计算效率较低。其代码如下
#限制迭代次数控制程序停止
def bgd_gradient_descent1(x,y, alpha,epoch):thetanp.ones(x.shape[1]).reshape(-1, 1)gradient gradient_function_matrix(x,y,theta)for _ in range(epoch):thetatheta-alpha*gradientgradient gradient_function_matrix(x,y,theta)return theta#限制梯度的大小控制程序停止
def bgd_gradient_descent2(x,y, alpha):thetanp.ones(x.shape[1]).reshape(-1, 1)gradient gradient_function_matrix(x,y,theta)while not all(np.abs(gradient) 1e-5):thetatheta-alpha*gradient gradient gradient_function_matrix(x,y,theta)return theta
3.2、SGD SGD是每次利用一个样本进行梯度迭代所以运算效率高但是也正是因为用一个样本来决定梯度方向导致其梯度的方向变化很大不能很快的收敛于全局或者局部最优值。代码如下
def sgd(x,y, alpha):xnp.mat(x)ynp.mat(y)thetanp.ones(x.shape[1]).reshape(-1, 1)thetanp.mat(theta)knp.random.randint(x.shape[0]) gradient 2/x.shape[0]*x[k].T*(x[k]*theta-y[k]) while not all(np.abs(gradient) 1e-5):thetatheta-alpha*gradient gradient gradient_function_matrix(x,y,theta)return theta
3.3、MBGD MBGD是每次利用部分样本进行迭代是BGD与SGD的一个折中。代码如下
def mbgd(x,y,alpha,frac):#frac为抽取样本的比例xpd.DataFrame(x)thetanp.ones(x.shape[1]).reshape(-1, 1)thetanp.mat(theta)rowx.sample(fracfrac,replaceFalse).index xnp.mat(x.loc[row,:])ynp.mat(y[[row]])gradient2/x.shape[0]*x.T*(x*theta-y) while not all(np.abs(gradient) 1e-5): thetatheta-alpha*gradient gradient gradient_function_matrix(x,y,theta)return theta
四、sklearn求解
1、最小二乘法
from sklearn.linear_model import LinearRegression,SGDRegressor
dataload_boston().data
yload_boston().target
dataStandardScaler().fit_transform(data)
lrLinearRegression()
lr.fit(data ,y)
print(lr.intercept_)
print(lr.coef_)
2、梯度下降法
dataload_boston().data
yload_boston().target
dataStandardScaler().fit_transform(data)
lrSGDRegressor()
lr.fit(data ,y)
print(lr.intercept_)
print(lr.coef_)
五、总结 本文共讨论的线性回归的四种大方法最小二乘法、BGD、SGD、MBGD以及各种方法的矩阵及累加形式实现。 通过运行以上代码可以看出所有的方法求出来的结果基本上差别不大。