机器学习:多元线性回归+牛顿法python实现

目录

线性回归:

定义损失函数:

定义优化函数:

泰勒展开:

牛顿法:

代码展示:


线性回归:

线性关系是我们生活中最为普遍的关系类型之一。对于最简单的线性关系的数学表达 : 

f(x)=kx+\xi

上述公式描述了函数f(x)与自变量x的关系,当有多个自变量的时候,每一个特征xi都会对f(x)的取值产生影响,所以我们的目标是找到每个也是找到一个公式能够描述自变量和因变量之间的关系,公式也就变成了。

        y =\beta 0 +\beta 1*x1+\beta 2*x2....+\beta n*xn+\xi

y 是因变量,x₁, x₂, ..., xₙ 是自变量,β₀是截距, β₁, β₂, ..., βₙ 是回归系数,ε 是误差项。我们的目标是找到最优的回归系数,使得模型的预测值与实际观测值之间的误差最小化。在后面运算中,β₀, β₁, β₂, ..., βₙ会写成矩阵的方式公式简化为:

y=wx

x为1,x₁, x₂, ..., xₙ的组成的矩阵,w为β₀, β₁, β₂, ..., βₙ组成的向量。

定义损失函数:

使用回归模型常用的损失函数MSE(Mean Squared Error,均方误差)作为手写模型的损失函数,其公式为:


\frac{1}{n}\sum (y-\hat{y})^2

y为实际值,\hat{y}为预测值,上述公式计算了预测值与实际观测值之间差异的平方的平均值。当该值越小,表示模型的预测结果与实际观测值之间的差异越小,则模型拟合效果越好。MSE 是一个非负的指标,其值为 0 表示模型完全拟合了数据。然而,MSE 也存在一个问题,即它对异常值比较敏感,因为误差的平方会放大异常值的影响。

定义优化函数:


这里选择牛顿法作为优化函数,来快速得到最优的w。牛顿法通过泰勒展开式的二阶来逼近目标函数(在这里为损失函数MSE)。

首先我们需要知道,优化函数具体怎么优化模型。以MSE为例,为了让MSE最小,我们需要调整\hat{y}的值,而根据线性回归的公式(参照上面多元线性的公式),我们需要调整的是w 的值来得到最优的回归系数和截距。优化函数则是通过求导\frac{derror}{dw},利用数学公式对参数进行迭代的运算操作,更新β₀ β₁, β₂, ..., βₙ 的值来得到最优解。

泰勒展开式是一种将一个函数在某个点附近进行无穷阶级数展开的方法。泰勒展开式可以用来近似表示一个函数在给定点的邻域内的取值

泰勒展开:

