机器学习-线性回归【手撕】

线性回归

1.概述

回归是一种应用广泛的预测建模技术,这种技术的核心在于预测的结果是连续型变量。决策树,随机森林,支持向量机的分类器等分类算法的预测标签是分类变量,多以{0,1}来表示,而无监督学习算法比如PCA,KMeans的目标根本不是求解出标签,注意加以区别。回归算法源于统计学理论,它可能是机器学习算法中产生最早的算法之一,其在现实中的应用非常广泛,包括使用其他经济指标预测股票市场指数,根据喷射流的特征预测区域内的降水量,根据公司的广告花费预测总销售额,或者根据有机物质中残留的碳-14的量来估计化石的年龄等等,只要一切基于特征预测连续型变量的需求,都使用回归技术。

既然线性回归是源于统计分析,我们就可以用不同的角度去理解它。从统计学的角度来看,我们对线性回归有许多要求,比如残差要满足正态分布,要排除共线性等等,然而从机器学习的角度来说,无论服从什么分布,无论是否存在共线性,只要模型效果好就行。

2.多元线性回归的基本原理

线性回归是机器学习中最简单的回归算法,多元线性回归指的是有一个样本包含有多个特征的线性回归问题。对于一个有 n n n个特征的样本而言,它的回归结果可以写作一个方程:
y ^ i = ω 0 + ω 1 x i 1 + ω 2 x i 2 + ω 3 x i 3 + . . . + ω n x i n \hat{y}_i = \omega_0 +\omega_1 x_{i1} +\omega_2 x_{i2} +\omega_3 x_{i3} + ...+\omega_n x_{in} y^i=ω0+ω1xi1+ω2xi2+ω3xi3+...+ωnxin
其中 ω \omega ω被统称为模型的参数,其中 ω 0 \omega_0 ω0被称为截距, ω 1 . . . ω n \omega_1... \omega_n ω1...ωn被称为回归系数,有时也用 θ \theta θ来表示。
其中 y y y是我们的目标变量,也就是标签。 x i 1 . . . x i n x_{i1} ... x_{in} xi1...xin是样本 i i i上的不同特征。如果考虑我们有 m m m个样本,则 m m m个样本的回归结果可以被写
作:
y ^ i = ω 0 + ω 1 x 1 + ω 2 x 2 + ω 3 x 3 + . . . + ω n x n \hat{y}_i = \omega_0 +\omega_1 x_{1} +\omega_2 x_{2} +\omega_3 x_{3} + ...+\omega_n x_{n} y^i=ω0+ω1x1+ω2x2+ω3x3+...+ωnxn

其中 y y y是包含了 m m m个全部的样本的回归结果的列向量。注意,我们通常使用粗体的小写字母来表示列向量,粗体的大写字母表示矩阵。我们可以使用矩阵来表示这个方程,其中 ω \omega ω可以被看做是一个结构为 ( 1 , n ) (1,n) (1,n)的列矩阵, X X X是一个结构为 ( m , n ) (m,n) (m,n)的特征矩阵,则有:
( y ^ 0 ⋮ y ^ n ) = ( 1 1 1 ⋮ 1 x 11 x 12 x 13 ⋮ x 1 n x 21 x 22 x 23 ⋮ x 2 n ⋮ x m 1 x m 2 x m 3 ⋮ x m n ) ∗ ( ω 0 ⋮ ω n ) \begin{pmatrix} \hat{y}_{0}\\ \vdots\\ \hat{y}_{n} \end{pmatrix} = \begin{pmatrix} 1 & 1 & 1 & \vdots & 1 \\ x_{11} & x_{12} & x_{13} & \vdots & x_{1n} \\ x_{21} & x_{22} & x_{23} & \vdots & x_{2n} \\ \vdots\\ x_{m1} & x_{m2} & x_{m3} & \vdots & x_{mn} \end{pmatrix} * \begin{pmatrix} \omega_{0}\\ \vdots\\ \omega_{n} \end{pmatrix} y^0y^n = 1x11x21xm11x12x22xm21x13x23xm31x1nx2nxmn ω0ωn
y ^ = X ω \hat{y} = X\omega y^=Xω

