微信登录

线性回归 - 算法实现 - 线性回归的代码实现

线性回归 - 算法实现 - 线性回归的代码实现

一、引言

线性回归是机器学习中最基础也是最重要的算法之一,它用于建立自变量和因变量之间的线性关系模型。在实际生活中,线性回归有着广泛的应用,比如预测房价、分析销售额与广告投入的关系等。本文将详细介绍线性回归的原理,并给出Python代码实现。

二、线性回归原理

2.1 简单线性回归

简单线性回归是指只有一个自变量 $x$ 和一个因变量 $y$ 的线性回归模型,其数学表达式为:
$y = \theta_0 + \theta_1x + \epsilon$
其中,$\theta_0$ 是截距,$\theta_1$ 是斜率,$\epsilon$ 是误差项。我们的目标是找到合适的 $\theta_0$ 和 $\theta_1$,使得预测值 $\hat{y} = \theta_0 + \theta_1x$ 与真实值 $y$ 之间的误差最小。

2.2 多元线性回归

当自变量有多个时,就变成了多元线性回归。假设自变量有 $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$ 来最小化误差。

2.3 损失函数

为了衡量预测值与真实值之间的误差,我们通常使用均方误差(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$ 个样本的预测值。

2.4 求解方法

常见的求解最优参数的方法有最小二乘法和梯度下降法。最小二乘法通过数学推导直接得到最优参数的解析解;梯度下降法则是一种迭代优化算法,通过不断更新参数来逐步减小损失函数的值。

三、代码实现

3.1 简单线性回归的最小二乘法实现

  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. # 生成一些示例数据
  4. np.random.seed(0)
  5. x = np.linspace(0, 10, 100)
  6. y = 2 * x + 1 + np.random.randn(100)
  7. # 最小二乘法求解参数
  8. X = np.vstack((np.ones(len(x)), x)).T
  9. theta = np.linalg.inv(X.T.dot(X)).dot(X.T).dot(y)
  10. # 预测
  11. y_pred = theta[0] + theta[1] * x
  12. # 可视化结果
  13. plt.scatter(x, y, label='Actual')
  14. plt.plot(x, y_pred, color='red', label='Predicted')
  15. plt.xlabel('x')
  16. plt.ylabel('y')
  17. plt.title('Simple Linear Regression')
  18. plt.legend()
  19. plt.show()
  20. print(f"截距: {theta[0]}, 斜率: {theta[1]}")

3.2 多元线性回归的梯度下降法实现

  1. import numpy as np
  2. # 生成一些示例数据
  3. np.random.seed(0)
  4. m = 100 # 样本数量
  5. n = 3 # 特征数量
  6. X = np.random.randn(m, n)
  7. y = 2 * X[:, 0] + 3 * X[:, 1] - 1 * X[:, 2] + np.random.randn(m)
  8. # 添加偏置项
  9. X_b = np.c_[np.ones((m, 1)), X]
  10. # 初始化参数
  11. theta = np.random.randn(n + 1, 1)
  12. # 超参数
  13. learning_rate = 0.01
  14. n_iterations = 1000
  15. # 梯度下降
  16. for iteration in range(n_iterations):
  17. gradients = 2/m * X_b.T.dot(X_b.dot(theta) - y.reshape(-1, 1))
  18. theta = theta - learning_rate * gradients
  19. # 预测
  20. y_pred = X_b.dot(theta)
  21. print("最终参数:")
  22. print(theta)

四、使用Scikit-learn库实现线性回归

Scikit-learn是Python中一个强大的机器学习库,它提供了简单易用的线性回归模型。

  1. from sklearn.linear_model import LinearRegression
  2. from sklearn.model_selection import train_test_split
  3. from sklearn.metrics import mean_squared_error
  4. import numpy as np
  5. # 生成一些示例数据
  6. np.random.seed(0)
  7. X = np.random.randn(100, 1)
  8. y = 2 * X + 1 + np.random.randn(100, 1)
  9. # 划分训练集和测试集
  10. X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
  11. # 创建线性回归模型
  12. model = LinearRegression()
  13. # 训练模型
  14. model.fit(X_train, y_train)
  15. # 预测
  16. y_pred = model.predict(X_test)
  17. # 计算均方误差
  18. mse = mean_squared_error(y_test, y_pred)
  19. print(f"均方误差: {mse}")
  20. # 查看模型参数
  21. print(f"截距: {model.intercept_}, 斜率: {model.coef_}")

五、总结

实现方法 优点 缺点 适用场景
最小二乘法 直接得到解析解,计算简单 当数据量很大或特征很多时,计算复杂度高 数据量较小且特征较少的情况
梯度下降法 适用于大规模数据和复杂模型 需要调整超参数,收敛速度可能较慢 数据量较大或特征较多的情况
Scikit-learn库 简单易用,功能丰富 封装程度高,不利于深入理解算法原理 快速搭建模型进行实验和预测

线性回归是一种简单而有效的机器学习算法,通过不同的实现方法可以满足不同的需求。在实际应用中,我们可以根据数据的特点和问题的复杂度选择合适的方法。希望本文能帮助你更好地理解线性回归的代码实现。