梯度下降法python代码
梯度下降法是一种优化算法,用于找到函数的最小值。
pythonimport numpy as np
def gradient_descent(x, y, learning_rate=0.01, epochs=1000):
# 初始化参数
m = len(y)
theta = np.zeros((2, 1)) # 参数初始化为0
x = np.column_stack((np.ones((m, 1)), x)) # 在特征矩阵中添加一列全为1的列
# 梯度下降迭代
for epoch in range(epochs):
# 计算预测值
y_pred = np.dot(x, theta)
# 计算误差
error = y_pred - y
# 计算梯度
gradient = np.dot(x.T, error) / m
# 更新参数
theta = theta - learning_rate * gradient
# 计算损失函数
cost = np.sum(error**2) / (2 * m)
if epoch % 100 == 0:
print(f'Epoch {epoch}, Cost: {cost}')
return theta
# 示例数据
x = np.array([1, 2, 3, 4, 5])
y = np.array([2, 4, 5, 4, 5])
# 调用梯度下降函数
theta = gradient_descent(x, y)
print('最优参数 theta:', theta)
在这个例子中,我们使用简单的线性回归问题来演示梯度下降法。 gradient_descent 函数接受输入特征 x 和对应的目标值 y,并通过迭代来更新参数 theta 以最小化损失函数。你可以根据你的问题和数据修改这个代码。
当使用梯度下降法时,有一些关键的超参数需要调整,以确保算法能够有效地收敛。这些超参数包括学习率 (learning_rate) 和迭代次数 (epochs)。你可能需要根据实际情况进行调整,以获得最佳性能。
另外,这个例子是基于简单的一元线性回归问题,如果你的问题是多变量的线性回归,你需要相应地修改特征矩阵和参数的维度。
特征缩放: 如果特征的尺度相差很大,可能需要进行特征缩放,以确保梯度下降算法更快地收敛。
正则化: 如果数据集较小,可以考虑添加正则化项来防止过拟合。
收敛判据: 可以添加一个收敛判据,当损失变化很小时停止迭代,以提高效率。
批量梯度下降 vs 随机梯度下降 vs 小批量梯度下降: 这个例子使用的是批量梯度下降,你可以根据数据集大小选择不同的梯度下降变体。
其他优化算法: 除了梯度下降,还有其他优化算法如 Adam、RMSProp 等,可以考虑使用这些算法。