y ^ ( θ , x ) = θ 0 + θ 1 x 1 + … + θ p x p \hat{y}(\theta, x)=\theta_{0}+\theta_{1} x_{1}+\ldots+\theta_{p} x_{p} y^(θ,x)=θ0+θ1x1+…+θpxp
其中:
y ^ \hat{y} y^:预测值
θ 0 , θ 1 , … θ p \theta_{0}, \theta_{1}, \ldots \theta_{p} θ0,θ1,…θp:参数
x 0 , x 1 , … x p x_{0}, x_{1}, \ldots x_{p} x0,x1,…xp:自变量
下面通过一元线性回归模型做推导:
样本回归模型:
y ^ i = β ^ 0 + β ^ 1 x i \hat{y}_{i}=\hat{\beta}_{0}+\hat{\beta}_{1} x_{i} y^i=β^0+β^1xi
残差平方和(损失函数):
Q = ∑ i = 1 n e i 2 = ∑ i = 1 n ( y i − y ^ i ) 2 = ∑ i = 1 n ( y i − β ^ 0 − β ^ 1 x i ) 2 Q=\sum_{i=1}^{n} e_{i}^{2}=\sum_{i=1}^{n}\left(y_{i}-\hat{y}_{i}\right)^{2}=\sum_{i=1}^{n}\left(y_{i}-\hat{\beta}_{0}-\hat{\beta}_{1} x_{i}\right)^{2} Q=i=1∑nei2=i=1∑n(yi−y^i)2=i=1∑n(yi−β^0−β^1xi)2
通过使得Q最小时的参数确定直线,即把它们看作是Q的函数,就变成了一个求极值的问题,可以通过求导数得到。求Q对两个待估参数的偏导数
{ ∂ Q ∂ β ^ 0 = 2 ∑ i = 1 n ( y i − β ^ 0 − β ^ 1 x i ) ( − 1 ) = 0 ∂ Q ∂ β ^ 1 = 2 ∑ i = 1 n ( y i − β ^ 0 − β ^ 1 x i ) ( − x i ) = 0 \left\{\begin{aligned} \frac{\partial Q}{\partial \hat{\beta}_{0}} &=2 \sum_{i=1}^{n}\left(y_{i}-\hat{\beta}_{0}-\hat{\beta}_{1} x_{i}\right)(-1)=0 \\ \frac{\partial Q}{\partial \hat{\beta}_{1}} &=2 \sum_{i=1}^{n}\left(y_{i}-\hat{\beta}_{0}-\hat{\beta}_{1} x_{i}\right)\left(-x_{i}\right)=0 \end{aligned}\right. ⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧∂β^0∂Q∂β^1∂Q=2i=1∑n(yi−β^0−β^1xi)(−1)=0=2i=1∑n(yi−β^0−β^1xi)(−xi)=0
解得:
β ^ 1 = n ∑ x i y i − ∑ x i ∑ y i n ∑ x i 2 − ( ∑ x i ) 2 \hat{\beta}_{1}=\frac{n \sum x_{i} y_{i}-\sum x_{i} \sum y_{i}}{n \sum x_{i}^{2}-\left(\sum x_{i}\right)^{2}} β^1=n∑xi2−(∑xi)2n∑xiyi−∑xi∑yi
β ^ 0 = ∑ x i 2 ∑ y i − ∑ x i ∑ x i y i n ∑ x i 2 − ( ∑ x i ) 2 \hat{\beta}_{0}=\frac{\sum x_{i}^{2} \sum y_{i}-\sum x_{i} \sum x_{i} y_{i}}{n \sum x_{i}^{2}-\left(\sum x_{i}\right)^{2}} β^0=n∑xi2−(∑xi)2∑xi2∑yi−∑xi∑xiyi
其中:
β ^ 0 = y ˉ − β ^ 1 x ˉ \hat{\beta}_{0}=\bar{y}-\hat{\beta}_1 \bar{x} β^0=yˉ−β^1xˉ
β ^ 1 = ∑ i = 1 n x i y i − n x y ‾ ∑ i = 1 n x i 2 − n x ˉ 2 \hat{\beta}_{1}=\frac{\sum_{i=1}^{n} x_{i} y_{i}-n \overline{x y}}{\sum_{i=1}^{n} x_{i}^2-n \bar{x}^{2}} β^1=∑i=1nxi2−nxˉ2∑i=1nxiyi−nxy
定义:
h θ ( x 1 , x 2 , … x n − 1 ) = θ 0 + θ 1 x 1 + … + θ n x n − 1 h_{\theta}\left(x_{1}, x_{2}, \ldots x_{n-1}\right)=\theta_{0}+\theta_{1} x_{1}+\ldots+\theta_{n} x_{n-1} hθ(x1,x2,…xn−1)=θ0+θ1x1+…+θnxn−1
现在有m个样本,每个样本有n−1维特征将所有样本点代入模型中得:
h 1 = θ 0 + θ 1 x 1 , 1 + θ 2 x 1 , 2 + … + θ n − 1 x 1 , n − 1 h 2 = θ 0 + θ 1 x 2 , 1 + θ 2 x 2 , 2 + … + θ n − 1 x 2 , n − 1 ⋮ h m = θ 0 + θ 1 x m , 1 + θ 2 x m , 2 + … + θ n − 1 x m , n − 1 \begin{array}{l} h_{1}=\theta_{0}+\theta_{1} x_{1,1}+\theta_{2} x_{1,2}+\ldots+\theta_{n-1} x_{1, n-1} \\ h_{2}=\theta_{0}+\theta_{1} x_{2,1}+\theta_{2} x_{2,2}+\ldots+\theta_{n-1} x_{2, n-1} \\ \vdots \\ h_{m}=\theta_{0}+\theta_{1} x_{m, 1}+\theta_{2} x_{m, 2}+\ldots+\theta_{n-1} x_{m, n-1} \end{array} 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
为方便用矩阵表示令 x 0 = 1 x_0 = 1 x0=1于是上述方程可以用矩阵表示为:
h = X θ \mathbf{h}=\mathbf{X} \theta 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 ) J(\theta)=\|\mathbf{h}-\mathbf{Y}\|^{2}=\|\mathbf{X} \theta-\mathbf{Y}\|^{2}=(\mathbf{X} \theta-\mathbf{Y})^{T}(\mathbf{X} \theta-\mathbf{Y}) J(θ)=∥h−Y∥2=∥Xθ−Y∥2=(Xθ−Y)T(Xθ−Y)
关于矩阵的求导补充以下知识点:
∂ x T a ∂ x = ∂ a T x ∂ x = a ∂ x T A x ∂ x = A x + A T x \begin{aligned} \frac{\partial x^{T} a}{\partial x} &=\frac{\partial a^{T} x}{\partial x}=a \\ \frac{\partial x^{T} A x}{\partial x} &=A x+A^{T} x \end{aligned} ∂x∂xTa∂x∂xTAx=∂x∂aTx=a=Ax+ATx
又由于如果矩阵A是对称的:
A x + A T x = 2 A x A x+A^{T} x=2 A x Ax+ATx=2Ax
对目标函数化简:
J ( θ ) = θ T X T X θ − θ T X T Y − Y T X θ + Y T Y J(\theta)=\theta^{T} X^{T} X \theta-\theta^{T} X^{T} Y-Y^{T} X \theta+Y^{T} Y J(θ)=θTXTXθ−θTXTY−YTXθ+YTY
则θ最小值:
θ ^ = argmin θ L ( θ ) ⟶ ∂ ∂ θ L ( θ ) = 0 ⟶ 2 X T X θ ^ − 2 X T Y = 0 ⟶ θ ^ = ( X T X ) − 1 X T Y = X + Y \begin{aligned} \hat{\theta}=\underset{\theta}{\operatorname{argmin}} L(\theta) & \longrightarrow \frac{\partial}{\partial \theta} L(\theta)=0 \\ & \longrightarrow 2 X^{T} X \hat{\theta}-2 X^{T} Y=0 \\ & \longrightarrow \hat{\theta}=\left(X^{T} X\right)^{-1} X^{T} Y=X^{+} Y \end{aligned} θ^=θargminL(θ)⟶∂θ∂L(θ)=0⟶2XTXθ^−2XTY=0⟶θ^=(XTX)−1XTY=X+Y
这个式子中 ( X T X ) − 1 X T \left(X^{T} X\right)^{-1} X^{T} (XTX)−1XT又被称为伪逆写作 X + X^{+} X+,对于行满秩或者列满秩的X ,可以直接求解。
求解 b 在A的列向量空间中的投影。
在几何上,最小二乘法相当于模型(这里就是直线)和试验值的距离的平方求和,假设我们的试验样本张成一个 维空间(满秩的情况)模型写成 f ( w ) = X β f(w)=X \beta f(w)=Xβ而最小二乘法就是说希望 Y 和这个模型距离越小越好,于是它们的差应该与这个张成的空间垂直:
X T ⋅ ( Y − X β ) = 0 ⟶ β = ( X T X ) − 1 X T Y X^{T} \cdot(Y-X \beta)=0 \longrightarrow \beta=\left(X^{T} X\right)^{-1} X^{T} Y XT⋅(Y−Xβ)=0⟶β=(XTX)−1XTY
class LinearRegression:
'''使用Python实现的线性回归.(最小二乘法)'''
def fit(self,X,y):
'''根据提提供的训练数据X,对模型进行训练。
Parameters
------
X :类数组类型。形状:[样本数量,特征数量]
特征矩阵,用来对模型进行训练
y = 类数组类型,形状:[样本数量]
'''
# 如果X是数组对象的一部分,而不是完整的对象数据(eg:切片)则无法完成矩阵的转换
X = np.asmatrix(X.copy()) #这里创建X的拷贝对象,避免转换成矩阵时候失败
# y 为一维结构(行向量或列向量)没有限制,可以不用拷贝
# 注意:现在要进行矩阵的运算,需要是二维结构,通过reshape方法进行转换
y = np.asmatrix(y).reshape(-1,1) # (-1,1)意思:把数组转换为一列,依据数据自定义行的矩阵
# 通过最小二乘公式,求解出最佳的权重值
self.w_ = (X.T * X ).I * X.T * y
def predict(self,X):
'''根据参数传递的样本X,delattr样本数据进行预测。
Parameters
------
X:类数组类型。形状[样本数量,特征数量]
待预测的样本特征(属性)
Returns
------
result:数组类型
预测的结果
'''
# 将X转换为矩阵 注意:需要对X进行拷贝
X = np.asmatrix(X.copy())
result = X * self.w_
# 将矩阵转换为ndarray数组 ,进行扁平化处理 ,然后返回结果
return np.array(result).ravel()