线性回归两种求解方式总结

线性回归两种求解方式总结

使用梯度下降进行预测

from sklearn.datasets import load_boston # 波士顿房价数据集使用API
from sklearn.linear_model import LinearRegression,SGDRegressor ##回归预测时使用的API
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler ## 标准化API
def myLinear():
    """线性回归直接预测房子价格"""
    # 获取数据
    lb=load_boston()
    # 分割数据集
    x_train,x_text,y_train,y_text=train_test_split(lb.data,lb.target,test_size=0.25)

    # 进行标准化处理
    std_x=StandardScaler()
    x_train=std_x.fit_transform(x_train)
    x_text=std_x.transform((x_text))
    #目标值
    std_y=StandardScaler()
    y_train=std_y.fit_transform(y_train)
    y_text=std_y.transform(y_text)
    #正规方程调用预测
    lr=LinearRegression()
    lr.fit(x_train,y_train)
    print(lr.coef_)
    # 预测测试集房子价格
    y_predict=std_y.inverse_transform(lr.predict(x_text))
    print("测试集每个房子的预测价格:",y_predict)

def tidu_boston():
    """线性回归直接预测房子价格"""
    # 获取数据
    lb=load_boston()
    # 分割数据集
    x_train,x_text,y_train,y_text=train_test_split(lb.data,lb.target,test_size=0.25)

    # 进行标准化处理
    std_x=StandardScaler()
    x_train=std_x.fit_transform(x_train)
    x_text=std_x.transform((x_text))
    #目标值
    std_y=StandardScaler()
    y_train=std_y.fit_transform(y_train)
    y_text=std_y.transform(y_text)
    #梯度下降进行房价预测
    sgd=SGDRegressor()
    sgd.fit(x_train,y_train)
    print(sgd.coef_)
    # 预测测试集房子价格
    y_predict=std_y.inverse_transform(sgd.predict(x_text))
    print("测试集每个房子的预测价格:",y_predict)

if __name__ == '__main__':
    # myLinear()
    tidu_boston()

回归性能评估(均方误差)

在这里插入图片描述
api:sklearn.metrics.mean_squared_error
.mean_squared_error(y_true,y_pre)

  • 均方误差回归损失
  • y_true:真实值
  • y_pre:预测值
  • return:浮点数结果
    注意:真实值,预测值为标准化之前的值

梯度下降代码:

from sklearn.datasets import load_boston # 波士顿房价数据集使用API
from sklearn.linear_model import LinearRegression,SGDRegressor ##回归预测时使用的API
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler ## 标准化API
from sklearn.metrics import mean_squared_error
def myLinear():
    """线性回归直接预测房子价格"""
    # 获取数据
    lb=load_boston()
    # 分割数据集
    x_train,x_text,y_train,y_text=train_test_split(lb.data,lb.target,test_size=0.25)

    # 进行标准化处理
    std_x=StandardScaler()
    x_train=std_x.fit_transform(x_train)
    x_text=std_x.transform((x_text))
    #目标值
    std_y=StandardScaler()
    y_train=std_y.fit_transform(y_train)
    y_text=std_y.transform(y_text)
    #正规方程调用预测
    lr=LinearRegression()
    lr.fit(x_train,y_train)
    print(lr.coef_)
    # 预测测试集房子价格
    y_predict=std_y.inverse_transform(lr.predict(x_text))
    print("测试集每个房子的预测价格:",y_predict)
    print("正规方程的均方差:",mean_squared_error(std_y.inverse_transform(y_text),y_predict))
