
线性回归是机器学习中最基础也是最重要的算法之一,它用于建立自变量和因变量之间的线性关系模型。在实际生活中,线性回归有着广泛的应用,比如预测房价、分析销售额与广告投入的关系等。本文将详细介绍线性回归的原理,并给出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 npimport 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)).Ttheta = 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.01n_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 LinearRegressionfrom sklearn.model_selection import train_test_splitfrom sklearn.metrics import mean_squared_errorimport 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库 | 简单易用,功能丰富 | 封装程度高,不利于深入理解算法原理 | 快速搭建模型进行实验和预测 |
线性回归是一种简单而有效的机器学习算法,通过不同的实现方法可以满足不同的需求。在实际应用中,我们可以根据数据的特点和问题的复杂度选择合适的方法。希望本文能帮助你更好地理解线性回归的代码实现。