【python机器学习】普通最小二乘法多元线性回归

普通最小二乘法线性回归

若数据集 D D D n n n个属性描述,则线性回归的假设函数为:
h w , b ( x ) = ∑ i = 1 n w i x i + b = w T x + b h_{\boldsymbol{w}, b}(\boldsymbol{x})=\sum_{i=1}^{n} w_{i} x_{i}+b=\boldsymbol{w}^{\mathrm{T}} \boldsymbol{x}+b hw,b(x)=i=1nwixi+b=wTx+b
其中, w ∈ R n \boldsymbol{w}\in \mathbb{R}^n wRn b ∈ R b\in \mathbb{R} bR为模型参数。

为了方便,我们通常将 b b b纳入权向量 w \boldsymbol{w} w,作为 w 0 w_0 w0,同时为输入向量 x \boldsymbol{x} x添加一个常数1,作为 x 0 x_0 x0.
w = ( b , w 1 , w 2 , … w n ) T x = ( 1 , x 1 , x 2 , … x n ) T \begin{array}{c}\boldsymbol{w}=\left(b, w_{1}, w_{2}, \ldots w_{n}\right)^{\mathrm{T}} \\\boldsymbol{x}=\left(1, x_{1}, x_{2}, \ldots x_{n}\right)^{\mathrm{T}}\end{array} w=(b,w1,w2,wn)Tx=(1,x1,x2,xn)T

此时,假设函数为:
h w ( x ) = ∑ i = 0 n w i x i = w T x h_{\boldsymbol{\boldsymbol{w}}}(\boldsymbol{x})=\sum_{i=0}^{n} w_{i} x_{i}=\boldsymbol{w}^{\mathrm{T}} \boldsymbol{x} hw(x)=i=0nwixi=wTx

其中, w ∈ R n + 1 \boldsymbol{w}\in \mathbb{R}^{n+1} wRn+1,通过训练确定模型参数 w \boldsymbol{w} w后,便可使用模型对新的输入实例进行预测。

使用均方误差(MSE)作为损失函数,假设训练集 D D D m m m个样本,均方误差损失函数定义为
J ( w ) = 1 2 m ∑ i = 1 m ( h w ( x i ) − y i ) 2 = 1 2 m ∑ i = 1 m ( w T x − y i ) 2 \begin{aligned}J(\boldsymbol{w}) &=\frac{1}{2 m} \sum_{i=1}^{m}\left(h_{\boldsymbol{w}}\left(\boldsymbol{x}_{i}\right)-y_{i}\right)^{2} \\&=\frac{1}{2 m} \sum_{i=1}^{m}\left(\boldsymbol{w}^{\mathrm{T}} \boldsymbol{x}-y_{i}\right)^{2}\end{aligned} J(w)=2m1i=1m(hw(xi)yi)2=2m1i=1m(wTxyi)2

损失函数 J ( w ) J(w) J(w)最小值点是其极值点,可先求 J ( w ) J(w) J(w) w w w的梯度并令其为0,再通过解方程求得。

计算 J ( w ) J(\boldsymbol{w}) J(w)的梯度:
∇ J ( w ) = 1 2 m ∑ i = 1 m ∂ ∂ w ( w T x i − y i ) 2 = 1 2 m ∑ i = 1 m 2 ( w T x i − y i ) ∂ ∂ w ( w T x i − y i ) = 1 m ∑ i = 1 m ( w T x i − y i ) x i \begin{aligned}\nabla J(\boldsymbol{w}) &=\frac{1}{2 m} \sum_{i=1}^{m} \frac{\partial}{\partial \boldsymbol{w}}\left(\boldsymbol{w}^{\mathrm{T}} \boldsymbol{x}_{i}-y_{i}\right)^{2} \\&=\frac{1}{2 m} \sum_{i=1}^{m} 2\left(\boldsymbol{w}^{\mathrm{T}} \boldsymbol{x}_{i}-y_{i}\right) \frac{\partial}{\partial \boldsymbol{w}}\left(\boldsymbol{w}^{\mathrm{T}} \boldsymbol{x}_{i}-y_{i}\right) \\&=\frac{1}{m} \sum_{i=1}^{m}\left(\boldsymbol{w}^{\mathrm{T}} \boldsymbol{x}_{i}-y_{i}\right) \boldsymbol{x}_{i}\end{aligned} J(w)=2m1i=1mw(wTxiyi)2=2m1i=1m2(wTxiyi)w(wTxiyi)=m1i=1m(wTxiyi)xi

以上公式使用矩阵运算描述形式更为简洁,设:
X = [ 1 , x 11 , x 12 … x 1 n 1 , x 21 x 22 … x 2 n ⋮ ⋮ ⋮ ⋱ ⋮ 1 , x m 1 x m 2 … x m n ] = [ x 1 T x 2 T ⋮ x m T ] \boldsymbol{X}=\left[\begin{array}{ccccc}1, & x_{11}, & x_{12} & \ldots & x_{1 n} \\1, & x_{21} & x_{22} & \ldots & x_{2 n} \\\vdots & \vdots & \vdots & \ddots & \vdots \\1, & x_{m 1} & x_{m 2} & \ldots & x_{m n}\end{array}\right]=\left[\begin{array}{c}\boldsymbol{x}_{1}^{\mathrm{T}} \\\boldsymbol{x}_{2}^{\mathrm{T}} \\\vdots \\\boldsymbol{x}_{m}^{\mathrm{T}}\end{array}\right] X=1,1,1,x11,x21xm1x12x22xm2x1nx2nxmn=x1Tx2TxmT
y = [ y 1 y 2 ⋮ y m ] \boldsymbol{y}=\left[\begin{array}{c}y_{1} \\y_{2} \\\vdots \\y_{m}\end{array}\right] y=y1y2ym

