梯度下降法求解多元线性回归 — NumPy

本文介绍了如何使用梯度下降法解决多元线性回归问题,特别是在房价预测中。针对数据集中属性值差异较大的问题,提出了属性归一化的必要性,详细阐述了线性归一化的过程,并给出了具体的Python代码实现。通过归一化,确保不同属性在同一数量级下,加速模型收敛并提高预测精度。最后展示了模型训练过程中的损失值变化及预测结果的可视化。

梯度下降法求解多元线性回归问题

使用梯度下降法求解一元线性回归的方法也可以被推广到求解多元线性回归问题。

这是多元线性回归的模型:
在这里插入图片描述
其中的 X 和 W 都是 m+1 维的向量。
在这里插入图片描述
下图为它的损失函数:
在这里插入图片描述
它也是一个高维空间中的凸函数,因此也可以使用梯度下降法来求解。
下图为它的权值更新算法:
图
代入偏导数,
图
可以得到最终的迭代公式:
图

问题描述

依然是房价预测的问题,这是一个二元线性回归问题。
在这里插入图片描述
需要注意的是,如果直接使用上图中的数据 x1 和 x2 来训练模型,就会因为面积(x1)值远远大于房间(x2)值而造成在学习过程中占主导,甚至决定性的地位,这显然是不合理的。

那应该怎么解决呢?

这时候应该将各个属性值进行归一化。

归一化

归一化又被称为标准化,是将数据的值限制在一定的范围之内。

在机器学习中,对所有属性进行归一化处理就是让它们处于同一个范围、同一个数量级下。这样才能更加的具有合理性。

使用归一化处理后,不仅可以使得模型更快的收敛到最优解,还可以提高学习器的精度。

归一化可以分为线性归一化、线性归一化、非线性映射归一化。

1、线性归一化

线性归一化是对原始数据的线性变换,转换函数如下:
在这里插入图片描述
线性归一化实现对原始数据的 等比例缩放。
归一化之后,所有的数据都会被映射到 [0,1] 之间。

这种归一化方法适合于样本数据分布比较均匀,比较集中的情况,而如果最大值或最小值不稳定,或者和绝大多数数据差距比较大的情况,使用这种方法得到的结果也会不稳定,为了避免这种情况,在实际应用中,可以使用经验常量来代替最大值和最小值。

2、标准差归一化

将数据集归一化为均值为0,方差为1的标准正态分布,转换函数如下:
在这里插入图片描述
其中,μ是均值,σ是标准差。
标准差归一化适合于样本近似于正态分布或者最大值和最小值未知的情况,有时最大值和最小值处于孤立点的情况也适用。

3、非线性映射归一化

对原始数据的非线性变换。常用的映射方法有指数、对数和正切等。非线性映射归一化适合于数据分化比较大的情况,也就是有的数据特别大、有的比较小。通过这种非线性映射归一化后,可以使数据变的更加均匀或者有特点。

样本数据的归一化需要根据实际数据的分布情况和特点来决定采用哪种方法。

这里的数据归一化方式选择线性归一化,归一化结果如下:

import numpy as np
import matplotlib.pyplot as plt

# 第一步:加载数据
# area 是商品房面积
area = np.array([137.97, 104.50, 100.00, 124.32, 79.20, 99.00, 124.00, 114.00,
                 106.69, 138.05, 53.75, 46.91, 68.00, 63.02, 81.26, 86.21])  # (16, )

# room 是商品房房间数
room = np.array([3, 2, 2, 3, 1, 2, 3, 2,
                 2, 3, 1, 1, 1, 1, 2, 2])

