为什么会用纯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 ∙ x+b(这里为内积的形式),但通常将b移到W向量里面去,写为W=[b,w1,w2,…wd],改变后的W用θ表示,θ=[θ0,θ1,θ2,…θd]

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

现在Y=W ∙ x+b 就等价为 Y=θ∙x

在机器学习的矩阵运算当中,有个约定俗称的规定,当说某某向量时都指的是一个列向量,所以θ和x都是一个d+1维的列向量[θ0θd]、[x0xd],同时也都是一个(d+1)x1维的矩阵

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

所以这里用大写的X表示有m个样本,X=[x1TxmT⋯]=[x01xd1x0mxdm],(这里的X是一个矩阵,包含了所有的样本点x1,x2,…xm而每一个样本点都是有相同的多维的, [x1TxmT⋯]* [θ0θd]= y0ym=Y,得到一个m*1维的矩阵Y,这个矩阵中的每一个参数代表给定的θ参数下对每一个样本xi的预测值yi,Y是对应样本的标签值,也是一个列向量。

得到Y(预测值)过后,就可以算损失函数了,L=i=1m(yi-yi)2y是对应样本的真实值

L=(y1-y1)2+(y2-y2)2+…+(ym-ym)2

 =[ y1-y1,,ym-ym]  [y1-y1ym-ym]

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

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

因为x、θY都是一个m+1维的列向量所以第一项(x∙θ-Y)的结果也是一个列项量,所以加了一个转置

得到损失函数L=(x∙θ-Y)T (xθ-Y),通过改变θ的值来最小化L

对θ求偏导,∂L∂θ=(θTxT-YT)(xθ-Y)∂θ=θTxTxθ-θTxTY-YTxθ+YTY∂θ,每一项都对θ求偏导然后加起来

 ∂L∂θ=2xTxθ-xTY-xTY,要使损失函数最小,就是偏导为0的点

所以推出xTxθ=xTY,θ=( xTx)-1xTY,这就要求(xTx)是可逆的

 

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

实现方法和结果不同:最小二乘法是直接对∆求导找出全局最小,是非迭代法。而梯度下降法是一种迭代法,先给定一个β ,然后向∆下降最快的方向调整β ,在若干次迭代之后找到局部最小。梯度下降法的缺点是到最小点的时候收敛速度变慢,并且对初始点的选择极为敏感,其改进大多是在这两方面下功夫。

 

 

 

 

 

 

 

 

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