python线性回归代码最小二乘法 numpy最小二乘法多元回归

admin2024-06-11  11

为什么会用纯Python来实现呢?这种陶(hao)冶(wu)情(yong)操(chu)的做法肯定也不是我自己闲着蛋疼搞着玩的。。。  明明有更好的科学计算库不用,非要纯手写正面硬刚,除了老师用挂科作为威胁还能有谁?

下面是一大纯手打的堆理推导... 写的逻辑有些混乱,后续有时间再慢慢整理 觉得麻烦的小伙伴就不用看了,反正我代码里也写的有注释,代码稍后传上github后更新连接

---------------------------------------------------------------------------------------------------------------
 

多元线性回归 最小二乘法实现

 

线性回归包括一元线性回归和多元线性回归,一元的是只有一个x和一个y。多元的是指有多个x和一个y。

 

 

对于平面中的这n个点,可以使用无数条曲线来拟合。要求样本回归函数尽可能好地拟合这组值。综合起来看,这条直线处于样本数据的中心位置最合理。 选择最佳拟合曲线的标准可以确定为:使总的拟合误差(即总残差)达到最小。有以下三个标准可以选择:

        (1)用“残差和最小”确定直线位置是一个途径。但很快发现计算“残差和”存在相互抵消的问题。
        (2)用“残差绝对值和最小”确定直线位置也是一个途径。但绝对值的计算比较麻烦。
        (3)最小二乘法的原则是以“残差平方和最小”确定直线位置。用最小二乘法除了计算比较方便外,得到的估计量还具有优良特性。这种方法对异常值非常敏感。

 

样本x为一个多维向量,x=[x1,x2,…xd]

那么权重W也是与X同维度的一个向量,W=[w1,w2,…wd]

所以Y对x的预测可以写为Y=W ∙ python线性回归代码最小二乘法 numpy最小二乘法多元回归,python线性回归代码最小二乘法 numpy最小二乘法多元回归_损失函数,第1张x+b(这里为内积的形式),但通常将b移到W向量里面去,写为W=[b,w1,w2,…wd],改变后的W用θpython线性回归代码最小二乘法 numpy最小二乘法多元回归,python线性回归代码最小二乘法 numpy最小二乘法多元回归_最小二乘法_02,第2张表示,θ=[θ0,θ1,θ2,…θd]

python线性回归代码最小二乘法 numpy最小二乘法多元回归,python线性回归代码最小二乘法 numpy最小二乘法多元回归_损失函数_03,第3张

因为W的维度变了所以我们也要给x对应的多加一个维度,此时的x为[x0,x1,…xd],使x0等于1,让其在矩阵相乘时匹配刚才在W中加入的b

现在Y=W ∙ python线性回归代码最小二乘法 numpy最小二乘法多元回归,python线性回归代码最小二乘法 numpy最小二乘法多元回归_损失函数_04,第4张x+b 就等价为 Y=θ∙xpython线性回归代码最小二乘法 numpy最小二乘法多元回归,python线性回归代码最小二乘法 numpy最小二乘法多元回归_最小二乘法_05,第5张

在机器学习的矩阵运算当中,有个约定俗称的规定,当说某某向量时都指的是一个列向量,所以θ和x

python线性回归代码最小二乘法 numpy最小二乘法多元回归,python线性回归代码最小二乘法 numpy最小二乘法多元回归_拟合_06,第6张

都是一个d+1维的列向量[θ0θd]

python线性回归代码最小二乘法 numpy最小二乘法多元回归,python线性回归代码最小二乘法 numpy最小二乘法多元回归_python线性回归代码最小二乘法_07,第7张

、[x0xd]python线性回归代码最小二乘法 numpy最小二乘法多元回归,python线性回归代码最小二乘法 numpy最小二乘法多元回归_拟合_08,第8张,同时也都是一个(d+1)x1维的矩阵

这里的维度就对应方程里面的元数,有几维就是几元

