如何为Gradient Descent(梯度下降)动态修改输入特征并自动执行迭代计算
适配任意特征维度的梯度下降实现方案
你目前写的梯度下降核心逻辑本身已经支持任意输入特征维度,numpy的矩阵运算会自动匹配维度,不需要修改核心计算逻辑。你只需要补充自动读取数据集维度、自动生成对应权重的逻辑,再添加损失存储和绘图的代码即可,实现流程如下:
- 自动解析数据集维度
不需要手动数特征数量,统一将数据集最后一列作为标签Y,前面所有列作为输入特征X,初始权重theta的维度直接和X的列数对齐即可:
import numpy as np import matplotlib.pyplot as plt # 读取数据集,skiprows=1跳过表头行,支持任意列数的数据集 data = np.loadtxt("你的数据集文件路径", skiprows=1) # 取所有行、除最后一列外的所有列作为特征X x = data[:, :-1] # 取所有行、最后一列作为标签Y y = data[:, -1:] # 自动生成和特征维度匹配的初始theta,全0初始化即可 theta = np.zeros((x.shape[1], 1))
- 改造梯度下降函数存储损失值
原函数已经适配任意维度,只需新增损失值存储逻辑,同时不用手动传入样本量m,直接从X的行数读取更方便:
def gradientDescent(x, y, theta, alpha, numIterations): m = x.shape[0] xTrans = x.T cost_history = [] for i in range(numIterations): hypothesis = np.dot(x, theta) loss = hypothesis - y cost = np.sum(loss ** 2) / (2 * m) cost_history.append(cost) # 梯度计算逻辑完全通用,自动适配任意特征维度 gradient = np.dot(xTrans, loss) / m theta = theta - alpha * gradient return theta, cost_history
- 调用函数并绘制损失曲线
调用过程不需要修改,新增绘图代码即可:
# 自定义超参数 alpha = 0.001 num_iter = 1500 # 运行梯度下降 final_theta, cost_list = gradientDescent(x, y, theta, alpha, num_iter) # 绘制迭代-代价曲线 plt.plot(range(num_iter), cost_list) plt.xlabel("迭代次数") plt.ylabel("代价") plt.show()
注意事项
如果新增特征后梯度下降收敛速度变慢,建议先对所有特征做标准化/归一化处理,避免特征尺度差异过大影响收敛效果,这个操作也支持任意特征维度,不需要手动调整。
内容的提问来源于stack exchange,提问作者Gamblet
相关产品推荐
相关产品推荐