def tidu_boston():
    """线性回归直接预测房子价格 """
    # 获取数据
    lb=load_boston()
    # 分割数据集
    x_train,x_text,y_train,y_text=train_test_split(lb.data,lb.target,test_size=0.25)

    # 进行标准化处理
    std_x=StandardScaler()
    x_train=std_x.fit_transform(x_train)
    x_text=std_x.transform((x_text))
    #目标值
    std_y=StandardScaler()
    y_train=std_y.fit_transform(y_train)
    y_text=std_y.transform(y_text)
    #梯度下降进行房价预测
    sgd=SGDRegressor()
    sgd.fit(x_train,y_train)
    print(sgd.coef_)
    # 预测测试集房子价格
    y_predict=std_y.inverse_transform(sgd.predict(x_text))
    print("测试集每个房子的预测价格:",y_predict)

if __name__ == '__main__':
    # myLinear()
    tidu_boston()

梯度下降和正规方程对比

在这里插入图片描述

线性回归是一种常见的机器学习算法,用于预测一个连续的数值输出。给定一个由 $m$ 个样本组成的训练集,每个样本都有 $n$ 个特征,线性回归的目标是找到一条直线(或超平面),使得这个训练集上的预测值和真实值之间的误差最小。 假设有 $m$ 个样本,每个样本有 $n$ 个特征,用 $x^{(i)}=(x_1^{(i)},x_2^{(i)},\cdots,x_n^{(i)})$ 表示第 $i$ 个样本的特征向量,用 $y^{(i)}$ 表示第 $i$ 个样本的真实值,用 $w=(w_1,w_2,\cdots,w_n)$ 表示要求解线性回归模型的参数向量,用 $b$ 表示偏置项,则线性回归模型可以表示为: $$h_w(x^{(i)})=w_1x_1^{(i)}+w_2x_2^{(i)}+\cdots+w_nx_n^{(i)}+b$$ 接下来,我们分别介绍线性回归两种求解方式:解析解和梯度下降法。 ### 1. 解析解 求解线性回归的解析解,即找到一组参数 $w$ 和 $b$,使得对于训练集中的每个样本 $(x^{(i)},y^{(i)})$,都有 $h_w(x^{(i)})\approx y^{(i)}$,并且使得所有样本上的误差 $\sum_{i=1}^{m}(h_w(x^{(i)})-y^{(i)})^2$ 最小。 为了找到最小化误差的参数 $w$ 和 $b$,我们可以对误差函数 $\sum_{i=1}^{m}(h_w(x^{(i)})-y^{(i)})^2$ 求偏导数,并令其为零,求得参数的解析解。具体来说,我们可以使用矩阵运算来求解,即: $$w=(X^TX)^{-1}X^Ty$$ 其中,$X$ 是一个 $m\times(n+1)$ 的矩阵,其第 $i$ 行为 $(1,x_1^{(i)},x_2^{(i)},\cdots,x_n^{(i)})$,$y$ 是一个 $m\times 1$ 的向量,其第 $i$ 个元素为 $y^{(i)}$。$X$ 矩阵中第一列的所有元素均为1,是为了方便计算偏置项 $b$。 ### 2. 梯度下降法 求解线性回归的另一种方法是梯度下降法。梯度下降法的基本思想是沿着误差函数最陡峭的方向,逐步调整模型的参数,使得误差函数最小化。 对于线性回归模型,我们可以定义误差函数为: $$J(w,b)=\frac{1}{2m}\sum_{i=1}^{m}(h_w(x^{(i)})-y^{(i)})^2$$ 其中,$\frac{1}{2m}$ 是为了方便计算梯度,$h_w(x^{(i)})$ 是模型对第 $i$ 个样本的预测值,$y^{(i)}$ 是第 $i$ 个样本的真实值。 我们可以使用梯度下降法来最小化误差函数 $J(w,b)$。具体来说,我们需要不断地更新参数 $w$ 和 $b$,使得其朝着误差函数最小化的方向移动。具体的更新方法是: $$w_j:=w_j-\alpha\frac{\partial J(w,b)}{\partial w_j}$$ $$b:=b-\alpha\frac{\partial J(w,b)}{\partial b}$$ 其中,$\alpha$ 是学习率,控制每次更新的步长。 我们可以通过求偏导数的方法来计算误差函数 $J(w,b)$ 对参数 $w$ 和 $b$ 的偏导数,具体来说: $$\frac{\partial J(w,b)}{\partial w_j}=\frac{1}{m}\sum_{i=1}^{m}(h_w(x^{(i)})-y^{(i)})x_j^{(i)}$$ $$\frac{\partial J(w,b)}{\partial b}=\frac{1}{m}\sum_{i=1}^{m}(h_w(x^{(i)})-y^{(i)})$$ 然后,我们就可以使用梯度下降法来更新模型的参数了。具体来说,我们可以反复执行以下步骤,直到误差函数收敛或达到最大迭代次数: 1. 计算误差函数 $J(w,b)$ 的梯度,即 $\frac{\partial J(w,b)}{\partial w_j}$ 和 $\frac{\partial J(w,b)}{\partial b}$。 2. 使用学习率 $\alpha$ 和梯度更新模型的参数 $w$ 和 $b$,即: $w_j:=w_j-\alpha\frac{\partial J(w,b)}{\partial w_j}$ $b:=b-\alpha\frac{\partial J(w,b)}{\partial b}$ 下面是梯度下降法的推导过程: 首先,对误差函数 $J(w,b)$ 求偏导数,得到: $$\frac{\partial J(w,b)}{\partial w_j}=\frac{1}{m}\sum_{i=1}^{m}(h_w(x^{(i)})-y^{(i)})x_j^{(i)}$$ $$\frac{\partial J(w,b)}{\partial b}=\frac{1}{m}\sum_{i=1}^{m}(h_w(x^{(i)})-y^{(i)})$$ 然后,我们可以使用梯度下降法来更新模型的参数 $w$ 和 $b$。具体来说,我们可以反复执行以下步骤,直到误差函数收敛或达到最大迭代次数: 1. 计算误差函数 $J(w,b)$ 的梯度,即 $\frac{\partial J(w,b)}{\partial w_j}$ 和 $\frac{\partial J(w,b)}{\partial b}$。 2. 使用学习率 $\alpha$ 和梯度更新模型的参数 $w$ 和 $b$,即: $w_j:=w_j-\alpha\frac{\partial J(w,b)}{\partial w_j}$ $b:=b-\alpha\frac{\partial J(w,b)}{\partial b}$ 下面是梯度下降法的推导过程: 首先,我们考虑更新参数 $w$。根据梯度下降法的公式,有: $$w_j:=w_j-\alpha\frac{\partial J(w,b)}{\partial w_j}$$ 代入误差函数 $J(w,b)$ 的定义式,有: $$w_j:=w_j-\alpha\frac{1}{2m}\sum_{i=1}^{m}(h_w(x^{(i)})-y^{(i)})^2$$ 对上式求偏导数,有: $$\frac{\partial J(w,b)}{\partial w_j}=\frac{\partial}{\partial w_j}\left(\frac{1}{2m}\sum_{i=1}^{m}(h_w(x^{(i)})-y^{(i)})^2\right)$$ $$=\frac{1}{m}\sum_{i=1}^{m}(h_w(x^{(i)})-y^{(i)})\frac{\partial}{\partial w_j}(h_w(x^{(i)})-y^{(i)})$$ $$=\frac{1}{m}\sum_{i=1}^{m}(h_w(x^{(i)})-y^{(i)})x_j^{(i)}$$ 所以,我们可以将更新参数 $w$ 的公式改写为: $$w_j:=w_j-\alpha\frac{1}{m}\sum_{i=1}^{m}(h_w(x^{(i)})-y^{(i)})x_j^{(i)}$$ 这就是梯度下降法更新参数 $w$ 的公式。同样地,我们可以推导出更新参数 $b$ 的公式,即: $$b:=b-\alpha\frac{1}{m}\sum_{i=1}^{m}(h_w(x^{(i)})-y^{(i)})$$ 这样,我们就可以使用梯度下降法来求解线性回归模型的参数了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值