*Python*机器学习算法——线性回归(Linear Regression)
弥十一 2024-10-16 09:35:01 阅读 51
目录
⭐️引言
⭐️理论
1、 简单线性回归
2、 多元线性回归
3、最佳拟合
⭐️结语
⭐️引言
线性回归(Linear Regression)是一种基本的预测分析方法,它通过拟合数据点来建立因变量(目标变量)与一个或多个自变量之间的关系模型。线性回归假设这种关系是线性的,并试图找到一条直线(简单线性回归)或超平面(多元线性回归),使得这条直线或超平面与实际数据点之间的误差最小化。
⭐️理论
为了实现线性回归(Linear Regression)主要使用Scikit-learn提供了丰富的线性回归工具,其中包括基本的LinearRegression(使用普通最小二乘法)、Ridge回归(通过L2正则化解决多重共线性问题)、Lasso回归(通过L1正则化实现特征选择)、ElasticNet(结合L1和L2正则化)以及SGDRegressor(使用随机梯度下降法)等库解决线性回归的一系列问题
1、 简单线性回归
简单线性回归(Simple Linear Regression, SLR)是一种基本的统计方法,主要用来分析两
个变量间的关系,其中一个变量是因变量(或响应变量),另一个是自变量(或预测变量)。
简单线性回归模型假定因变量 ( y ) 与自变量 ( x ) 之间存在线性关系,模型可表示为:
其中:
(
) 是因变量。
(
) 是自变量。
(
) 是模型的截距(当 (
) 时 (
) 的预期值)。
(
) 是斜率,表示自变量 (
) 每增加一个单位时因变量 (
) 的平均变化量。
(
) 是误差项,代表模型未能捕捉的影响 (
) 的其他因素。
<code>import numpy as np
import matplotlib.pyplot as plt
# 设置随机种子以确保结果可重复
np.random.seed(42)
# 生成模拟数据
n_samples = 100
X = np.random.rand(n_samples, 1) * 10 # 自变量
y = 2 * X + 3 + np.random.randn(n_samples, 1) # 因变量,添加一些噪声
# 可视化原始数据
plt.scatter(X, y, color='blue', label='Data Points')code>
plt.xlabel('X')
plt.ylabel('Y')
plt.legend()
plt.show()
通过求解最小二乘法,可以获得参数 (
) 和 (
) 的估计值。具体的参数估计公式如下:
截距 (
) 的估计值为:
斜率 (
) 的估计值为:
其中 (
) 和 (
) 分别是 ( x ) 和 ( y ) 的平均值。
<code>def simple_linear_regression(X, y):
# 计算均值
mean_x = np.mean(X)
mean_y = np.mean(y)
# 计算斜率
numerator = np.sum((X - mean_x) * (y - mean_y))
denominator = np.sum((X - mean_x) ** 2)
beta_1 = numerator / denominator
# 计算截距
beta_0 = mean_y - beta_1 * mean_x
return beta_0, beta_1
# 训练模型
beta_0, beta_1 = simple_linear_regression(X, y)
print(f"截距 (beta_0): {beta_0}")
print(f"斜率 (beta_1): {beta_1}")
# 预测
y_pred = beta_0 + beta_1 * X
# 可视化结果
plt.scatter(X, y, color='blue', label='Data Points')code>
plt.plot(X, y_pred, color='red', label='Regression Line')code>
plt.xlabel('X')
plt.ylabel('Y')
plt.legend()
plt.show()
评估简单线性回归模型的好坏可以通过以下指标:
决定系数 (
):衡量模型解释了因变量变异性的比例。(
) 的值介于 0 到 1 之间,值越
接近 1 表示模型拟合效果越好。
标准误差:衡量预测值与实际值之间的平均差异。
t 检验:用于检验回归系数是否显著不同于零。
F 检验:用于检验整个回归模型是否具有统计显著性。
2、 多元线性回归
多元线性回归(Multiple Linear Regression, MLR)是一种扩展的线性回归模型,它考虑了一
个因变量与多个自变量之间的线性关系。
多元线性回归模型可以表示为:
其中:
(
) 是因变量。
(
,
,
,
) 是自变量。
(
) 是截距项。
(
) 是回归系数。
(
) 是误差项。
<code>import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 设置随机种子以确保结果可重复
np.random.seed(42)
# 生成模拟数据
n_samples = 100
X = np.random.rand(n_samples, 2) * 10 # 两个自变量
y = 2 * X[:, 0] + 3 * X[:, 1] + 5 + np.random.randn(n_samples) # 因变量,添加一些噪声
# 将数据转换为 DataFrame 方便操作
data = pd.DataFrame({'x1': X[:, 0], 'x2': X[:, 1], 'y': y})
# 可视化原始数据
fig, ax = plt.subplots(figsize=(8, 6))
ax.scatter(X[:, 0], y, color='blue', label='Data Points')code>
ax.set_xlabel('X1')
ax.set_ylabel('Y')
ax.legend()
plt.show()
通过求解最小二乘法,可以获得参数的估计值。
具体的参数估计公式如下:
其中:
(
) 是参数向量 (
) 的估计值。
(
) 是自变量矩阵,每一行为一个样本的自变量值。
(
) 是因变量向量。
<code>def multiple_linear_regression(X, y):
# 添加一列全为 1 的截距项
X = np.hstack((np.ones((n_samples, 1)), X))
# 计算参数估计值
b = np.linalg.inv(X.T @ X) @ X.T @ y
return b
# 训练模型
b = multiple_linear_regression(X, y)
print(f"截距 (beta_0): {b[0]}")
print(f"斜率 (beta_1): {b[1]}")
print(f"斜率 (beta_2): {b[2]}")
# 预测
y_pred = b[0] + b[1] * X[:, 0] + b[2] * X[:, 1]
# 可视化结果
fig, ax = plt.subplots(figsize=(8, 6))
ax.scatter(X[:, 0], y, color='blue', label='Data Points')code>
ax.plot(X[:, 0], y_pred, color='red', label='Regression Line')code>
ax.set_xlabel('X1')
ax.set_ylabel('Y')
ax.legend()
plt.show()
模型评估
评估多元线性回归模型的好坏可以通过以下指标:
决定系数 (
):衡量模型解释了因变量变异性的比例。(
) 的值介于 0 到 1 之间,值越接近 1 表示模型拟合效果越好。
调整后的 (
):考虑了模型复杂度对 ( R^2 ) 的影
t 检验:用于检验每个回归系数是否显著不同于零。
F 检验:用于检验整个回归模型是否具有统计显著性。
假设检验
多元线性回归模型通常需要满足以下假设:
线性关系:因变量与自变量之间存在线性关系。
独立性:误差项 (
) 之间相互独立。
正态性:误差项 (
) 服从正态分布。
同方差性:误差项 (
) 的方差在不同自变量取值下保持不变。
无多重共线性:自变量之间不存在高度相关性。
3、最佳拟合
最小化上述损失函数的过程就是寻找最佳拟合直线或超平面的过程。可以通过解析解(如正
规方程 Normal Equation)或数值优化方法(如梯度下降 Gradient Descent)来求解。
正规方程
正规方程可以直接求解 (
):
]
其中:
( X ) 是样本特征矩阵。
( y ) 是样本标签向量。
数值优化方法
目标函数为:
目标函数的梯度为:
梯度下降的更新规则为:其中,(
) 是学习率。
<code>def gradient_descent(X, y, learning_rate=0.01, max_iters=1000, tol=1e-6):
# 初始化参数
n_features = X.shape[1]
w = np.zeros(n_features + 1) # 包括截距项
X = np.hstack((np.ones((n_samples, 1)), X)) # 添加截距项
# 计算目标函数
def cost_function(w, X, y):
predictions = X @ w
errors = predictions - y
return (1 / (2 * n_samples)) * np.sum(errors ** 2)
# 计算梯度
def gradient(w, X, y):
predictions = X @ w
errors = predictions - y
return (1 / n_samples) * (X.T @ errors)
# 梯度下降迭代
prev_cost = float('inf')
for _ in range(max_iters):
grad = gradient(w, X, y)
w -= learning_rate * grad
current_cost = cost_function(w, X, y)
if abs(prev_cost - current_cost) < tol:
break
prev_cost = current_cost
return w
# 训练模型
w = gradient_descent(X, y)
print(f"截距 (beta_0): {w[0]}")
print(f"斜率 (beta_1): {w[1]}")
print(f"斜率 (beta_2): {w[2]}")
⭐️结语
线性回归是一种简单而强大的统计学习方法,广泛应用于数据分析和机器学习领域,通过建立因变量与一个或多个自变量之间的线性关系,帮助我们理解和预测数据中的趋势。无论是简单线性回归还是多元线性回归,都可以通过最小二乘法或梯度下降法求解参数,从而最小化残差平方和(RSS)。模型训练过程中,我们可以使用闭式解 (
) 或者通过迭代优化求解参数。模型评估时,通过决定系数 (
)、调整后的 (
)、标准误差、t 检验和 F 检验等多种指标来衡量模型的性能。总之,线性回归不仅理论基础扎实,而且在实际应用中表现出色,是解决回归问题的重要工具。
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。