码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 多元线性回归详解


    入门小菜鸟,希望像做笔记记录自己学的东西,也希望能帮助到同样入门的人,更希望大佬们帮忙纠错啦~侵权立删。

    目录

    一、问题描述

    二、问题分析

    三、解决问题 —— 找w和b

    1、向量形式变换

    2、目标式

    3、导数为0得出结论

    4、最终模型结果

    四、潜藏的问题——可能不是满秩矩阵

    五、潜藏问题解决方法——正则化

    1、L1正则化——Lasso回归

    2、L2正则化——岭回归

    六、线性回归的变化与应用

    七、python实现

    1、多元线性回归

    2、岭回归

    3、lasso回归

    八、线性模型——回归问题分类问题


    一、问题描述

    我们现在手头上有一个数据集D:每一个样本都由d个属性来描述,即 \boldsymbol{x} = (x_{1};x_{2};...;x_{d}),其中x_{i}是样本x在第i个属性上的取值。而每个样本x_{i}最终对应的结果值为y_{i}。

    现在来了一个新的样本\boldsymbol{x}_{j},想知道它的结果值y_{j}


    二、问题分析

    我们需要根据数据集D来找到一个线性模型来进行以\boldsymbol{x}_{j}预测y_{j},即找到f(\boldsymbol{x}_{i})=w^{T}\boldsymbol{x}_{i}+b中合适的w和b。


    三、解决问题 —— 找w和b

    我们可以使用最小二乘法来解决这个问题。

    1、向量形式变换

    首先把w和b合成一个向量形式\hat{\boldsymbol{w}} = (w;b),大小为(d+1)* 1;

    然后改写数据矩阵X:X= \begin{pmatrix} \boldsymbol{x}_{1} & \boldsymbol{x}_{2}&...&\boldsymbol{x}_{m}\\ 1 & 1 & ...& 1\end{pmatrix},大小为(d+1)*  m。

    然后对标记y也写成向量模式: \boldsymbol{y} = (y_{1};y_{2};...;y_{m})

    2、目标式

     \underset{\hat{w}}{arg min}(\boldsymbol{y}-\hat{w}^{T}X)(\boldsymbol{y}-\hat{w}^{T}X)^{T}

    令 E = (\boldsymbol{y}-\hat{w}^{T}X)(\boldsymbol{y}-\hat{w}^{T}X)^{T}

    3、导数为0得出结论

    \frac{\partial E}{\partial \hat{w}} = 2X(X^{T}\hat{w}-\boldsymbol{y})=0\rightarrow \hat{w}=(XX^{T})^{-1}X\boldsymbol{y}  

    4、最终模型结果

    \hat{\boldsymbol{x}_{i}} = (\boldsymbol{x}_{i};1)

    f(\hat{\boldsymbol{x}_{i}}) = \hat{\boldsymbol{x}_{i}}(XX^{T})^{-1}X\boldsymbol{y}


    四、潜藏的问题——XX^{T}可能不是满秩矩阵

    XX^{T}可能不是满秩矩阵,会产生多个\hat{w}最优解,该选择哪个解作为\hat{w}

    比如说:样本数较小,特征属性多,甚至已经超过样本数了,那么此时XX^{T}不是满秩矩阵,可以解出多个\hat{w}的解。


    五、潜藏问题解决方法——正则化

    正则化的作用是选择经验风险与模型复杂度同时较小的模型

    1、L1正则化——Lasso回归

    在目标函数后面加一项 \lambda \sum_{i=1}^{d}|w_{i}|

    则,目标函数变为 \underset{\hat{w}}{arg min}((\boldsymbol{y}-\hat{w}^{T}X)(\boldsymbol{y}-\hat{w}^{T}X)^{T}+\lambda \sum_{i=1}^{d}|w_{i}|)

    第一项是上述所说的经验风险,第二项控制的是模型的复杂度。

    其中\lambda >0,控制惩罚力度:\lambda \rightarrow \infty ,\hat{w}\rightarrow 0;\lambda \rightarrow 0 ,\hat{w}\rightarrow (XX^{T})^{-1}X\boldsymbol{y}

    这也被称为Lasso回归。

    如下图所示(假设只有两个属性):L1正则化平方误差项等值线和正则化等值线常相交于坐标轴上,这就意味着舍弃了其中某个属性,体现了特征选择的特性,更易得到稀疏解(相较于下面的L2正则化)—— 即求得的W向量中会有更少的非零值 。

    2、L2正则化——岭回归

    在目标函数后面加一项\lambda \sum_{i=1}^{d}w_{i}^{2}

    则,目标函数变为 \underset{\hat{w}}{arg min}((\boldsymbol{y}-\hat{w}^{T}X)(\boldsymbol{y}-\hat{w}^{T}X)^{T}+\lambda \sum_{i=1}^{d}w_{i}^{2})

    这也被称为岭回归。

    L2正则化均匀选择参数,让拟合曲线各项系数都差不多,虽然没能减少项的个数,但是均衡了各项系数,这是原理上与L1正则化不同的地方。


    六、线性回归的变化与应用

    如果该问题的模型不是线性回归,则可尝试令模型预测值逼近y的衍生物。

    比如——对数线性回归 lny_{i}=w^{T}\boldsymbol{x}_{i}+b

    更一般的:y=g^{-1}(w^{T}\boldsymbol{\boldsymbol{x}}+b),这称为广义线性模型。


    七、python实现

    1、多元线性回归

    1. from sklearn.linear_model import LinearRegression
    2. from sklearn.model_selection import train_test_split
    3. X_train,X_test,Y_train,Y_test=train_test_split(x,y,test_size=0.3,random_state=1)//x,y分别为已经分好的属性数据和标记数据
    4. model = LinearRegression()
    5. model.fit(X_train, Y_train)
    6. score = model.score(X_test, Y_test)
    7. print('模型测试得分:'+str(score))
    8. Y_pred = model.predict(X_test)
    9. print(Y_pred)

    2、岭回归

    1. from sklearn.linear_model import Ridge
    2. from sklearn.model_selection import train_test_split
    3. X_train,X_test,Y_train,Y_test=train_test_split(x,y,test_size=0.3,random_state=1)//x,y分别为已经分好的属性数据和标记数据
    4. model = Ridge(alpha=1)
    5. model.fit(X_train, Y_train)
    6. score = model.score(X_test, Y_test)
    7. print('模型测试得分:'+str(score))
    8. Y_pred = model.predict(X_test)
    9. print(Y_pred)

    3、lasso回归

    1. from sklearn.linear_model import Lasso
    2. from sklearn.model_selection import train_test_split
    3. X_train,X_test,Y_train,Y_test=train_test_split(x,y,test_size=0.3,random_state=1)//x,y分别为已经分好的属性数据和标记数据
    4. model = Lasso(alpha=0.1)
    5. model.fit(X_train, Y_train)
    6. score = model.score(X_test, Y_test)
    7. print('模型测试得分:'+str(score))
    8. Y_pred = model.predict(X_test)
    9. print(Y_pred)

    八、线性模型——回归问题\rightarrow分类问题

    上述说的都是用线性模型解决回归问题,其实线性模型也可以用来解决分类问题——逻辑回归(对数几率回归)。

    详见逻辑回归(Logistic Regression)_tt丫的博客-CSDN博客_逻辑回归csdn


    欢迎大家在评论区批评指正,谢谢大家~

  • 相关阅读:
    STM8与汇编语言(9)--EEPROM应用
    图数据库实践 - 如何将图数据库应用于对公信贷
    OpenCV15-图像边缘检测:Sobel、Scharr、Laplace、Canny
    Matlab求解椭球上运动的点B,满足到定点A、C的距离之和最短
    关于canvas的缩放和位移实战的一点点总结
    ElasticSearch全文搜索引擎
    高项 07 项目成本管理
    微信小程序富文本解析器rich-text、web-view、wxParse、mp-html、towxml对比
    【滤波】概率、高斯和贝叶斯
    C语言为什么for不执行?
  • 原文地址:https://blog.csdn.net/weixin_55073640/article/details/125807369
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号