如何在Python中实现梯度下降法以优化线性回归模型,并通过黄金分割法自适应地调整学习率?请提供详细的代码示例。
时间: 2024-11-20 21:50:43 浏览: 31
在机器学习中,线性回归模型是一个常见的优化问题,梯度下降法是解决这类问题的有效工具。为了准确地实现梯度下降法并优化线性回归模型,同时自适应地调整学习率,我们可以通过黄金分割法来确定最佳的学习率值。以下是一个结合了这些概念的Python代码示例,它展示了如何实现这一过程:
参考资源链接:[Python实现梯度下降法:多维无约束极值优化与可视化](https://wenku.csdn.net/doc/645307f3ea0840391e76c6ce?spm=1055.2569.3001.10343)
```python
import numpy as np
from scipy.optimize import golden_section_search
# 定义线性回归的目标函数,即损失函数
def objective_function(weights, X, y):
y_pred = np.dot(X, weights)
return np.mean((y - y_pred) ** 2)
# 计算损失函数关于权重的梯度
def gradient(weights, X, y):
y_pred = np.dot(X, weights)
return -2 * np.dot(X.T, (y - y_pred)) / len(y)
# 黄金分割法求解最优学习率
def golden_section_for_learning_rate(f, a, b, tolerance):
def phi(alpha):
return -f(alpha)
return golden_section_search(phi, a, b, tolerance)
# 初始化数据和参数
X = np.array([[1], [2], [3], [4], [5]])
y = np.array([5, 7, 9, 11, 13])
initial_weights = np.zeros(X.shape[1])
learning_rate = 0.01 # 初始学习率
# 自适应调整学习率
tolerance = 1e-5
best_learning_rate = golden_section_for_learning_rate(
lambda alpha: objective_function(initial_weights, X, y - alpha * gradient(initial_weights, X, y)),
a=0.001, b=0.1, tolerance=tolerance
)
# 使用调整后的学习率进行梯度下降
weights = initial_weights.copy()
for _ in range(1000): # 迭代次数
gradient_value = gradient(weights, X, y)
weights -= best_learning_rate * gradient_value
# 输出最终的权重值
print(
参考资源链接:[Python实现梯度下降法:多维无约束极值优化与可视化](https://wenku.csdn.net/doc/645307f3ea0840391e76c6ce?spm=1055.2569.3001.10343)
阅读全文