线性回归
最近很久没出来活动了,好多学习资源被我浪费了,经过了半年的错过。现在感觉到自己不济,抓紧时间吧。
回归正题,线性回归试图学得f(xi)=ωxi+bf(x_{i})=\omega x_{i}+bf(xi)=ωxi+b,使得f(xi)≃yif(x_{i})\simeq y_{i}f(xi)≃yi。
西瓜书讲到均方误差 MSE 是回归任务中最常用的性能度量,试图让 MSE 最小化。
(ω∗,b∗)=arg min(w,b)∑i=1m(f(xi)−yi)2=arg min(w,b)∑i=1m(f(xi)−ωxi−b)2(\omega^*,b^*)=\underset{(w,b)}{arg\ min}\sum_{i=1}^{m}(f(x_{i})-y_{i})^2
\\=\underset{(w,b)}{arg\ min}\sum_{i=1}^{m}(f(x_{i})-\omega x_{i}-b)^2(ω∗,b∗)=(w,b)arg mini=1∑m(f(xi)−yi)2=(w,b)arg mini=1∑m(f(xi)−ωxi−b)2
基于均方误差最小化来进行模型求解的方法称之为“最小二乘法”。
求解 ω\omegaω 和 bbb 使E(w,b)=∑i=1m(yi−ωxi−b)2E_{(w,b)}=\sum_{i=1}^{m}(y_{i}-\omega x_{i}-b)^2E(w,b)=∑i=1m(yi−ωxi−b)2最小化的过程,称之为线性回归模型的最小二乘“参数估计”。
将E(w,b)E_{(w,b)}E(w,b)分别对 ω\omegaω 和 bbb 求导,得到:
∂E(ω,b)∂ω=2(ω∑i=1mxi2−∑i=1m(yi−b)xi)−−−−−(1.1)\frac{\partial E(\omega,b)}{\partial \omega} =2(\omega\sum_{i=1}^{m}x_{i}^2-\sum_{i=1}^{m}(y_{i}-b)x_{i})-----(1.1)∂ω∂E(ω,b)=2(ωi=1∑mxi2−i=1∑m(yi−b)xi)−−−−−(1.1)
∂E(ω,b)∂b=2(mb−∑i=1m(yi−ωxi))−−−−(1.2)\frac{\partial E(\omega,b)}{\partial b} =2(mb-\sum_{i=1}^{m}(y_{i}-\omega x_{i})) ----(1.2)∂b∂E(ω,b)=2(mb−i=1∑m(yi−ωxi))−−−−(1.2)
令式(1.1)和(1.2)为0可得到 ω\omegaω 和 bbb 最优解的闭式解
ω=∑i=1myi(xi−xˉ)∑i=1mxi2−1m(∑i=1mxi)2\omega=\frac{\sum_{i=1}^{m}y_{i}(x_{i}-\bar{x})}{\sum_{i=1}^{m}x_{i}^2-\frac{1}{m}(\sum_{i=1}^{m}x_{i})^2}ω=∑i=1mxi2−m1(∑i=1mxi)2∑i=1myi(xi−xˉ)
b=1m∑−i=1m(yi−ωxi)b=\frac{1}{m}\sum-{i=1}^{m}(y_{i}-\omega x_{i})b=m1∑−i=1m(yi−ωxi)
在这里,可以先求出 bbb ,然后带入(1.1)式中,求出 ω\omegaω ,其中 xˉ=1m∑i=1mxi\bar{x}=\frac{1}{m}\sum_{i=1}^{m}x_{i}xˉ=m1∑i=1mxi 为 xix_{i}xi 的均值。
更一般的情形给定数据 DDD ,样本由 ddd 个属性描述,此时试图学得
f(xi)=ωTxi+bf(x_{i})=\omega^{T}x_{i}+bf(xi)=ωTxi+b使得f(xi)≃yif(x_{i})\simeq y_{i}f(xi)≃yi
一般地,
b∼P(bi)=12πσe(−((bi)2)2σ)b\sim P\left(b^i\right)=\frac{1}{\sqrt{2\pi}\sigma}e^{(-\frac{((b^{i})^2)}{2\sigma})}b∼P(bi)=2πσ1e(−2σ((bi)2))
写出似然函数
L(ω)⇒P(f(xi)∣xi:ω)=12πσe(−((yi−ωxi)2)2σ)L(\omega)\Rightarrow P(f(x_{i})\mid x_{i}:\omega )=\frac{1}{\sqrt{2\pi}\sigma}e^{(-\frac{((y^{i}-\omega x^{i})^2)}{2\sigma})}L(ω)⇒P(f(xi)∣xi:ω)=2πσ1e(−2σ((yi−ωxi)2))
取对数,写出对数似然
lnL(θ)=ln∏i=1m12πσe(−((yi−ωxi)2)2σ)=mln12πσ−12σ2∑i=1m(yi−ωxi)2\ln L(\theta)\\=\ln \prod_{i=1}^{m}\frac{1}{\sqrt{2\pi}\sigma}e^{(-\frac{((y^{i}-\omega x^{i})^2)}{2\sigma})} \\ =m\ln\frac{1}{\sqrt{2\pi}\sigma}-\frac{1}{2\sigma^2}\sum_{i=1}^{m}(y^{i}-\omega x^{i})^2lnL(θ)=ln∏i=1m2πσ1e(−2σ((yi−ωxi)2))=mln2πσ1−2σ21∑i=1m(yi−ωxi)2
观察上式,为使得误差最小(尽可能的小),只需要似然公式的后半部分尽可能的小即可。
取
U(ω)=12∑i=1m(yi−ωxi)2=12∑i=1m(u(ω(xi))−yi)2=12(xω−y)T(xω−y)U(\omega)\\=\frac{1}{2}\sum_{i=1}^{m}(y^{i}-\omega x^{i})^2\\=\frac{1}{2}\sum_{i=1}^{m}(u(\omega(x^{i}))-y^{i})^2\\=\frac{1}{2}(x\omega-y)^T(x\omega-y)U(ω)=21∑i=1m(yi−ωxi)2=21∑i=1m(u(ω(xi))−yi)2=21(xω−y)T(xω−y)
此处,是把数据集 DDD 表示成矩阵形式。
对 U(ω)U(\omega)U(ω) 的 ω\omegaω 求导可得:
∂U(ω)∂ω=XTXω−XTy\frac{\partial U(\omega) }{\partial \omega}=X^TX\omega-X^Ty∂ω∂U(ω)=XTXω−XTy
其中,主要是将 12(xω−y)T(xω−y)\frac{1}{2}(x\omega-y)^T(x\omega-y)21(xω−y)T(xω−y) 先转置运算,乘积打开,再求导。
令 ∂U(ω)∂ω=0\frac{\partial U(\omega) }{\partial \omega}=0∂ω∂U(ω)=0 可得:ω=(XTX)−1XTy\omega=(X^TX)^{-1}X^Tyω=(XTX)−1XTy
以为喜大普奔了,现实中往往是残酷的(XTXX^TXXTX往往不是满秩矩阵)
救命的西瓜书来了,,常用的做法是引入正则化项,前提是列多于行(也就是所谓的变量很多,样例少)。
对数线性回归:lny=ωTx+blny=\omega^Tx+blny=ωTx+b 。这个式子只是隐式函数而已,火眼金睛还是线性回归,但其实质上是在求取输入空间到输出空间的非线性函数映射。
不懂?画一个 y=eωTx+by=e^{\omega^Tx+b}y=eωTx+b 与 y′=ωTx+by'=\omega^Tx+by′=ωTx+b 。比对点与点的联系。
不过,实际中样例数真的有这么穷到比变量少的?(保留)
广义线性模型:y=g−1(ωTx+b)y=g^{-1}(\omega^Tx+b)y=g−1(ωTx+b)
其中 g−1g^{-1}g−1 称之为“联系函数”,对数线性回归是广义线性模型在 g(⋅)=ln(⋅)g(\cdot)=ln(\cdot)g(⋅)=ln(⋅) 时的特例。
对于常用的评估项 R2=1−∑(yi^−yi)2∑(yi−yˉ)2R^2 = 1-\frac{\sum (\hat{y_{i}}-y_{i})^2}{\sum (y_{i}-\bar{y})^2}R2=1−∑(yi−yˉ)2∑(yi^−yi)2 ,这个当然是越接近于1越好啊。
机器学习的套路来了?
对于得到 y=ωTx+by=\omega^Tx+by=ωTx+b 这样一个目标函数,直接求解,未必一定可解啊(表示不想死在计算上)。交给机器一大把数据,来,线性回归,解一下,必须的线性回归,别的我都不要,如何迭代自己产生能量。这里主要是讲第二种求解方法:梯度下降
梯度下降:对自变量不停地更新,也就是 y=ωTx+by=\omega^Tx+by=ωTx+b 中对 ω\omegaω 和 bbb 求偏导,使得目标函数不断趋近于最小值的一个过程。
批量梯度下降: 把所有样本都扔进去,容易得到最优解,但是速度上就很慢了。
随机梯度下降: 每次找一个样本,迭代速度快,但不一定每次都朝着收敛的方向。
小批量梯度下降: 每次更新,选择一小部分数据来算,实用性较强。
自己来一波儿?(这不是在为难我吗?┭┮﹏┭┮)
记得没错的话,可以使用sklearn里自带的数据集---------波士顿房价预测
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression,SGDRegressor
from sklearn.metrics import mean_squared_error
使用 LinearRegression() 得到的线性回归的预测系数:
[[-0.10355227 0.16306988 0.00343696 0.09555156 -0.23497297 0.25485994
0.01771771 -0.37762936 0.3073077 -0.22716396 -0.21499725 0.07761778
-0.43457091]]
采用 SGDRegressor() 求得的线性回归的预测系数:
[-6.82294546e-02 9.46123678e-02 -4.82762279e-02 1.11277826e-01
-1.06705658e-01 3.15981788e-01 2.15120318e-04 -2.32268920e-01
9.51851934e-02 -4.53409990e-02 -1.97275683e-01 7.73113250e-02
-3.89289986e-01]
最后给出线性回归和梯度下降法的 MSE:
线性方程的 MSE: 16.81885806991436
梯度下降法下均方误差为: 15.562294247971021
仅仅是用了sklearn库里的小沙粒来学习,空了继续更新自己的学习路。
欢迎评论区留言 敲我