线性回归的任务,就是构造一个预测函数来映射输入的特征矩阵 X X X和标签值 y y y的线性关系,这个预测函数在不同的文章上写法不同,可能写作 f ( x ) f(x) f(x)或者 h ( x ) h(x) h(x)等等形式,但无论如何,这个预测函数的本质就是我们需要构建的模型,而构造预测函数的核心就是找出模型的参数向量 ω \omega ω

在多元线性回归中,我们的损失函数如下定义:
L o s s = ∑ i = 1 m ( y i − y ^ i ) 2 Loss = \sum^m_{i=1}(y_i - \hat{y}_i)^2 Loss=i=1m(yiy^i)2
其中 y i y_i yi是样本 i i i对应的真实标签, y ^ i \hat{y}_i y^i,也就是 X i ω X_i\omega Xiω是样本 i i i在一组参数 ω \omega ω下的预测标签。

首先,这个损失函数代表了向量 y − y ^ y - \hat{y} yy^的L2范式的平方结果,L2范式的本质是就是欧式距离,即是两个向量上的每个点对应相减后的平方和再开平方,我们现在只实现了向量上每个点对应相减后的平方和,并没有开方,所以我们的损失函数是L2范式,即欧式距离的平方结果。
在这个平方结果下,我们的 y y y y ^ \hat{y} y^分别是我们的真实标签和预测值,也就是说,这个损失函数是在计算我们的真实标签和预测值之间的距离。因此,我们认为这个损失函数衡量了我们构造的模型的预测结果和真实标签的差异,因此我们固然希望我们的预测结果和真实值差异越小越好。所以我们的求解目标就可以转化成:
m i n ω ∣ ∣ y − X ω ∣ ∣ 2 2 \underset{\omega}{min}||y - X\omega||^2_2 ωmin∣∣yXω22

其中右下角的2表示向量 y − X ω y - X\omega yXω的L2范式,也就是我们的损失函数所代表的含义。在L2范式上开平方,就是我们的损失函数。这个式子,也正是sklearn当中,用在类Linear_model.LinerRegression 背后使用的损失函数。我们往往称呼这个式子为SSE(Sum of Sqaured Error,误差平方和)或者RSS(Residual Sum of Squares 残差平方和)。

3. 最小二乘法求解多元线性回归的参数

