机器学习算法——线性回归(超级详细总结)

目录

  • 1.线性回归模型
    • 1.1公式
    • 1.2向量化公式
    • 1.3 MSE损失函数
  • 2.优化算法
    • 2.1 标准方程
    • 2.2 批量梯度下降梯度下降

1.线性回归模型

1.1公式

在这里插入图片描述
y^ 是预测值
n 是特征数量
xi 是第i个特征
θi 是每个特征的模型参数

1.2向量化公式

在这里插入图片描述
θ.T是θ的转置向量。
θ.T · x 是θ.T和x的点乘
hθ(X) 是θ的假设函数

1.3 MSE损失函数

在这里插入图片描述
线性回归的损失函数通常使用MSE(均方误差), 其原理对于欧几里得距离,当数据含有异常值的的时候,可以使用MAE(均值误差),对应曼哈顿距离,由于采用绝对值得形式,减少了异常值对数据的影响。

2.优化算法

2.1 标准方程

在这里插入图片描述
可以利用标准方程求出 θ^的优化最小值,是模型求解最优参数的一种形式。

手写实现

import numpy as np

X = np.random.rand(100,1) # 随机生成 

y = 1+2*X + np.random.randn(100,1) # 目标函数

X_b = np.c_[np.ones((100,1)),X]  # 加入噪音 b
 
theta = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(y) # 标准方程

Sklearn

from sklearn.linear_model import LinearRegression

X = np.random.rand(100,1)

y = 1+2*X + np.random.randn(100,1)

linReg = LinearRegression()

linReg.fit(X, y)

linReg.intercept_, linReg.coef_ # 得到参数与标准方程一致

标准方程求逆矩阵的复杂度为O(n ^ 2.4) 到 O(n ^ 3) 之间, 所以特征数量较大时,标准方程计算会很慢。对于实例数量来说,方程是线性的,只要内存足够还是可以计算的。当计算量无限大的时候,梯度下降就成了一种更好的选择。

2.2 批量梯度下降梯度下降

梯度下降的是通用的优化算法,其目的是通过迭代找到使损失函数最小的参数。

求偏导部分:

在这里插入图片描述

梯度下降详细总结见这篇文章

线性模型的MSE损失函数恰好是个凸函数,这意味全局只有一个最小值。它同时也是一个连续函数,所以斜率不会产生陡峭的变化。

eta = 0.1 # 学习率
iteras = 1000 # 迭代周期
m = 100 #实例数量(数据的行数)
X = np.random.rand(100,1) # 随机生成 

y = 1+2*X + np.random.randn(100,1) # 目标函数
X_b = np.c_[np.ones((100,1)),X]  # 加入噪音 b

np.random.seed(42)

theta = np.random.randn(2,1)

for itera in range(iteras):
    gradients = 2/m * X_b.T @ (X_b @ theta - y) # @ 是点乘的另外一种形式
    theta = theta - eta * gradients
    

只要时间允许,批量梯度下降可以帮助线性模型找到全局最小值,批量梯度下降的缺点是每次迭代过程都采用了所有的训练样本,训练开销相对于其他类型梯度下降算法慢。

应用梯度下降时,需要保证所有特征值的大小比例都差不多(比如使用Scikit-Learn的StandardScaler类),否则收敛的时间会长很多。

你可能感兴趣的:(Machine,Learning,机器学习,算法,线性回归,随机梯度下降)