线性回归的原理
y^(θ,x)=θ0+θ1x1+…+θpxp
其中:
y^:预测值
θ0,θ1,…θp:参数
x0,x1,…xp:自变量
最小二乘法
下面通过一元线性回归模型做推导:
样本回归模型:
y^i=β^0+β^1xi
残差平方和(损失函数):
Q=i=1∑nei2=i=1∑n(yi−y^i)2=i=1∑n(yi−β^0−β^1xi)2
通过使得Q最小时的参数确定直线,即把它们看作是Q的函数,就变成了一个求极值的问题,可以通过求导数得到。求Q对两个待估参数的偏导数
⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧∂β^0∂Q∂β^1∂Q=2i=1∑n(yi−β^0−β^1xi)(−1)=0=2i=1∑n(yi−β^0−β^1xi)(−xi)=0
扫描二维码关注公众号,回复:
11583910 查看本文章
解得:
β^1=n∑xi2−(∑xi)2n∑xiyi−∑xi∑yi
β^0=n∑xi2−(∑xi)2∑xi2∑yi−∑xi∑xiyi
其中:
β^0=yˉ−β^1xˉ
β^1=∑i=1nxi2−nxˉ2∑i=1nxiyi−nxy
定义:
hθ(x1,x2,…xn−1)=θ0+θ1x1+…+θnxn−1
现在有m个样本,每个样本有n−1维特征将所有样本点代入模型中得:
h1=θ0+θ1x1,1+θ2x1,2+…+θn−1x1,n−1h2=θ0+θ1x2,1+θ2x2,2+…+θn−1x2,n−1⋮hm=θ0+θ1xm,1+θ2xm,2+…+θn−1xm,n−1
为方便用矩阵表示令
x0=1于是上述方程可以用矩阵表示为:
h=Xθ
其中,h为m x 1的向量, 代表模型的理论值,θ 为n x 1的向量,X为 m x n维的矩阵,m代表样本的个数,n代表样本的特征数,于是目标损失函数用矩阵表示为:
J(θ)=∥h−Y∥2=∥Xθ−Y∥2=(Xθ−Y)T(Xθ−Y)
关于矩阵的求导补充以下知识点:
∂x∂xTa∂x∂xTAx=∂x∂aTx=a=Ax+ATx
又由于如果矩阵A是对称的:
Ax+ATx=2Ax
对目标函数化简:
J(θ)=θTXTXθ−θTXTY−YTXθ+YTY
则θ最小值:
θ^=θargminL(θ)⟶∂θ∂L(θ)=0⟶2XTXθ^−2XTY=0⟶θ^=(XTX)−1XTY=X+Y
这个式子中
(XTX)−1XT又被称为伪逆写作
X+,对于行满秩或者列满秩的X ,可以直接求解。
求解 b 在A的列向量空间中的投影。
在几何上,最小二乘法相当于模型(这里就是直线)和试验值的距离的平方求和,假设我们的试验样本张成一个 维空间(满秩的情况)模型写成
f(w)=Xβ而最小二乘法就是说希望 Y 和这个模型距离越小越好,于是它们的差应该与这个张成的空间垂直:
XT⋅(Y−Xβ)=0⟶β=(XTX)−1XTY
python实现最小二乘法(通过矩阵求解)
class LinearRegression:
'''使用Python实现的线性回归.(最小二乘法)'''
def fit(self,X,y):
'''根据提提供的训练数据X,对模型进行训练。
Parameters
------
X :类数组类型。形状:[样本数量,特征数量]
特征矩阵,用来对模型进行训练
y = 类数组类型,形状:[样本数量]
'''
X = np.asmatrix(X.copy())
y = np.asmatrix(y).reshape(-1,1)
self.w_ = (X.T * X ).I * X.T * y
def predict(self,X):
'''根据参数传递的样本X,delattr样本数据进行预测。
Parameters
------
X:类数组类型。形状[样本数量,特征数量]
待预测的样本特征(属性)
Returns
------
result:数组类型
预测的结果
'''
X = np.asmatrix(X.copy())
result = X * self.w_
return np.array(result).ravel()