MyMachineLearning-learning-梯度下降

梯度下降

梯度下降算法是一种最为常用的解决优化问题的方法,该方法每次下降的方向均为当前位置的负梯度方向,以此保证下降速度最快,从而使损失函数迅速达到最小化。

为了简化问题, 首先假设 m=1 , 对 J(θ) 求 θj 的偏导数:
梯度下降的公式推导
考虑整个 θ , 以及全部 xi for i in range(m)
在这里插入图片描述
python实现

import numpy as np
import matplotlib.pyplot as plt
data = np.loadtxt('linear_regression_data1.txt', delimiter=',')
X = np.c_[np.ones(data.shape[0]),data[:,0]]
y = np.c_[data[:,1]]

核心代码:

def myCost(X, y, theta = [[0], [0]]):
    J = 1.0 / (2 * y.shape[0]) * np.sum(np.square(X.dot(theta) - y))
    return J

def mySGD(X, y, theta = [[1], [1]], alpha = 0.01, iteration = 1500):
    cost_history = np.zeros(iteration)
    
    for times in range(iteration):
        theta -= (alpha * 1.0/ y.shape[0]) * (X.T.dot(X.dot(theta) - y))
        cost_history[times] = myCost(X, y, theta)
    return theta, cost_history

theta , Cost_J = mySGD(X, y)
print('theta: ',theta.ravel())

绘制损失函数

plt.plot(Cost_J)
plt.ylabel('Cost J')
plt.xlabel('Iterations')

结果如图
在这里插入图片描述
绘制线性回归梯度下降收敛情况:

x1 = np.arange(5,23)
y1 = theta[0]+theta[1]*x1

# 画出我们自己写的线性回归梯度下降收敛的情况
plt.scatter(X[:,1], y, s=30, c='r', marker='x', linewidths=1)
plt.plot(x1,y1, label='Linear regression (Gradient descent)')

plt.xlim(4,24)
plt.xlabel('Population of City in 10,000s')
plt.ylabel('Profit in $10,000s')
plt.legend(loc=4)

在这里插入图片描述
数据提供:
6.1101 , 17.592
5.5277 , 9.1302
8.5186 , 13.662
7.0032 , 11.854
5.8598 , 6.8233
8.3829 , 11.886
7.4764 , 4.3483
8.5781 , 12.
6.4862 , 6.5987
5.0546 , 3.8166
5.7107 , 3.2522
14.164 , 15.505
5.734 , 3.1551
8.4084 , 7.2258
5.6407 , 0.71618
5.3794 , 3.5129
6.3654 , 5.3048
5.1301 , 0.56077
6.4296 , 3.6518
7.0708 , 5.3893
6.1891 , 3.1386
20.27 , 21.767
5.4901 , 4.263
6.3261 , 5.1875
5.5649 , 3.0825
18.945 , 22.638
12.828 , 13.501
10.957 , 7.0467
13.176 , 14.692
22.203 , 24.147
5.2524 , -1.22
6.5894 , 5.9966
9.2482 , 12.134
5.8918 , 1.8495
8.2111 , 6.5426
7.9334 , 4.5623
8.0959 , 4.1164
5.6063 , 3.3928
12.836 , 10.117
6.3534 , 5.4974
5.4069 , 0.55657
6.8825 , 3.9115
11.708 , 5.3854
5.7737 , 2.4406
7.8247 , 6.7318
7.0931 , 1.0463
5.0702 , 5.1337
5.8014 , 1.844
11.7 , 8.0043
5.5416 , 1.0179
7.5402 , 6.7504
5.3077 , 1.8396
7.4239 , 4.2885
7.6031 , 4.9981
6.3328 , 1.4233
6.3589 , -1.4211
6.2742 , 2.4756
5.6397 , 4.6042
9.3102 , 3.9624
9.4536 , 5.4141
8.8254 , 5.1694
5.1793 , -0.74279
21.279 , 17.929
14.908 , 12.054
18.959 , 17.054
7.2182 , 4.8852
8.2951 , 5.7442
10.236 , 7.7754
5.4994 , 1.0173
20.341 , 20.992
10.136 , 6.6799
7.3345 , 4.0259
6.0062 , 1.2784
7.2259 , 3.3411
5.0269 , -2.6807
6.5479 , 0.29678
7.5386 , 3.8845
5.0365 , 5.7014
10.274 , 6.7526
5.1077 , 2.0576
5.7292 , 0.47953
5.1884 , 0.20421
6.3557 , 0.67861
9.7687 , 7.5435
6.5159 , 5.3436
8.5172 , 4.2415
9.1802 , 6.7981
6.002 , 0.92695
5.5204 , 0.152
5.0594 , 2.8214
5.7077 , 1.8451
7.6366 , 4.2959
5.8707 , 7.2029
5.3054 , 1.9869
8.2934 , 0.14454
13.394 , 9.0551
5.4369 , 0.61705

