【机器学习】机器学习算法-线性回归算法
文章目录
- 线性回归概述
- 线性回归的类型:
- 线性回归的假设:
- 线性回归的实现步骤:
- 线性回归的应用:
- 公式推导
- 1. 最小二乘法
- 目标
- 推导
- 2. 梯度下降法
- 目标
- 推导
- 计算过程
- Python实现
- 安装`scikit-learn`
- 线性回归代码示例
- 代码解释
线性回归概述
线性回归(Linear Regression)是统计学中的一种基本算法,用于模拟一个或多个自变量(解释变量)与因变量(响应变量)之间的线性关系。线性回归的目标是找到最佳拟合直线(或平面),这条直线可以最小化观测值和预测值之间的差异。
线性回归的类型:
-
简单线性回归:
- 只有一个自变量和一个因变量,模型形式为 y = β 0 + β 1 x + ϵ y = \beta_0 + \beta_1x + \epsilon y=β0+β1x+ϵ,其中 e t a 0 eta_0 eta0是截距, β 1 \beta_1 β1 是斜率, ϵ \epsilon ϵ是误差项。
-
多元线性回归:
- 有多个自变量和一个因变量,模型形式为 y = β 0 + β 1 x 1 + β 2 x 2 + . . . + β n x n + ϵ y = \beta_0 + \beta_1x_1 + \beta_2x_2 + ... + \beta_nx_n + \epsilon y=β0+β1x1+β2x2+...+βnxn+ϵ。
线性回归的假设:
-
线性关系:
- 自变量和因变量之间存在线性关系。
-
独立性:
- 自变量之间相互独立,没有多重共线性。
-
同方差性:
- 误差项具有恒定的方差。
-
正态分布:
- 误差项呈正态分布。
-
无完全多重共线性:
- 自变量之间不存在完全的线性关系。
线性回归的实现步骤:
-
数据收集:
- 收集相关数据,包括自变量和因变量。
-
数据探索:
- 使用统计图表和描述性统计量来探索数据特征。
-
模型建立:
- 根据数据建立线性回归模型。
-
参数估计:
- 使用最小二乘法等方法估计模型参数。
-
模型检验:
- 检验模型的有效性,包括参数的显著性检验和模型的整体拟合度检验。
-
模型优化:
- 如果需要,对模型进行优化,如添加或删除自变量,或转换变量。
-
预测和解释:
- 使用模型进行预测,并解释结果。
线性回归的应用:
线性回归在各个领域都有广泛的应用,包括经济学、社会科学、生物学、工程学等。它可以用于预测房价、销售额、温度变化、疾病风险等。
线性回归是机器学习和统计分析中的一个基础工具,为更复杂的模型和算法提供了理论基础。尽管在实际应用中可能会遇到非线性关系,但线性回归模型的简单性和直观性使其成为一个强大的分析工具。
公式推导
线性回归算法的推导原理主要基于最小二乘法和梯度下降法。下面是详细的推导过程和计算步骤:
1. 最小二乘法
目标
我们的目标是找到一组参数 θ \theta θ ,使得预测值 y ^ \hat{y} y^ 与实际值 y y y 之间的误差平方和最小。即最小化损失函数 J ( θ ) J(\theta) J(θ):
J ( θ ) = 1 2 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 J(\theta) = \frac{1}{2m} \sum_{i=1}^{m} (h_{\theta}(x^{(i)}) - y^{(i)})^2 J(θ)=2m1∑i=1m(hθ(x(i))−y(i))2
其中:
- h θ ( x ) = θ T x = θ 0 + θ 1 x 1 + … + θ n x n h_{\theta}(x) = \theta^T x = \theta_0 + \theta_1 x_1 + \ldots + \theta_n x_n hθ(x)=θTx=θ0+θ1x1+…+θnxn 是线性回归模型的预测函数。
- ( m ) 是样本数量。
推导
将损失函数 J ( θ ) J(\theta) J(θ) 展开:
J ( θ ) = 1 2 m ∑ i = 1 m ( θ T x ( i ) − y ( i ) ) 2 J(\theta) = \frac{1}{2m} \sum_{i=1}^{m} (\theta^T x^{(i)} - y^{(i)})^2 J(θ)=2m1∑i=1m(θTx(i)−y(i))2
为了找到使 J ( θ ) J(\theta) J(θ) 最小的 θ \theta θ,我们需要对 J ( θ ) J(\theta) J(θ) 分别对每个 θ j \theta_j θj 求偏导数,并令其等于零:
∂ J ( θ ) ∂ θ j = 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x j ( i ) \frac{\partial J(\theta)}{\partial \theta_j} = \frac{1}{m} \sum_{i=1}^{m} (h_{\theta}(x^{(i)}) - y^{(i)}) x_j^{(i)} ∂θj∂J(θ)=m1∑i=1m(hθ(x(i))−y(i))xj(i)
设 X X X是设计矩阵,其中每一行是一个样本的特征向量,每一列是一个特征,加上一列全为1的偏置项。设 y y y是目标值向量。则上述方程可以写成矩阵形式:
∇ J ( θ ) = 1 m ( X T X θ − X T y ) \nabla J(\theta) = \frac{1}{m} (X^T X \theta - X^T y) ∇J(θ)=m1(XTXθ−XTy)
令梯度为零,解得:
X T X θ = X T y X^T X \theta = X^T y XTXθ=XTy
θ = ( X T X ) − 1 X T y \theta = (X^T X)^{-1} X^T y θ=(XTX)−1XTy
这就是线性回归模型的正规方程解。
2. 梯度下降法
目标
梯度下降法是一种迭代优化算法,用于逐步逼近最小化损失函数的参数值。
推导
损失函数 J ( θ ) J(\theta) J(θ)对每个 θ j \theta_j θj 的偏导数为:
∂ J ( θ ) ∂ θ j = 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x j ( i ) \frac{\partial J(\theta)}{\partial \theta_j} = \frac{1}{m} \sum_{i=1}^{m} (h_{\theta}(x^{(i)}) - y^{(i)}) x_j^{(i)} ∂θj∂J(θ)=m1∑i=1m(hθ(x(i))−y(i))xj(i)
写成矩阵形式:
∇ J ( θ ) = 1 m X T ( X θ − y ) \nabla J(\theta) = \frac{1}{m} X^T (X \theta - y) ∇J(θ)=m1XT(Xθ−y)
梯度下降法的更新规则为:
θ : = θ − α ∇ J ( θ ) \theta := \theta - \alpha \nabla J(\theta) θ:=θ−α∇J(θ)
即:
θ j : = θ j − α 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x j ( i ) \theta_j := \theta_j - \alpha \frac{1}{m} \sum_{i=1}^{m} (h_{\theta}(x^{(i)}) - y^{(i)}) x_j^{(i)} θj:=θj−αm1∑i=1m(hθ(x(i))−y(i))xj(i)
其中 α \alpha α 是学习率。
计算过程
- 初始化参数:随机选择一组初始参数 θ \theta θ。
- 迭代更新:
- 计算预测值 y ^ = X θ \hat{y} = X \theta y^=Xθ。
- 计算误差 e = y ^ − y e = \hat{y} - y e=y^−y。
- 更新参数 θ \theta θ:
θ : = θ − α 1 m X T e \theta := \theta - \alpha \frac{1}{m} X^T e θ:=θ−αm1XTe
- 重复步骤2,直到满足停止条件(如达到最大迭代次数,或损失函数变化很小)。
通过上述推导和计算过程,我们可以得到线性回归模型的最优参数 ( \theta ),从而对新的输入数据进行预测。
Python实现
在Python中,实现线性回归通常使用scikit-learn
库,这是一个功能强大的机器学习库。以下是使用scikit-learn
进行线性回归的示例代码,以及详细的注释说明:
安装scikit-learn
首先,确保你已经安装了scikit-learn
库。如果还没有安装,可以通过以下命令安装:
pip install scikit-learn
线性回归代码示例
# 导入必要的库
import numpy as np
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt# 创建一些示例数据
# 特征矩阵 X,包含一个常数项(截距)和自变量
X = np.array([[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]]) # 5个样本,每个样本2个特征
# 目标向量 y,包含每个样本对应的目标值
y = np.array([1, 2, 1, 3, 5])# 创建线性回归模型实例
model = LinearRegression()# 训练模型
# fit方法用于根据提供的数据拟合模型
model.fit(X, y)# 获取模型参数
# coef_ 是特征的系数,intercept_ 是截距
print("Coefficients:", model.coef_)
print("Intercept:", model.intercept_)# 使用模型进行预测
# predict方法用于根据模型和输入特征进行预测
predictions = model.predict(X)# 绘制数据点和拟合线
plt.scatter(X[:, 1], y, color='blue') # 绘制实际的数据点
plt.plot(X[:, 1], predictions, color='red') # 绘制拟合线
plt.title('Linear Regression')
plt.xlabel('Feature')
plt.ylabel('Target')
plt.show()
代码解释
-
导入库:导入
numpy
用于数据处理,LinearRegression
用于创建线性回归模型,matplotlib.pyplot
用于绘图。 -
创建数据:创建一个特征矩阵
X
和一个目标向量y
。在这个例子中,我们使用了一个简单的二维特征空间。 -
创建模型实例:实例化
LinearRegression
类来创建一个线性回归模型。 -
训练模型:使用
fit
方法训练模型。这个方法会根据提供的数据计算模型参数。 -
获取模型参数:通过
coef_
和intercept_
属性获取模型的系数和截距。 -
进行预测:使用
predict
方法进行预测。这个方法会根据输入特征和模型参数计算预测值。 -
绘图:使用
matplotlib
绘制实际的数据点和拟合线,以直观地展示模型的预测效果。
这个简单的示例展示了如何使用scikit-learn
进行线性回归分析。在实际应用中,你可能需要处理更复杂的数据集,并进行更详细的模型评估和调优。