线性回归模型的最小二乘表达
数据集:D={(x1,y1),...,(xN,yN)},xi∈Rp,yi∈R,i=1,2,...,N,X=(x1,x2,...,xN)T,Y=(y1,y2,...,yN)TD = \{(x_1,y_1),...,(x_N,y_N) \},x_i \in R^p,y_i \in R,i = 1,2,...,N, X = (x_1,x_2,...,x_N)^T,Y=(y_1,y_2,...,y_N)^TD={(x1,y1),...,(xN,yN)},xi∈Rp,yi∈R,i=1,2,...,N,X=(x1,x2,...,xN)T,Y=(y1,y2,...,yN)T
假设X和Y之间存在线性关系,模型的具体形式为y^=f(w)=wTx\hat{y}=f(w) =w^Txy^=f(w)=wTx
最小二乘估计:
我们需要衡量真实值𝑦𝑖与线性回归模型的预测值wTxiw^Tx_iwTxi之间的差距,在这里我们使用二范数的平方和L(w)来描述这种差距,即:
L(w)=∑i=1N∣∣wTxi−yi∣∣22=∑i=1N(wTxi−yi)2=(wTXT−YT)(wTXT−YT)T=wTXTXw−2wTXTY+YYT L(w) = \sum\limits_{i=1}^{N}||w^Tx_i-y_i||_2^2=\sum\limits_{i=1}^{N}(w^Tx_i-y_i)^2 = (w^TX^T-Y^T)(w^TX^T-Y^T)^T = w^TX^TXw - 2w^TX^TY+YY^TL(w)=i=1∑N∣∣wTxi−yi∣∣22=i=1∑N(wTxi−yi)2=(wTXT−YT)(wTXT−YT)T=wTXTXw−2wTXTY+YYT
因此,我们需要找到使得L(w)最小时对应的参数w,即:
w^=argmin L(w) \hat{w} = argmin\;L(w)w^=argminL(w)
为了达到求解最小化L(w)问题,我们应用高等数学的知识,使用求导来解决这个问题:
∂L(w)∂w=2XTXw−2XTY=0, \frac{\partial L(w)}{\partial w} = 2X^TXw-2X^TY = 0, ∂w∂L(w)=2XTXw−2XTY=0,因此
w^=(XTX)−1XTY \hat{w} = (X^TX)^{-1}X^TY w^=(XTX)−1XTY
几何解释:
在线性代数中,我们知道两个向量a和b相互垂直可以得出:<a,b>=a.b=aTb=0<a,b> = a.b = a^Tb = 0<a,b>=a.b=aTb=0,而平面X的法向量为Y-Xw,与平面X互相垂直,因此:𝑋𝑇(𝑌−𝑋𝑤)=0𝑋^𝑇(𝑌−𝑋𝑤)=0XT(Y−Xw)=0,即:w=(XTX)−1XTYw = (X^TX)^{-1}X^TYw=(XTX)−1XTY
极大似然估计与最小二乘估计的联系与区别
区别:
对于最小二乘法,当从模型总体随机抽取n组样本观测值后,最合理的参数估计量应该使得模型能最好地拟合样本数据,也就是估计值和观测值之差的平方和最小。
而对于最大似然法,当从模型总体随机抽取n组样本观测值后,最合理的参数估计量应该使得从模型中抽取该n组样本观测值的概率最大。显然,这是从不同原理出发的两种参数估计方法。
联系:
线性回归的最小二乘估计<==>噪声ϵ∽N(0,σ2)\epsilon\backsim N(0,\sigma^2)ϵ∽N(0,σ2)的极大似然估计
决策树模型与线性模型的联系与区别
区别:
线性模型的模型形式与树模型的模型形式有着本质的区别,具体而言,线性回归对模型形式做了如下假定:f(x)=w0+∑j=1pwjx(j)f(x) = w_0 + \sum\limits_{j=1}^{p}w_jx^{(j)}f(x)=w0+j=1∑pwjx(j),,而回归树则是f(x)=∑m=1Jc^mI(x∈Rm)f(x) = \sum\limits_{m=1}^{J}\hat{c}_mI(x \in R_m)f(x)=m=1∑Jc^mI(x∈Rm)。
联系:
可用于解决回归问题。
Python编写线性回归模型
假设家庭每月消费支出与每月可支配收入之间的关系为:
Spending=β0+β1∗Income+μSpending =\beta_0 + \beta_1*Income+μSpending=β0+β1∗Income+μ
样本回归模型可表示为: yi=β0+β1∗xiy_i =\beta_0 + \beta_1*x_iyi=β0+β1∗xi
OLS估计的思想是通过最小化残差来对回归系数进行估计,即:
import numpy as np
def linear_OLS(x_arr,y_arr):
x_avg= x_arr.mean()
y_avg = y_arr.mean()
s_xy = (x-x_avg)*(y-y_avg).T
s_x = (x-x_avg)*(x-x_avg).T
beta_1 = s_xy.sum()/s_x.sum()
beta_0 = y_avg-beta_1*x_avg
return beta_1,beta_0
x = np.array([800,1100,1400,1700,2000,2300,2600,2900,3200,3500])
y = np.array([638,935,1155,1254,1408,1650,1925,2068,2266,2530])
beta_1,beta_0 = linear_OLS(x,y)
print('beta_1:',beta_1,'beta_0:',beta_0)
参考:https://www.pythonf.cn/read/74475