w = [ b w 1 w 2 ⋮ w n ] \boldsymbol{w}=\left[\begin{array}{c}b \\w_{1} \\w_{2} \\\vdots \\w_{n}\end{array}\right] w=bw1w2wn

那么,梯度计算公式可写为:
∇ J ( w ) = 1 m ∑ i = 1 m ( w T x i − y i ) x i \nabla J(\boldsymbol{w})=\frac{1}{m} \sum_{i=1}^{m}\left(\boldsymbol{w}^{\mathrm{T}} \boldsymbol{x}_{i}-y_{i}\right) \boldsymbol{x}_{i} J(w)=m1i=1m(wTxiyi)xi
= [ x 1 , x 2 , … , x m ] [ w T x 1 − y 1 w T x 2 − y 2 ⋮ w T x m − y m ] =\left[\begin{array}{c}\boldsymbol{x}_1,\boldsymbol{x}_2,\dots,\boldsymbol{x}_m\end{array}\right]\left[\begin{array}{c}\boldsymbol{w}^{\mathrm{T}} \boldsymbol{x}_{1}-y_{1} \\\boldsymbol{w}^{\mathrm{T}} \boldsymbol{x}_{2}-y_{2} \\\vdots \\\boldsymbol{w}^{\mathrm{T}} \boldsymbol{x}_{m}-y_{m}\end{array}\right] =[x1,x2,,xm]wTx1y1wTx2y2wTxmym
= [ x 1 , x 2 , … , x m ] ( [ w T x 1 w T x 2 ⋮ w T x m ] − [ y 1 y 2 ⋮ y m ] ) =\left[\begin{array}{c}\boldsymbol{x}_1,\boldsymbol{x}_2,\dots,\boldsymbol{x}_m\end{array}\right]\left(\left[\begin{array}{c}\boldsymbol{w}^{\mathrm{T}} \boldsymbol{x}_{1} \\\boldsymbol{w}^{\mathrm{T}} \boldsymbol{x}_{2} \\\vdots \\\boldsymbol{w}^{\mathrm{T}} \boldsymbol{x}_{m}\end{array}\right]-\left[\begin{array}{c}y_{1} \\y_{2} \\\vdots \\y_m\end{array}\right]\right) =[x1,x2,,xm]wTx1wTx2wTxmy1y2ym
= 1 m X T ( X w − y ) =\frac{1}{m} \boldsymbol{X}^{\mathrm{T}}(\boldsymbol{X} \boldsymbol{w}-\boldsymbol{y}) =m1XT(Xwy)
令梯度为0,解得:
w ^ = ( X T X ) − 1 X T y \boldsymbol{\hat{w}}=\left(\boldsymbol{X}^{\mathrm{T}} \boldsymbol{X}\right)^{-1} \boldsymbol{X}^{\mathrm{T}} \boldsymbol{y} w^=(XTX)1XTy

w ^ \boldsymbol{\hat{w}} w^即为使得损失函数(均方误差)最小的 w \boldsymbol{w} w。以上求解最优 w \boldsymbol{w} w的方法被称为普通最小二乘法(Ordinary Least Squares,OLS)。

import numpy as np


class OLSLinearRession:
    def _ols(self, X, y):
        '''普通最小二乘法估算w'''
        tmp = np.linalg.inv(np.matmul(X.T, X))
        tmp = np.matmul(tmp, X.T)
        w = np.matmul(tmp, y)
        return w


    def _preprocess_data(self, X):
        '''数据预处理:添加x0=1'''
        m, n = X.shape
        X_ = np.ones((m, n + 1))
        X_[:, 1:] = X
        return X_

    def train(self, X, y):
        '''训练模型'''
        X = self._preprocess_data(X)
        self.w = self._ols(X, y)

    def predict(self, X):
        '''预测'''
        X = self._preprocess_data(X)
        y = np.matmul(X, self.w)
        return y
  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,实现最小二乘法多元线性回归的过程可以分为以下几步: 1. 导入必要的库,读取数据 2. 对数据进行预处理,将自变量和因变量分开 3. 构建模型,计算回归系数 4. 对模型进行评估 下面是代码实现: ```python import numpy as np import pandas as pd from sklearn.metrics import r2_score # 读取数据 data = pd.read_excel('data.xlsx') x = data.iloc[:, :-1].values y = data.iloc[:, -1].values # 对数据进行预处理 n = x.shape[0] p = x.shape[1] x = np.hstack((np.ones((n, 1)), x)) # 构建模型 xtx = np.dot(x.T, x) xtx_inv = np.linalg.inv(xtx) xtx_inv_xt = np.dot(xtx_inv, x.T) beta = np.dot(xtx_inv_xt, y) # 对模型进行评估 y_pred = np.dot(x, beta) r2 = r2_score(y, y_pred) # 输出模型参数和评估结果 print('回归系数:', beta) print('R2:', r2) ``` 其中,数据需要放在当前目录下的`data.xlsx`文件中,自变量需要放在前面的列中,因变量需要放在最后一列中。在代码中,我们首先使用`pandas`库读取数据,然后使用`numpy`库将自变量和因变量分开,并对自变量进行预处理,即在自变量矩阵的第一列添加一列1。接下来,我们使用最小二乘法计算回归系数,最后使用`sklearn`库中的`r2_score`函数对模型进行评估,计算$R^2$。 需要注意的是,在这个例子中使用的是最简单的多元线性回归模型,如果需要使用更复杂的模型,需要对代码进行适当的修改。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

二进制人工智能

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

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

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

打赏作者

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

抵扣说明:

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

余额充值