# 第二步:样本数据归一化 —— 采用线性归一化
# x1 是商品房面积归一化后的结果
x1 = (area - area.min()) / (area
<think>好的,用户想了解如何用Python实现基于梯度下降法多元线性回归,需要代码示例和解释。首先,我需要回忆梯度下降法的基本原理和多元线性回归的数学模型。多元线性回归的假设函数是$h_\theta(x) = \theta_0 + \theta_1x_1 + \theta_2x_2 + \dots + \theta_nx_n$,可以用向量形式表示为$h_\theta(X) = X\theta$。代价函数通常是均方误差,即$J(\theta) = \frac{1}{2m}\sum_{i=1}^{m}(h_\theta(x^{(i)}) - y^{(i)})^2$。梯度下降的更新规则是$\theta_j := \theta_j - \alpha \frac{\partial J}{\partial \theta_j}$,其中$\alpha$是学习率。 接下来,用户需要Python代码的实现步骤。根据参考内容中的引用[1]和[4],代码需要包括数据读取、特征标准化、添加偏置项、定义代价函数、梯度下降迭代等步骤。例如,引用[4]展示了代价函数的计算方式,使用numpy进行矩阵运算。同时,引用[2]提到了数据路径的问题,需要注意数据加载的正确方式。 然后,我需要考虑代码的结构。首先读取数据,可能需要使用pandas或numpy的loadtxt函数。然后进行特征标准化,确保不同特征的范围相近,加速梯度下降的收敛。添加一列1作为偏置项,对应$\theta_0$。定义代价函数时,使用向量化计算以提高效率。梯度下降过程中,需要计算梯度,即$\frac{1}{m} X^T(X\theta - y)$,然后迭代更新参数theta。 同时,要解释代码的关键部分,比如为什么要标准化,学习率的选择,迭代次数的确定等。可能还需要可视化代价函数的变化,帮助用户理解收敛过程。参考引用[3]中的矩阵求导部分,确保梯度计算的正确性。 最后,生成相关问题,帮助用户进一步学习,比如特征工程、学习率调整、与其他优化算法的对比等。确保引用正确,比如引用[1]提到多元线性回归的实现,引用[3]涉及梯度计算的公式。 检查LaTeX格式是否正确,行内公式用$...$,独立公式用$$...$$。例如,假设函数和代价函数需要用行内公式,而梯度更新公式可能需要单独成段。确保代码示例正确,语法无误,并添加必要的注释。 总结步骤:数据预处理、模型定义、梯度下降实现、结果可视化、参数解释。注意避免常见错误,如未标准化导致收敛慢,学习率过大或过小等。参考现有的示例代码,确保逻辑正确,运行无误。</think>### 梯度下降法实现多元线性回归 #### 1. 核心原理 多元线性回归模型表示为: $$h_\theta(x) = \theta_0 + \theta_1x_1 + \theta_2x_2 + \dots + \theta_nx_n$$ 或矩阵形式: $$h_\theta(X) = X\theta$$ 其中$X$为特征矩阵,$\theta$为参数向量。梯度下降通过迭代更新参数$\theta$以最小化代价函数: $$J(\theta) = \frac{1}{2m}\sum_{i=1}^{m}(h_\theta(x^{(i)}) - y^{(i)})^2$$ 梯度更新公式: $$\theta_j := \theta_j - \alpha \frac{\partial J}{\partial \theta_j} \quad (\alpha为学习率)$$ #### 2. Python实现代码 ```python import numpy as np import pandas as pd # 1. 数据预处理 data = pd.read_csv('path/to/data.csv') # 替换为实际路径[^2] X = data.iloc[:, :-1].values y = data.iloc[:, -1].values.reshape(-1, 1) # 特征标准化 X = (X - np.mean(X, axis=0)) / np.std(X, axis=0) # 添加偏置项 X_b = np.c_[np.ones((len(X), 1)), X] # 2. 初始化参数 theta = np.random.randn(X_b.shape[1], 1) learning_rate = 0.01 iterations = 1000 # 3. 定义代价函数 def compute_cost(X, y, theta): m = len(X) error = X.dot(theta) - y return (error.T.dot(error) / (2 * m))[0][0] # 矩阵运算优化[^4] # 4. 梯度下降 cost_history = [] for i in range(iterations): gradients = (1/len(X_b)) * X_b.T.dot(X_b.dot(theta) - y) theta -= learning_rate * gradients cost_history.append(compute_cost(X_b, y, theta)) # 5. 输出结果 print("最终参数:", theta.flatten()) ``` #### 3. 关键代码解释 - **特征标准化**:通过$z = (x-\mu)/\sigma$标准化,防止特征量纲差异影响收敛速度[^1] - **矩阵运算**:使用`X.dot(theta)`代替循环,提升计算效率[^3] - **梯度计算**:向量化实现$\frac{1}{m}X^T(X\theta - y)$,与手动推导公式一致[^3] - **学习率选择**:通常取0.001-0.1,可通过观察代价函数曲线调整 #### 4. 可视化代价曲线 ```python import matplotlib.pyplot as plt plt.plot(range(iterations), cost_history) plt.xlabel('Iterations') plt.ylabel('Cost') plt.show() ``` ####
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xuechanba

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值