机器学习笔记-3.1.线性回归

本系列是笔者在贪心科技-机器学习教程的学习笔记, 补充有python相关的知识.初学机器学习, 还请多多指教.

课程来到线性回归和逻辑回归, 虽然工程实现上跟之前的模型一样, 找一个对象, 代入参数, 计算出结果即可. 但是这一部分底层开始会涉及到数学的概念, 多数都是大学时候学过现在忘掉的. 重现捡起来很困难, 但是不能因此就放弃探究.
一点不成熟的小建议就是可以将推导的流程过一次, 细节会有一些地方难以理解, 加以标注, 等以后补充了相关知识再回来温故知新.

数学知识

一元回归

最简单的回归方程为: y = ax + b. 假设我们有这样的n个二维平面上的点(xi, yi), 如下左图, 我们可以看到纵轴(y)随着横轴(x)递增有着等比例(a)线性递增的趋势. 所以我们在这些点中间画一条直线如下图右, 当这些点到直线的距离最短的时候, 我们认为这条线最优地拟合了已知的数据(xi, yi), 根据趋势的一致性, 我们有理由用这条直线代入x去预测未知的y.

一元回归的实际场景, 举例说一个人的体重x跟一个人的身高y呈线性关系(实际上并不是), 我们通过统计一批人的体重和身高关系, 得到一个身高体重的映射方程y=ax+b. 那我们就可以通过这个方程, 根据一个陌生人的身高去估计这个人的体重.

多元回归

将一元的回归方程推广到多元, 方程变成:

跟一元情况下通过最优拟合得到a和b类似, 在多元的情况下需要通过拟合求得θi. 使它代入所有的已知点得到的距离hθ(x)最小, 我们把这个值称作回归方程的解析解. 一元回归的情况下解析解为直线, 二维则为平面, 多维可以称之为多维平面(超平面hyperplane).

解析解的直觉解法

直觉解法是我自己起的名字, 原因是它足够直观, 容易理解. 数学上称之为最小二乘法.

基于上面的多元回归方程, 我们假设xi实际上对应的值是yi, 那么在这个点上我们拟合得到的多维平面的误差(即距离), 为(θi·xi-yi)^2. 要使得其对所有的点整体距离最小, 即使得下面的方程最小:

数学上称之为损失函数, 前面带上的1/2不会影响θ的极值求解. 它的存在是从极大似然估计推导过来的, 这里保留, 后面会解释.

这个方程中, xi, yi为已知的一系列已知的测量值, m为值的个数, 数学上以更方便的矩阵方式表达:

由于直觉解法和概率解法最终都是对最小损失函数的求解, 我们稍后一并介绍.

解析解的概率解法(极大似然估计)

直觉解法虽然直观容易理解, 但是不够严谨. 数学上可以使用极大似然估计的方法来解释直觉解法.

同样还是回到多元回归方程:

其中是我们通过θ计算出来的估计值, 它跟真实值y的差异即误差假设为ε, 则有:

当有m个样本时, 上式写成:

由于误差ε服从μ=0的高斯分布[1], 我们有:

高斯分布的一般形式
ε的概率密度函数

即:

可写出高斯分布的似然函数[2], 取对数, 求其最大值:

似然函数
似然函数取对数

可以看到要使得似然函数取极大值, 要令最后一项最小:

似然函数分解后的非常数项

没错, 这也就是我们上面通过直觉解法推导出的损失函数. 最终两种解法殊途同归, 都变成求解损失函数的最小值.

[1] 至于为什么ε误差符合高斯分布, 有说法是根据中心极限定理, 误差项是许多互相独立的因素综合影响得到, 所以可以假设其为高斯分布. 但这我感觉这是用结论来解释结论, 暂且不追究. 以后找到更有说服力的解释再来补充.
[2] 似然函数是什么? 为啥高斯分布的似然函数是如此形式? 还得再研究

损失函数求解

通过上面的推导我们知道, 要求线性回归的解析解, 关键在于求损失函数的最小值. 我们假设损失函数对于θ可导:

上面求导用到的导数公式:

至此我们推导出了线性回归方程的解析解:

线性回归方程的解析解

注意到这里存在对矩阵求逆的运算, 只有当其可逆时方可利用此公式. 不可逆的情况需要做特殊处理, 比如:

  • 使用伪逆矩阵代替其逆矩阵, numpy.linalg.pinv()
  • 去掉相关特征(因为相关才不可逆, 所以去掉相关, 就变得可逆)
  • 去掉某些特征使得d <=n (不知道为何)
  • 使用梯度下降法替代解析解

工程应用

线性回归, 在工程应用中一般作为复杂算法的base line. 虽然不一定能实际应用, 但是有以下特点:

  • 可解析性强
  • 可靠
  • 简单

核心代码很简单:

import numpy as np  # 数学计算
import pandas as pd  # 数据处理, 读取 CSV 文件 (e.g. pd.read_csv)
from sklearn import preprocessing
from sklearn.linear_model import LinearRegression

lr = LinearRegression()
# 注意, 这里的X_train, y_train, X_test, y_test均是数学概念上的矩阵, 
# 不能像前一篇kNN计算那样使用train_test_split随机取值
lr.fit(X_train, y_train) # 拟合函数
lr.score(X_test, y_test) # 计算确定系数

# 做预测
X_Predict = X[-num:]
Forecast = lr.predict(X_Predict)

课程中介绍了一种使用线性回归预测估价的粗糙方法.

发表评论

电子邮件地址不会被公开。

4 + 3 =