现在问题转换成了求解让RSS最小化的参数向量 ,这种通过最小化真实值和预测值之间的RSS来求解参数的方法叫做最小二乘法。最小二乘法的过程非常简单。求解极值的第一步往往是求解一阶导数并让一阶导数等于0,最小二乘法也不能免俗。因此,我们现在残差平方和RSS上对参数向量 ω \omega ω求导。
∂ R S S ∂ ω = ∂ ∣ ∣ y − X ω ∣ ∣ 2 2 ∂ ω = ∂ ( y − X ω ) T ( y − X ω ) ∂ ω ∵ ( A − B ) T = A T − B T a n d ( A B ) T = B T ∗ A T ∴ = ∂ ( y T − ω T X T ) ( y − X ω ) ∂ ω = ∂ ( y T y − ω T X T y − y T X ω + ω T X T X ω ) ∂ ω = ∂ y T y − ∂ ω T X T y − ∂ y T X ω + ∂ ω T X T X ω ∂ ω ∵ 矩阵求导中,当 a 为常数,有如下规则: ∂ a ∂ A = 0 ∂ A T B T C ∂ A = B T C ∂ C T B A ∂ A = B T C ∂ A T B A ∂ A = ( B + B T ) A 原式 = 0 − X T y − X T y + 2 X T X ω = X T X ω − X T y \frac{\partial RSS}{\partial \omega} = \frac{\partial ||y - X\omega||^2_2 }{\partial \omega} \\ = \frac{ \partial (y - X\omega)^{T}(y - X\omega)}{\partial \omega} \\ \because (A - B)^T = A^T - B^T and (AB)^T = B^T*A^T \\ \therefore = \frac{ \partial(y^{T} - \omega^{T} X^T )(y - X\omega)}{\partial \omega} \\ = \frac{ \partial(y^{T} y - \omega^{T} X^T y - y^T X\omega + \omega^T X^T X \omega)}{\partial \omega}\\ = \frac{ \partial y^{T} y - \partial \omega^{T} X^T y - \partial y^T X\omega + \partial \omega^T X^T X \omega}{\partial \omega} \\ \because 矩阵求导中,当a为常数,有如下规则:\\ \frac{\partial a}{\partial A} = 0\\ \frac{\partial A^TB^TC}{\partial A} = B^TC \\ \frac{\partial C^TBA}{\partial A} = B^TC \\ \frac{\partial A^TBA}{\partial A} = (B+B^T)A\\ 原式 = 0 - X^Ty - X^Ty + 2 X^TX\omega \\ = X^TX\omega - X^Ty ωRSS=ω∣∣yXω22=ω(yXω)T(yXω)(AB)T=ATBTand(AB)T=BTAT=ω(yTωTXT)(yXω)=ω(yTyωTXTyyTXω+ωTXTXω)=ωyTyωTXTyyTXω+ωTXTXω矩阵求导中,当a为常数,有如下规则:Aa=0AATBTC=BTCACTBA=BTCAATBA=(B+BT)A原式=0XTyXTy+2XTXω=XTXωXTy

我们让求导后的一阶导数为0,并且我们的特征矩阵 X X X肯定不会是一个所有元素都为0的矩阵,因此我们的 X T X X^TX XTX不会为0,因此我们可以得到:
X T X ω − X T y = 0 X T X ω = X T y ω = ( X T X ) − 1 X T y X^TX\omega - X^Ty = 0 \\ X^TX\omega = X^Ty \\ \omega = (X^TX)^{-1}X^Ty XTXωXTy=0XTXω=XTyω=(XTX)1XTy

而此时我们的 ω \omega ω就是我们参数的最优解。求解出这个参数向量,我们就解出了我们的 X ω X\omega Xω,也就能够计算出我们的预测值 y ^ \hat{y} y^了。

代码

import numpy as np 

class LinearRegression:
    def __init__(self) -> None:
        self.w = None
        self.coef_ = None 
        self.intercept_ = None
    
    def fit(self, x_train, y_train):
        
        one = np.ones(shape=(len(x_train),1))
        x_train = np.concatenate([one, x_train], axis=1)
        w = np.linalh.inv(x_train.T.dot(x_train).dot(x_train.T).dot(y_train))
        
        self.w = w 
        self.coef_ = w[1:]
        self.intercept_ = w[0]
    
    def predict(self, x_test):
        
        one = np.ones(shape=(len(x_test), 1))
        x_test = np.concatenate([one, x_test], axis=1)
        y_pred = x_test.dot((self.w).T)
        return y_pred
    
    
# 生成训练数据
x0 = [1, 2, 3, 4, 5, 6, 7, 8, 9,10]
x1 = [1, 3, 3, 8, 5, 6, 0, 8, 9,8]
X = np.array([[x0[i], x1[i]] for i in range(len(x0))])
y = np.zeros(len(x0))
for i in range(len(x0)):
    y[i] = 2 * x0[i] + 3 * x1[i] + 4
 
X_train = X[:8]
y_train = y[:8]
X_test = X[8:]
y_test = y[8:]
 
# 模型训练
model = LinearRegression()
model.fit(X_train, y_train)
print(f'model.coef_:{model.coef_}')
print(f'model.intercept_:{model.intercept_}')
# 模型预测
y_pred = model.predict(X_test)

参考

【机器学习】手撕多元线性回归-CSDN博客
菜菜的sklearn课堂

你可能感兴趣的:(机器学习,机器学习,线性回归,人工智能)