【机器学习】正规方程与梯度下降API及案例预测

正规方程与梯度下降API及案例预测

文章目录

  • 正规方程与梯度下降API及案例预测
    • [1. 正规方程与梯度下降](#1. 正规方程与梯度下降)
      • [正规方程(Normal Equation)](#正规方程(Normal Equation))
      • [梯度下降(Gradient Descent)](#梯度下降(Gradient Descent))
    • [2. API](#2. API)
    • [3. 波士顿房价预测](#3. 波士顿房价预测)

1. 正规方程与梯度下降

回归模型是机器学习中用于预测连续数值(实数)的模型,通常用于解决回归问题。两种常见的回归模型求解方法是正规方程和梯度下降。

正规方程(Normal Equation)

正规方程是一种封闭解法,用于直接计算线性回归模型的权重(系数)。

原理

给定一个线性回归模型的数据集,我们的目标是找到最佳的权重(系数)w,使得模型的预测值尽可能接近实际值。正规方程的原理是通过最小化损失函数来找到最佳权重。对于线性回归问题,损失函数通常是均方误差(Mean Squared Error):
J ( w ) = 1 2 m ∑ i = 1 m ( h w ( x ( i ) ) − y ( i ) ) 2 J(w) = \frac{1}{2m} \sum_{i=1}^{m} (h_w(x^{(i)}) - y^{(i)})^2 J(w)=2m1i=1∑m(hw(x(i))−y(i))2

其中,m 是训练样本数量,
h w ( x ( i ) ) h_w(x^{(i)}) hw(x(i))

是模型的预测值,
y ( i ) y^{(i)} y(i)

是实际值。

正规方程的目标是找到权重w,使损失函数J(w)最小化。通过求解损失函数的梯度等于零的方程,可以得到权重w的解析解:

∇ J ( w ) = 0 \nabla J(w) = 0 ∇J(w)=0

这个方程的解即为最佳权重w,从而得到线性回归模型。

优点

  • 正规方程提供了封闭解,不需要手动选择学习率或迭代次数。
  • 适用于小型数据集,通常在特征数量较少时表现良好。

缺点

  • 对于大型数据集,计算复杂度高,需要计算特征矩阵的逆,时间复杂度较高。
  • 不适用于非线性模型。

梯度下降(Gradient Descent)

梯度下降是一种迭代优化算法,用于调整模型的参数,使损失函数最小化。

原理

梯度下降的核心思想是通过迭代来更新模型参数,使损失函数逐渐减小。对于线性回归,梯度下降的损失函数是均方误差(Mean Squared Error),目标是最小化这个损失函数。

梯度下降的迭代过程如下:

  1. 初始化权重w。
  2. 计算损失函数J(w)关于权重 w w w的梯度
    ∇ J ( w ) \nabla J(w) ∇J(w)
  3. 更新权重w,通常按照以下规则更新:
    w = w − α ∇ J ( w ) w = w - \alpha \nabla J(w) w=w−α∇J(w)
    ,其中α是学习率,控制每次更新的步长。
  4. 重复步骤2和3,直到满足停止条件(例如,达到最大迭代次数或损失函数收敛)。

梯度下降的关键是学习率α的选择,过大的学习率可能导致算法不收敛,过小的学习率可能导致收敛速度慢。

优点

  • 适用于大型数据集和高维特征,计算复杂度较低。
  • 可以用于各种不同类型的模型和损失函数,包括非线性模型。

缺点

  • 需要手动选择学习率和迭代次数,选择不当可能导致收敛问题或性能下降。
  • 对特征缩放和初始化敏感。

2. API

sklearn.linear_model.LinearRegression(fit_intercept=True)

  • 通过正规方程优化
  • fit_intercept:是否计算偏置
  • LinearRegression.coef_:回归系数
  • LinearRegression.intercept_:偏执

sklearn.linear_model.SGDRegressor(loss="squared_loss",fit_intercept=True,learning_rate="invscaling",eta0=0.01)

  • SGDRegressor类实现了随机梯度下降学习,它支持不同的loss函数和正则化惩罚项来拟合线性回归模型
  • loss:损失类型
    • loss="squared_loss":普通最小二乘法
  • fit_intercept:是否计算偏置
  • learning_rate:string,optional
    • 学习率填充
    • "constant":eta=eta0
    • "optimal":eta=1.0/(alpha*(t+t0))default
    • "invscaling":eta=eta0/pow(t,power_t),power_t存在父类之中
    • 对于一个常数值的学习率来说,可以使用learning_rate="constant",并使用eta0来指定学习率
  • SGDRegressor.coef_:回归系数
  • SGDRegressor.intercept_:偏置

3. 波士顿房价预测

  • 实例数量:506,属性数量:13数值型或类别墅,帮助预测的属性
  • 属性信息:
    • CRIM城镇人均犯罪率
    • ZN占地面积超过2.5万平方英尺的住宅用地比例
    • INDUS城镇非零售业务地区的比例
    • CHAS查尔斯河虚拟变量(=1,如果土地在河边;否则是0)
    • NOX一氧化氮浓度(每1000万份)
    • RM平均每居民房数
    • AGE在1940年之前建成的所有者占用单位的比例
    • DIS与五个波士顿就业中心的加权距离
    • RAD辐射状公路的可达性指数
    • TAX每10000美元的全额物业税率
    • PTRATIO城镇师生比例
    • B 1000(Bk-0.63)^2其中Bk是城镇中的黑人比例
    • LSTAT人口中地位较低人群的百分数
    • MEDV以1000美元计算的自由住房的中位数
  • 缺失属性值:无

流程:

  • 获取数据集
  • 划分数据集
  • 特征工程:无量纲化处理--标准化
  • 预估器流程,fit()-->模型:coef_,intercept_
  • 模型评估
python 复制代码
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression

def linear_demo():
    """
    正规方程的方法对波士顿房价进行预测
    :return:
    """
    # 1. 获取数据
    boston = load_boston()
    # 2. 划分数据集
    x_train, x_test, y_train,y_test = train_test_split(boston.data, boston.target, random_state= 22)
    # 3. 标准化
    transfer = StandardScaler()
    x_train = transfer.fit_transform(x_train)
    x_test = transfer.transform(x_test)
    # 4. 预估器
    estimator = LinearRegression()
    estimator.fit(x_train, y_train)
    # 5. 得出模型
    print("权重系数为:\n", estimator.coef_)
    print("偏置为:\n", estimator.intercept_)
    # 6. 模型评估
    y_predict = estimator.predict(x_test)
    print("y_predict:\n", y_predict)
    print("直接对比真实值和预测值:\n", y_test == y_predict)
    score = estimator.score(x_test, y_test)
    print("准确率为:\n", score)
python 复制代码
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import SGDRegressor

def linear_demo():
    """
    梯度下降的方法对波士顿房价进行预测
    :return:
    """
    # 1. 获取数据
    boston = load_boston()
    # 2. 划分数据集
    x_train, x_test, y_train,y_test = train_test_split(boston.data, boston.target, random_state= 22)
    # 3. 标准化
    transfer = StandardScaler()
    x_train = transfer.fit_transform(x_train)
    x_test = transfer.transform(x_test)
    # 4. 预估器
    estimator = SGDRegressor()
    estimator.fit(x_train, y_train)
    # 5. 得出模型
    print("权重系数为:\n", estimator.coef_)
    print("偏置为:\n", estimator.intercept_)
    # 6. 模型评估
    y_predict = estimator.predict(x_test)
    print("y_predict:\n", y_predict)
    print("直接对比真实值和预测值:\n", y_test == y_predict)
    score = estimator.score(x_test, y_test)
    print("准确率为:\n", score)
相关推荐
江畔柳前堤10 小时前
roLabelImg 详细安装教程
开发语言·人工智能·后端·云原生
阿里云大数据AI技术10 小时前
分链路差异化设计的DSP准实时数仓|钛动科技基于阿里云实时计算 Flink 版 + DLF Paimon + EMR Serverless StarRocks 的实践
人工智能·flink
陕西企来客10 小时前
2026年7月AI智能搜索曝光趋势研判
大数据·人工智能·机器学习·ai智能搜索曝光
阿里云大数据AI技术11 小时前
从算力到智能体,面向 Agentic AI 的基础设施演进
人工智能·agent
hangyuekejiGEO12 小时前
GEO技术服务选型指南
大数据·人工智能·python
阿里云大数据AI技术12 小时前
EMR Serverless Spark AI Function 的双维降本实践
人工智能·sql·spark
维基框架12 小时前
GitHub源码处理提速 一趟扫描反而更慢
人工智能·github
冬奇Lab12 小时前
代码库知识库系列(05):向量检索 vs 知识图谱——加了调用图并没有变更好
人工智能
AKAMAI12 小时前
你的源服务器可能是你做出的最昂贵决定
运维·人工智能·云计算
冬奇Lab13 小时前
【无标题】
人工智能·开源