f(x)=f(x0)+\frac{f'(x0)}{1!}(x-x0)+\frac{f''(x0)}{2!}(x-x0)^2....\frac{f^n(x0)}{n!}(x-x0)^n+Rn

其中,f'(x0) 表示函数 f(x) 在点 x0 处的一阶导数,f''(x0) 表示函数 f(x) 在点 x0 处的二阶导数,依此类推。展开式中的每一项都是函数在 x0 处的导数乘以相应的幂次项。泰勒展开式的优点是可以用一系列简单的函数来逼近复杂的函数,从而简化计算。通常情况下,我们可以通过截取展开式的有限项来近似表示函数的取值。截取的项数越多,近似的精度就越高。

牛顿法:

在牛顿法中,我们截取泰勒展开的二阶:

f(x)=f(x0)+\frac{f'(x0)}{1!}(x-x0)+\frac{f''(x0)}{2!}(x-x0)^2

对该函数进行求导:

f'(x)=f'(x0)+f''(x0)(x-x0)

同时令f'(x)=0,那么公式就会变成:

- \frac{f'(x0)}{f''(x0)}=(x-x0)

改变一下形式,也就成为了牛顿法的更新公式 :

x=x0- \frac{f'(x0)}{f''(x0)}

将mse的公式带入,因为我们求的参数为w,所以设定在mse函数中的自变量为w,也就是说上述公式可以转变为:

       w{_{n}}^{}=w{_{n-1}}^{}- \frac{f'(x0)}{f''(x0)}

          w{_{n}}^{}=w{_{n-1}}-\frac{\frac{2}{n}(y-wx)x}{\frac{2}{n}x^2}

利用函数的一阶导和二阶导(海森矩阵)对参数进行更新,重复多次即可让得到损失函数的收敛值。

代码展示:

import numpy as np
class Linear1_nowton:
    def __init__(self,iter=800,tol=1e-6):
        self.iter=iter
        self.tol=tol#对w变化量的限制
    def fit(self,x,y):
        x=np.array(x)
        y=np.array(y)
        x=np.column_stack((np.ones(len(y)),x))#在x特征里加入一列1,是为了算截距
        self.sample,self.featers=x.shape
        self.w=np.random.normal(0,1,self.featers)
        #随机生成一批正态分布的w作为初始参数,也可以换成0
        for i in range(self.iter):
            y_pre=np.dot(x,self.w)#预测y=w*x,dot为矩阵乘法
            error=y_pre-y
            dw=np.dot(x.T,error)/self.sample#导数
            hs=np.dot(x.T,x)/self.sample#海森矩阵
            delt=np.linalg.solve(hs,dw)#w变化量
            self.w-=delt
            if np.linalg.norm(delt)<self.tol:#w变化量太低则判断为收敛,跳出
                break
    def predict(self,x):
        x=np.column_stack((np.ones(x.shape[0]),x))
        return np.dot(x,self.w)

在代码中对mse的公式描述为

\sum \left ( \hat{y}-y \right )^2

是因为我们在模型里实际上要求得的是预测值与实际值的差,在这里是以预测值为基准所以与上面数学公式有些许出入。并且由于一阶导数和二阶导数中都有2所以抵消了,其他地方没有抵消是因为让代码更易理解。

代码中的数学运算都将x和y看做一个整体,即x是一个矩阵,y为一组向量,dot则为矩阵运算,linalg.solve为线性方程求解。

效果展示: 

以波士顿房价数据为例:

和sklearn的线性回归的得分几乎相同,手写模型成功。使用了牛顿法,会让该模型更快的收敛,得到最优w,以上图的波士顿数据为例,只需要迭代三次即可得到最优。但缺点比较明显由于是单纯的线性回归模型,并没有考虑到误差项的问题,这是该模型的一个局限性。

如有不足,还请各位大佬指出。博主会继续虚心学习。

  • 15
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python中进行多元线性回归可以使用线性回归模型。首先,可以通过pandas库中的read_csv函数导入数据。对于多元线性回归,可以使用多个自变量来预测因变量。在进行多元线性回归之前,可以先通过简单线性回归来展现线性回归的特性和结果。 在代码中,可以创建一个LinearRegression对象,并使用fit方法拟合训练集的自变量和因变量。然后可以使用intercept_属性来获取截距,使用coef_属性来获取回归系数。最后可以打印出最佳拟合线的截距和回归系数。 以下是一个多元线性回归Python代码示例: ``` import pandas as pd from sklearn.linear_model import LinearRegression # 导入数据 data = pd.read_csv("data.csv") # 定义自变量和因变量 X = data[['x1', 'x2', 'x3']] # 多个自变量 Y = data['y'] # 因变量 # 创建线性回归模型 model = LinearRegression() # 拟合训练集 model.fit(X, Y) # 获取截距和回归系数 a = model.intercept_ # 截距 b = model.coef_ # 回归系数 # 打印结果 print("最佳拟合线: 截距", a, ", 回归系数:", b) ``` 这段代码中,data.csv是包含自变量和因变量的数据文件。X是一个包含多个自变量的DataFrame,Y是包含因变量的Series。然后创建了一个LinearRegression对象model,并使用fit方法将X和Y拟合。最后打印出了最佳拟合线的截距和回归系数。 请注意,这只是一个多元线性回归的示例代码,具体的实现可能因数据和问题的不同而有所差异。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Python实现多元线性回归](https://blog.csdn.net/weixin_40014576/article/details/79918819)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值