学习梯度下降法求线性回归的过程

梯度下降法学习
 

学习网址一:用这篇文章补充梯度下降法基本知识机器学习算法入门之(一) 梯度下降法实现线性回归_使用梯度下降方法实现线性回归算法-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()

通过学习这两篇文章,自己大概就能写出这样的代码
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值