梯度下降法学习
学习网址一:用这篇文章补充梯度下降法基本知识机器学习算法入门之(一) 梯度下降法实现线性回归_使用梯度下降方法实现线性回归算法-CSDN博客
学习网址二:这篇文章能帮助我们进一步加深理解,看完后能自己让AI写出代码
梯度下降法在线性回归中的应用及python代码实现_要求使用python语言实现线性回归和梯度下降优化代码-CSDN博客
迭代演示代码
import numpy as np
# 设置初始参数
m_current = 0.0 # 斜率的初始值
b_current = 0.0 # 截距的初始值
# 设置学习率和迭代次数
learning_rate = 0.01
n_iterations = 1000
# 生成模拟数据
np.random.seed(0)
x = np.random.rand(100, 1) * 10 # 100个随机x值
true_m = 2.0
true_b = 1.0
y = true_m * x + true_b + np.random.randn(100, 1) * 0.5 # 根据真实模型生成y值,加入噪声
# 梯度下降法
for i in range(n_iterations):
# 计算预测值
y_pred = m_current * x + b_current
# 计算损失函数的梯度:其实就让损失函数分别对m,b求偏导
gradient_m = (-2/len(x)) * np.sum(x * (y - y_pred))
gradient_b = (-2/len(x)) * np.sum(y - y_pred)
# 更新参数:由于是要计算损失函数的最小值,所以每一次得到新的梯度值后都应该取其相反值,即做减法
m_current -= learning_rate * gradient_m
b_current -= learning_rate * gradient_b
# 打印每次迭代的参数
print(f"Iteration {i+1}: m = {m_current:.4f}, b = {b_current:.4f}")
# 最终结果
print(f"After {n_iterations} iterations:")
print(f"Estimated m: {m_current:.4f}, Estimated b: {b_current:.4f}")
梯度下降法实现线性回归与模块计算的直线做对比
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
## 线性回归损失函数
defJ(theta, X_b, y):
return np.sum((y - X_b.dot(theta)) **2)/ (2*len(X_b))
线性回归损失函数的偏导
defdJ(theta, X_b, y):
res = np.empty(len(theta))
res[0]= np.sum(X_b.dot(theta) - y)
for i inrange(1, len(theta)):
res[i]= (X_b.dot(theta)- y).dot(X_b[:, i])
return res /len(X_b)
## 梯度下降法
defgradient_descent(X_b, y, initial_theta, eta, n_iters=10000, epsilon=1e-8, plot_iterations=False):
theta = initial_theta
for i inrange(n_iters):
gradient =dJ(theta, X_b, y)
theta = theta - eta * gradient
# 如果需要绘制迭代过程,每隔200次迭代绘制一次,其实200就已经非常拟合了,所以五条线都几乎和模块函数计算出的最终直线重合在一起了
if plot_iterations and (i+1) %200==0:
# 绘制当前迭代的回归线
y_range = X_b.dot(theta)
plt.plot(x_range, y_range, 'c--', alpha=0.3)
# 检查是否收敛
ifabs(J(theta, X_b, y) -J(theta + eta * gradient, X_b, y))< epsilon:
break
return theta
## 构建两列满足线性关系的散点数据:
np.random.seed(666)
x = np.random.random(size=100)
y =4. + x *3. + np.random.normal(scale=1, size=100)
## 散点图
plt.scatter(x, y, color='blue', label='Data points')
## 准备数据
X_b = np.hstack([np.ones((len(x), 1)), x.reshape(-1,1)])
initial_theta = np.zeros(X_b.shape[1])
eta =0.01
## 定义x_range用于绘制直线
x_range = np.linspace(min(x), max(x), 100).reshape(100, 1)
X_b_range = np.hstack([np.ones((100, 1)), x_range])
## 执行梯度下降并绘制迭代的回归线
theta_final =gradient_descent(X_b, y, initial_theta, eta, plot_iterations=True)
## 使用Scikit-learn进行线性回归
lin_reg =LinearRegression()
lin_reg.fit(X_b, y)
a_sklearn = lin_reg.coef_[1] # 斜率
b_sklearn = lin_reg.intercept_ # 截距
## 绘制Scikit-learn线性回归直线
plt.plot(x_range, a_sklearn * x_range + b_sklearn, 'r-', label='Linear Regression (Scikit-learn)')
## 绘制梯度下降法得到的最终线性回归直线
y_range_final = X_b_range.dot(theta_final)
plt.plot(x_range, y_range_final, 'g--', label='Gradient Descent Result')
plt.xlabel("x")
plt.ylabel("y")
plt.title("Linear Regression Fit with Gradient Descent Iterations")
plt.legend()
plt.show()