线性回归是机器学习中最基础也是最重要的算法之一,它用于建立自变量和因变量之间的线性关系模型。在实际生活中,线性回归有着广泛的应用,比如预测房价、分析销售额与广告投入的关系等。本文将详细介绍线性回归的原理,并给出Python代码实现。
简单线性回归是指只有一个自变量 $x$ 和一个因变量 $y$ 的线性回归模型,其数学表达式为:
$y = \theta_0 + \theta_1x + \epsilon$
其中,$\theta_0$ 是截距,$\theta_1$ 是斜率,$\epsilon$ 是误差项。我们的目标是找到合适的 $\theta_0$ 和 $\theta_1$,使得预测值 $\hat{y} = \theta_0 + \theta_1x$ 与真实值 $y$ 之间的误差最小。
当自变量有多个时,就变成了多元线性回归。假设自变量有 $n$ 个,分别为 $x_1, x_2, \cdots, x_n$,则多元线性回归模型可以表示为:
$y = \theta_0 + \theta_1x_1 + \theta_2x_2 + \cdots + \theta_nx_n + \epsilon$
同样,我们要找到最优的 $\theta_0, \theta_1, \cdots, \theta_n$ 来最小化误差。
为了衡量预测值与真实值之间的误差,我们通常使用均方误差(Mean Squared Error,MSE)作为损失函数,其公式为:
$MSE = \frac{1}{m}\sum_{i = 1}^{m}(y^{(i)} - \hat{y}^{(i)})^2$
其中,$m$ 是样本数量,$y^{(i)}$ 是第 $i$ 个样本的真实值,$\hat{y}^{(i)}$ 是第 $i$ 个样本的预测值。
常见的求解最优参数的方法有最小二乘法和梯度下降法。最小二乘法通过数学推导直接得到最优参数的解析解;梯度下降法则是一种迭代优化算法,通过不断更新参数来逐步减小损失函数的值。
import numpy as np
import matplotlib.pyplot as plt
# 生成一些示例数据
np.random.seed(0)
x = np.linspace(0, 10, 100)
y = 2 * x + 1 + np.random.randn(100)
# 最小二乘法求解参数
X = np.vstack((np.ones(len(x)), x)).T
theta = np.linalg.inv(X.T.dot(X)).dot(X.T).dot(y)
# 预测
y_pred = theta[0] + theta[1] * x
# 可视化结果
plt.scatter(x, y, label='Actual')
plt.plot(x, y_pred, color='red', label='Predicted')
plt.xlabel('x')
plt.ylabel('y')
plt.title('Simple Linear Regression')
plt.legend()
plt.show()
print(f"截距: {theta[0]}, 斜率: {theta[1]}")
import numpy as np
# 生成一些示例数据
np.random.seed(0)
m = 100 # 样本数量
n = 3 # 特征数量
X = np.random.randn(m, n)
y = 2 * X[:, 0] + 3 * X[:, 1] - 1 * X[:, 2] + np.random.randn(m)
# 添加偏置项
X_b = np.c_[np.ones((m, 1)), X]
# 初始化参数
theta = np.random.randn(n + 1, 1)
# 超参数
learning_rate = 0.01
n_iterations = 1000
# 梯度下降
for iteration in range(n_iterations):
gradients = 2/m * X_b.T.dot(X_b.dot(theta) - y.reshape(-1, 1))
theta = theta - learning_rate * gradients
# 预测
y_pred = X_b.dot(theta)
print("最终参数:")
print(theta)
Scikit-learn是Python中一个强大的机器学习库,它提供了简单易用的线性回归模型。
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
import numpy as np
# 生成一些示例数据
np.random.seed(0)
X = np.random.randn(100, 1)
y = 2 * X + 1 + np.random.randn(100, 1)
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 创建线性回归模型
model = LinearRegression()
# 训练模型
model.fit(X_train, y_train)
# 预测
y_pred = model.predict(X_test)
# 计算均方误差
mse = mean_squared_error(y_test, y_pred)
print(f"均方误差: {mse}")
# 查看模型参数
print(f"截距: {model.intercept_}, 斜率: {model.coef_}")
实现方法 | 优点 | 缺点 | 适用场景 |
---|---|---|---|
最小二乘法 | 直接得到解析解,计算简单 | 当数据量很大或特征很多时,计算复杂度高 | 数据量较小且特征较少的情况 |
梯度下降法 | 适用于大规模数据和复杂模型 | 需要调整超参数,收敛速度可能较慢 | 数据量较大或特征较多的情况 |
Scikit-learn库 | 简单易用,功能丰富 | 封装程度高,不利于深入理解算法原理 | 快速搭建模型进行实验和预测 |
线性回归是一种简单而有效的机器学习算法,通过不同的实现方法可以满足不同的需求。在实际应用中,我们可以根据数据的特点和问题的复杂度选择合适的方法。希望本文能帮助你更好地理解线性回归的代码实现。