### Q-Learning 与 策略梯度方法 的 区别 比较 #### 1. 核心原理 Q-Learning 是一种基于值函数的方法,通过学习一个 Q 值表来估计每个状态-动作对的价值。其核心是更新规则,利用贝尔曼方程逐步逼近最优策略[^1]。 策略梯度方法则是直接优化策略参数,通过调整策略的参数使得期望回报最大化。这种方法不需要显式地构建 Q 值表,而是通过梯度上升算法直接优化策略函数[^2]。 #### 2. 动作空间 Q-Learning 更适合离散动作空间的问题,因为它需要为每个可能的动作存储和更新 Q 值。对于连续动作空间,Q-Learning 的实现会变得非常困难甚至不可行[^3]。 策略梯度方法能够很好地处理连续动作空间问题,因为它直接优化策略函数,而不需要对所有可能的动作进行穷举或存储[^1]。 #### 3. 策略表示 Q-Learning 学习的是一个最优值函数 \( Q^*(s, a) \),然后根据该值函数间接推导出最优策略。它是一种间接方法,依赖于值函数的准确性。 策略梯度方法则直接学习策略函数 \( \pi(a|s) \),即给定状态下选择动作的概率分布。这种方法是直接优化策略,避免了值函数估计中的误差累积问题[^3]。 #### 4. 收敛性与稳定性 Q-Learning 的收敛性在理论上得到了较好的证明,尤其是在离散状态和动作空间中,只要满足适当的条件(如 ε-greedy 探索策略),就能收敛到最优解[^1]。然而,在复杂环境中,Q-Learning 可能会因为高维状态空间导致计算开销过大。 策略梯度方法虽然具有较强的灵活性,但其收敛速度通常较慢,并且容易陷入局部最优。此外,由于策略梯度方法直接优化策略,其训练过程可能会更加不稳定[^2]。 #### 5. 探索与利用 Q-Learning 使用 ε-greedy 策略平衡探索与利用,其中 ε 表示以一定概率随机选择动作,从而确保算法能够在探索新动作的同时利用已知的最佳动作[^3]。 策略梯度方法则通过调整策略参数来控制探索与利用的平衡,这通常依赖于策略函数的设计和优化算法的选择。 #### 6. 应用场景 Q-Learning 更适用于简单的离散动作空间问题,例如迷宫导航、棋盘游戏等[^1]。 策略梯度方法更适合复杂的连续动作空间问题,例如机器人控制、自动驾驶等领域。 ```python # 示例代码:Q-Learning 实现 import numpy as np def q_learning(env, episodes, alpha, gamma, epsilon): q_table = np.zeros([env.observation_space.n, env.action_space.n]) for _ in range(episodes): state = env.reset() done = False while not done: if np.random.rand() < epsilon: action = env.action_space.sample() # 探索 else: action = np.argmax(q_table[state]) # 利用 next_state, reward, done, _ = env.step(action) td_target = reward + gamma * np.max(q_table[next_state]) q_table[state, action] += alpha * (td_target - q_table[state, action]) state = next_state return q_table # 示例代码:策略梯度方法(PyTorch 实现) import torch import torch.nn as nn import torch.optim as optim class PolicyGradient(nn.Module): def __init__(self, input_dim, output_dim): super(PolicyGradient, self).__init__() self.network = nn.Sequential( nn.Linear(input_dim, 128), nn.ReLU(), nn.Linear(128, output_dim), nn.Softmax(dim=-1) ) self.optimizer = optim.Adam(self.network.parameters(), lr=0.01) def forward(self, state): return self.network(state) def update(self, rewards, log_probs): loss = -torch.sum(torch.tensor(rewards) * log_probs) self.optimizer.zero_grad() loss.backward() self.optimizer.step() ```
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值