大家好!今天想和大家聊聊机器学习中的一个经典方法——线性回归。

它在实际应用中非常实用,尤其适合处理预测连续数值的问题,比如房价预测、销量分析等。

线性回归的核心思想很简单:通过一条“最佳拟合线”来描述输入特征和输出变量之间的关系。

下面,我会带大家一步步理解它的原理、实现方法,并分享一些代码示例。最后,还推荐了一个实用的视频资源,帮助你更深入学习。

一、线性回归的基本原理

线性回归是机器学习中的基础工具,主要用于回归任务。简单说,它试图找到自变量(比如房屋面积)和因变量(比如房价)之间的线性关系。模型可以用数学公式表示:预测值 = 截距 + 特征1 × 权重1 + 特征2 × 权重2 + ... + 误差。其中,截距是偏移量,权重是每个特征的系数,误差则表示预测和实际值的差距。

为了保证模型可靠,线性回归有几个关键假设:

  • 线性关系:目标变量和输入特征之间应该是线性相关的。

  • 独立性:误差项之间要相互独立,不能有依赖。

  • 同方差性:误差的波动幅度要稳定,不能随输入变化太大。

  • 正态性:误差最好服从正态分布,这样模型预测更准确。

这些假设在实际应用中很重要。如果数据不符合,模型效果可能打折扣。线性回归主要分两种:简单线性回归(只有一个输入特征)和多元线性回归(多个输入特征)。前者模型更简洁,后者则适合复杂场景。

优化模型时,我们通常最小化均方误差(MSE),即预测值和实际值差的平方的平均。常用方法包括:

  • 普通最小二乘法(OLS):直接计算解析解,适合小数据集。

  • 梯度下降法:通过迭代逐步优化参数,适合大数据或在线学习。

线性回归的优缺点也很明显:

  • 优点:模型简单、容易解释;计算速度快,适用于小规模数据;还能用残差分析诊断模型性能。

  • 缺点:对线性关系依赖强,处理非线性数据效果差;异常值容易干扰结果;特征间高度相关时,模型可能不稳定。

为了克服这些局限,扩展方法如岭回归(加L2正则化)、Lasso回归(加L1正则化进行特征选择)和弹性网络(结合两者)都很常用。

二、动手实现:四种代码示例

理论讲完,我们来点实践。下面用Python展示四种实现方式,从NumPy手动计算到Scikit-learn一键搞定。我用假数据生成示例,确保大家能复现。

  1. NumPy实现:手动计算参数

    使用NumPy手动求解,适合理解底层原理。代码生成随机数据,添加偏置项后,用正规方程计算权重。运行结果展示了数据点和拟合线的关系,直观易读。

    import numpy as np
    import matplotlib.pyplot as plt
    np.random.seed(0)
    X = 2 * np.random.rand(100, 1)
    y = 4 + 3 * X + np.random.randn(100, 1)
    X_b = np.c_[np.ones((100, 1)), X]
    theta_best = np.linalg.inv(X_b.T @ X_b) @ X_b.T @ y
    X_new = np.array([[0], [2]])
    X_new_b = np.c_[np.ones((2, 1)), X_new]
    y_predict = X_new_b @ theta_best
    plt.plot(X_new, y_predict, "r-", label="Prediction")
    plt.plot(X, y, "b.", label="Data")
    plt.xlabel("X"); plt.ylabel("y"); plt.legend(); plt.show()

    运行后,图表清晰显示拟合效果:红线是预测线,蓝点是原始数据。这种手动方式适合学习核心逻辑。

  1. Scikit-learn实现:快速高效

    如果追求效率,Scikit-learn的LinearRegression是首选。代码简洁,两行就能搞定拟合和预测。我用相同数据测试,结果和NumPy一致。

    from sklearn.linear_model import LinearRegression
    lin_reg = LinearRegression()
    lin_reg.fit(X, y)
    y_predict = lin_reg.predict(X_new)
    plt.plot(X_new, y_predict, "r-", label="Prediction")
    plt.plot(X, y, "b.", label="Data")
    plt.xlabel("X"); plt.ylabel("y"); plt.legend(); plt.show()
    print(f"Intercept: {lin_reg.intercept_}, Coefficients: {lin_reg.coef_}")

    图表显示拟合良好,适合实际项目快速部署。

  1. 梯度下降法:迭代优化

    对于大数据,梯度下降法更灵活。我手动实现参数更新,学习率设为0.1,迭代1000次。代码展示了每一步如何减少损失函数。

    theta = np.random.randn(2, 1)
    for iteration in range(1000):
        gradients = 2/100 * X_b.T @ (X_b @ theta - y)
        theta = theta - 0.1 * gradients
    X_new_b = np.c_[np.ones((2, 1)), X_new]
    y_predict = X_new_b @ theta
    plt.plot(X_new, y_predict, "r-", label="Prediction")
    plt.plot(X, y, "b.", label="Data")
    plt.xlabel("X"); plt.ylabel("y"); plt.legend(); plt.show()

    结果图验证了迭代收敛后的拟合效果,适合处理动态数据。

  1. SGDRegressor:随机梯度下降

    如果想用Scikit-learn的内置工具,SGDRegressor很实用。设置学习率和迭代次数后,它能高效处理大规模数据。

    from sklearn.linear_model import SGDRegressor
    sgd_reg = SGDRegressor(max_iter=1000, tol=1e-3, penalty=None, eta0=0.1)
    sgd_reg.fit(X, y.ravel())
    y_predict = sgd_reg.predict(X_new)
    plt.plot(X_new, y_predict, "r-", label="Prediction")
    plt.plot(X, y, "b.", label="Data")
    plt.xlabel("X"); plt.ylabel("y"); plt.legend(); plt.show()
    print(f"Intercept: {sgd_reg.intercept_}, Coefficients: {sgd_reg.coef_}")

    图表显示拟合线稳定,适合工业级应用。

三、总结与学习资源

线性回归虽简单,但它是机器学习的地基。NumPy实现适合理解本质,Scikit-learn则提升效率,梯度下降法应对大数据,SGDRegressor兼顾实用。记住,模型不是万能的—处理非线性数据时,可以考虑扩展方法。

为了帮助大家巩固知识,我推荐一个视频学习资源 它系统总结了本章内容,适合视频学习者。

线性回归:https://pan.quark.cn/s/d2b0e7163986

希望这篇文章能帮你扎实掌握线性回归!如果有疑问,欢迎在评论区交流。记住,动手实践是关键,试试代码示例,效果会更明显哦。

图片

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