百日筑基篇——线性回归算法(python机器学习算法)
前言
Python是一种广泛应用于机器学习的编程语言,有很多强大的机器学习算法可以使用。今天就先介绍一下基础的线性回归算法。
一、线性回归介绍
线性回归是一种用于建立变量之间线性关系的统计模型。
它通过拟合一个线性方程来预测一个因变量(也称为响应变量)与一个或多个自变量(也称为特征)之间的关系。线性回归可以用于预测连续型变量的值。
二、线性回归算法原理
1. 数学公式
y = w0 + w1x1 + w2x2 + … + wn*xn
#y是因变量, x1, x2, …, xn是自变量, w0, w1, w2, …, wn是模型的参数,表示自变量对因变量的影响。(w0是偏置项,w1, w2, …, wn则为权重项)
设x0 = 1 ; 则有 y = w0x0 + w1x1 + w2x2 + … + wnxn
如此可将数据转换为矩阵形式:(数据为虚构)
x0 | x1 | x2 | xn |
---|---|---|---|
1 | 56 | 86 | 56 |
1 | 78 | 56 | 67 |
1 | 67 | 54 | 98 |
… | … | … | … |
整合可得:
既向量和矩阵相乘
2. 线性回归目标
线性回归的目标是找到一组参数w0, w1, w2, …, wn,使得模型预测值与实际观测值之间的差异最小化。这个差异通常使用最小二乘法来计算,即最小化预测值与观测值之间的平方差。
为了找到最优的参数值,可以使用梯度下降等优化算法来最小化损失函数(即预测值与观测值之间的差异)。梯度下降算法通过迭代更新参数值,使得损失函数逐渐减小,直到达到最小值。
3. 误差
真实值和预测值之间的差异,用 ε 表示
对于每一个样本有:
误差ε (真实值 - 预测值) 是独立并且服从相同的分布。并且服从均值u=0,方差为 σ² 的高斯分布(正态分布)。故有:
代入得
4. 最小二乘法
让误差的平方和最小估计出来的模型最接近真实情形。
首先,我们的目的是通过一组观测得到的样本去估计出模型的参数
ε ∈ N(0,σ²)
从概率统计的角度,将观测样本看作随机变量
极大似然估计: 最大化当前这个样本集发生的概率,专业点说就是最大化似然函数,而似然函数就是样本的联合概率。由于我们通常都会假设样本是相互独立的,因此联合概率就等于每个样本发生的概率乘积
一般来说,我们会对似然函数取 log,以将连乘变成累加,主要有两个目的:防止溢出和方便求导
故可以说,最小二乘法其实就是误差满足正态分布的极大似然估计
J(w) 函数为损失函数,去衡量模型预测值与真实值之间的距离
5. 梯度下降方法
梯度下降算法通过迭代更新参数值,使得损失函数逐渐减小,直到达到最小值。
下面图片中的 θ 应该为 W ( 不小心写错了) 。
三. 简单代码介绍
- 初始化参数w0, w1, w2, …, wn为0或随机值。
- 计算模型的预测值y_pred = w0 + w1x1 + w2x2 + … + wn*xn。
- 计算损失函数(预测值与观测值之间的差异)。
- 计算损失函数对每个参数的偏导数,即梯度。
- 更新参数值:wi = wi - learning_rate * gradient_i,其中learning_rate是学习率,用于控制参数更新的步长。
- 重复步骤2-5,直到达到停止条件(如达到最大迭代次数或损失函数的变化小于某个阈值)。
1. 自定义代码
import numpy as np
# 生成训练数据
# 建了一个二维的NumPy数组(即一个矩阵),其中包含10行2列的数据
X = np.array([[1, 3], [2, 5], [3, 7], [4, 9], [5, 11], [6, 13], [7, 15], [8, 17], [9, 19], [10, 21]])
# 生成标记量
y = np.array([5, 8, 11, 14, 17, 20, 23, 26, 29, 32])
# 添加偏置项
X = np.insert(X, 0, 1, axis=1) # axis=1表示在列上插入,0表示在矩阵X的第0列,1表示插入值为1
# 初始权重
w = np.zeros(X.shape[1], )
# 使用np.zeros()可以创建一个元素全部为0的NumPy数组,其大小为(X.shape[1], ),即包含 X.shape[1] 个元素,这是我们权重向量的大小。
# 这个权重向量将在后面的梯度下降算法中不断更新,以寻找能够最小化预测误差的最优参数值。
# 定义学习率和迭代次数
alpha = 0.00000001
epochs = 10000000
# 梯度下降求解权重
for i in range(epochs):
y_pred = np.dot(X, w) # 计算预测值
error = y_pred - y
gradient = np.dot(X.T, error) / len(y) # 计算梯度gradient,即误差对于权重的导数;
w -= alpha * gradient # 使用学习率alpha和梯度gradient来更新权重向量w。
# 预测新数据
X_new = np.array([[1, 12], [1, 14], [1, 16]])
X_new = np.insert(X_new, 0, 1, axis=1) # 添加偏置项
y_pred_new = np.dot(X_new, w) # 它可以用于计算两个一维或多维数组之间的点积,或者将矩阵与向量相乘。
# 这里我们用训练好的模型来预测
#输出预测值,以及相关模型参数
print(y_pred_new)
print("Linear Regression Model:")
print("Intercept:", w[0])
print("Coefficients:", w[1:])
整理为一个函数:
import numpy as np
def xianxing_huigui(X, y, alpha, epochs, X_new):
X = np.insert(X, 0, 1, axis=1)
w = np.zeros(X.shape[1], )
for i in range(epochs):
y_pred = np.dot(X, w) # 计算预测值
error = y_pred - y
gradient = np.dot(X.T, error) / len(y) # 计算梯度gradient,即误差对于权重的导数;
w -= alpha * gradient
X_new = np.insert(X_new, 0, 1, axis=1) # 添加偏置项
y_pred_new = np.dot(X_new, w) # 它可以用于计算两个一维或多维数组之间的点积,或者将矩阵与向量相乘。
# 这里我们用训练好的模型来预测
print(y_pred_new)
print("Linear Regression Model:")
print("Intercept:", w[0])
print("Coefficients:", w[1:])
2. python自带模块
# 引用库中函数
from sklearn.linear_model import LinearRegression
# 创建线性回归模型
model = LinearRegression()
# 训练模型
model.fit(X, y)
# 预测
y_pred = model.predict(X_new)
print(y_pred)
总结
线性回归算法的深度学习,要理解最小二乘法,损失函数,梯度下降方法以及矩阵运算等原理,当然也可以直接应用python中的模块。
大鹏一日同风起,扶摇直上九万里。
-2023-7-8 筑基篇