所以这里用大写的X表示有m个样本,X=[x1TxmT⋯

python线性回归代码最小二乘法 numpy最小二乘法多元回归,python线性回归代码最小二乘法 numpy最小二乘法多元回归_损失函数_09,第9张

]=[x01xd1x0mxdm]

python线性回归代码最小二乘法 numpy最小二乘法多元回归,python线性回归代码最小二乘法 numpy最小二乘法多元回归_损失函数_10,第10张

,(这里的X是一个矩阵,包含了所有的样本点x1,x2,…xm而每一个样本点都是有相同的多维的, [x1TxmT⋯

python线性回归代码最小二乘法 numpy最小二乘法多元回归,python线性回归代码最小二乘法 numpy最小二乘法多元回归_损失函数_11,第11张

]* [θ0θd]

python线性回归代码最小二乘法 numpy最小二乘法多元回归,python线性回归代码最小二乘法 numpy最小二乘法多元回归_拟合_12,第12张

= y0ym=Y

python线性回归代码最小二乘法 numpy最小二乘法多元回归,python线性回归代码最小二乘法 numpy最小二乘法多元回归_损失函数_13,第13张

,得到一个m*1维的矩阵Ypython线性回归代码最小二乘法 numpy最小二乘法多元回归,python线性回归代码最小二乘法 numpy最小二乘法多元回归_最小二乘法_14,第14张,这个矩阵中的每一个参数代表给定的θ参数下

python线性回归代码最小二乘法 numpy最小二乘法多元回归,python线性回归代码最小二乘法 numpy最小二乘法多元回归_损失函数_15,第15张

对每一个样本xi的预测值yi,Ypython线性回归代码最小二乘法 numpy最小二乘法多元回归,python线性回归代码最小二乘法 numpy最小二乘法多元回归_最小二乘法_16,第16张是对应样本的标签值,也是一个列向量。得到Y(预测值)过后,就可以算损失函数了,L=i=1m(yi-yi)2

python线性回归代码最小二乘法 numpy最小二乘法多元回归,python线性回归代码最小二乘法 numpy最小二乘法多元回归_损失函数_17,第17张

y是对应样本的真实值

python线性回归代码最小二乘法 numpy最小二乘法多元回归,python线性回归代码最小二乘法 numpy最小二乘法多元回归_拟合_18,第18张

L=(y1-y1)2

python线性回归代码最小二乘法 numpy最小二乘法多元回归,python线性回归代码最小二乘法 numpy最小二乘法多元回归_拟合_19,第19张

+(y2-y2)2

python线性回归代码最小二乘法 numpy最小二乘法多元回归,python线性回归代码最小二乘法 numpy最小二乘法多元回归_最小二乘法_20,第20张

+…+(ym-ym)2

python线性回归代码最小二乘法 numpy最小二乘法多元回归,python线性回归代码最小二乘法 numpy最小二乘法多元回归_python线性回归代码最小二乘法_21,第21张

 =[ y1-y1,,ym-ym

python线性回归代码最小二乘法 numpy最小二乘法多元回归,python线性回归代码最小二乘法 numpy最小二乘法多元回归_拟合_22,第22张

] python线性回归代码最小二乘法 numpy最小二乘法多元回归,python线性回归代码最小二乘法 numpy最小二乘法多元回归_拟合_23,第23张 [y1-y1ym-ym]

python线性回归代码最小二乘法 numpy最小二乘法多元回归,python线性回归代码最小二乘法 numpy最小二乘法多元回归_最小二乘法_24,第24张

 =(y1,⋯,ym-[y1,,ym])

python线性回归代码最小二乘法 numpy最小二乘法多元回归,python线性回归代码最小二乘法 numpy最小二乘法多元回归_最小二乘法_25,第25张

 [y1-y1ym-ym]

python线性回归代码最小二乘法 numpy最小二乘法多元回归,python线性回归代码最小二乘法 numpy最小二乘法多元回归_损失函数_26,第26张

 =(x∙θ-Y)T ∙  (xθ-Y)

python线性回归代码最小二乘法 numpy最小二乘法多元回归,python线性回归代码最小二乘法 numpy最小二乘法多元回归_损失函数_27,第27张

因为x、θ

python线性回归代码最小二乘法 numpy最小二乘法多元回归,python线性回归代码最小二乘法 numpy最小二乘法多元回归_python线性回归代码最小二乘法_28,第28张

Ypython线性回归代码最小二乘法 numpy最小二乘法多元回归,python线性回归代码最小二乘法 numpy最小二乘法多元回归_python线性回归代码最小二乘法_29,第29张都是一个m+1维的列向量所以第一项(x∙θ-Y)

python线性回归代码最小二乘法 numpy最小二乘法多元回归,python线性回归代码最小二乘法 numpy最小二乘法多元回归_拟合_30,第30张

的结果也是一个列项量,所以加了一个转置得到损失函数L=(x∙θ-Y)T (xθ-Y)

python线性回归代码最小二乘法 numpy最小二乘法多元回归,python线性回归代码最小二乘法 numpy最小二乘法多元回归_拟合_31,第31张

,通过改变θ的python线性回归代码最小二乘法 numpy最小二乘法多元回归,python线性回归代码最小二乘法 numpy最小二乘法多元回归_损失函数_32,第32张值来最小化L对θpython线性回归代码最小二乘法 numpy最小二乘法多元回归,python线性回归代码最小二乘法 numpy最小二乘法多元回归_损失函数_33,第33张求偏导,∂L∂θ=(θTxT-YT)(xθ-Y)∂θ=θTxTxθ-θTxTY-YTxθ+YTY∂θ

python线性回归代码最小二乘法 numpy最小二乘法多元回归,python线性回归代码最小二乘法 numpy最小二乘法多元回归_拟合_34,第34张

,每一项都对θpython线性回归代码最小二乘法 numpy最小二乘法多元回归,python线性回归代码最小二乘法 numpy最小二乘法多元回归_拟合_35,第35张求偏导然后加起来 ∂L∂θ=2xTxθ-xTY-xTY

python线性回归代码最小二乘法 numpy最小二乘法多元回归,python线性回归代码最小二乘法 numpy最小二乘法多元回归_损失函数_36,第36张

,要使损失函数最小,就是偏导为0的点所以推出xTxθ=xTY

python线性回归代码最小二乘法 numpy最小二乘法多元回归,python线性回归代码最小二乘法 numpy最小二乘法多元回归_拟合_37,第37张

,θ=( xTx)-1xTY

python线性回归代码最小二乘法 numpy最小二乘法多元回归,python线性回归代码最小二乘法 numpy最小二乘法多元回归_拟合_38,第38张

,这就要求(xTx)

python线性回归代码最小二乘法 numpy最小二乘法多元回归,python线性回归代码最小二乘法 numpy最小二乘法多元回归_拟合_39,第39张

是可逆的

 

最小二乘法与梯度下降法的区别:

实现方法和结果不同:最小二乘法是直接对∆python线性回归代码最小二乘法 numpy最小二乘法多元回归,python线性回归代码最小二乘法 numpy最小二乘法多元回归_python线性回归代码最小二乘法_40,第40张求导找出全局最小,是非迭代法。而梯度下降法是一种迭代法,先给定一个βpython线性回归代码最小二乘法 numpy最小二乘法多元回归,python线性回归代码最小二乘法 numpy最小二乘法多元回归_损失函数_41,第41张 ,然后向∆python线性回归代码最小二乘法 numpy最小二乘法多元回归,python线性回归代码最小二乘法 numpy最小二乘法多元回归_拟合_42,第42张下降最快的方向调整βpython线性回归代码最小二乘法 numpy最小二乘法多元回归,python线性回归代码最小二乘法 numpy最小二乘法多元回归_最小二乘法_43,第43张 ,在若干次迭代之后找到局部最小。梯度下降法的缺点是到最小点的时候收敛速度变慢,并且对初始点的选择极为敏感,其改进大多是在这两方面下功夫。

 

 

 

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明原文出处。如若内容造成侵权/违法违规/事实不符,请联系SD编程学习网:675289112@qq.com进行投诉反馈,一经查实,立即删除!