Q-learning 例子注释

本文通过一个简单的例子介绍如何使用Q学习方法进行强化学习。在一个一维世界中,智能体通过不断尝试找到宝藏的位置,逐步改进其策略。文章详细展示了Q表的构建、动作选择及环境反馈等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

"""
A simple example for Reinforcement Learning using table lookup Q-learning method.
An agent "o" is on the left of a 1 dimensional world, the treasure is on the rightmost location.
Run this program and to see how the agent will improve its strategy of finding the treasure.
View more on my tutorial page: https://morvanzhou.github.io/tutorials/
"""

import numpy as np
import pandas as pd
import time

#random会生成相同的随机数
np.random.seed(2)  # reproducible



N_STATES = 6   # the length of the 1 dimensional world
ACTIONS = ['left', 'right']     # available actions
EPSILON = 0.9   # greedy police
ALPHA = 0.1     # learning rate
GAMMA = 0.9    # discount factor
MAX_EPISODES = 13   # maximum episodes
FRESH_TIME = 0.3    # fresh time for one move


def build_q_table(n_states, actions):
    #生成q_table 表 6行2列 并赋值为0,两列叫left 和right
    table = pd.DataFrame(
        np.zeros((n_states, len(actions))),     # q_table initial values
        columns=actions,    # actions's name
    )
    # print(table)    # show table
    return table


def choose_action(state, q_table):
    # This is how to choose an action
    state_actions = q_table.iloc[state, :]#获取q_table表中 某一行的state 的值
    #print('\r')
    #print(state_actions)
    #随机生成【0,1】间的随机数>EPSILON(以10%的概率随机)或state_actions全为0时随机
    if (np.random.uniform() > EPSILON) or ((state_actions == 0).all()):  # act non-greedy or state-action have no value
        #从ACTIONS随机选一个
        action_name = np.random.choice(ACTIONS)
        print(' choice random:' + action_name)
        print(state_actions)
    else:   # act greedy
        #返回最大的数值的索引
        action_name = state_actions.idxmax()    # replace argmax to idxmax as argmax means a different function in newer version of pandas
        print('choice maxindex:'+action_name)
        print(state_actions)
    return action_name


def get_env_feedback(S, A):
    #输入当前状态S 和 动作 A
    #返回下一个状态S_和动作后的奖赏
    #  This is how agent will interact with the environment
    if A == 'right':    # move right
        if S == N_STATES - 2:   # terminate
            S_ = 'terminal'
            R = 1
        else:
            S_ = S + 1
            R = 0
    else:   # move left
        R = 0
        if S == 0:
            S_ = S  # reach the wall
        else:
            S_ = S - 1
    return S_, R


def update_env(S, episode, step_counter):
    # This is how environment be updated
    env_list = ['-']*(N_STATES-1) + ['T']   # '---------T' our environment
    if S == 'terminal':
        interaction = 'Episode %s: total_steps = %s' % (episode+1, step_counter)
        print('\r{}'.format(interaction), end='')
        time.sleep(2)
        print('\r                                ', end='')
    else:
        env_list[S] = 'o'
        interaction = ''.join(env_list)
        print('\r{}'.format(interaction), end='')
        time.sleep(FRESH_TIME)


def rl():
    # main part of RL loop
    q_table = build_q_table(N_STATES, ACTIONS)
    for episode in range(MAX_EPISODES):
        step_counter = 0
        S = 0
        is_terminated = False
        update_env(S, episode, step_counter)
        while not is_terminated:

            A = choose_action(S, q_table)
            S_, R = get_env_feedback(S, A)  # take action & get next state and reward
            q_predict = q_table.loc[S, A]#表格中动作的预测奖赏
            if S_ != 'terminal':
                #动作后的实际奖赏+GAMMA*下一步的预测值(S_时的动作奖赏)的最大子
                q_target = R + GAMMA * q_table.iloc[S_, :].max()   # next state is not terminal
            else:
                q_target = R     # next state is terminal
                is_terminated = True    # terminate this episode

            q_table.loc[S, A] += ALPHA * (q_target - q_predict)  # update q_table 向q_target靠近
            S = S_  # move to next state

            update_env(S, episode, step_counter+1)#更新环境
            step_counter += 1
    return q_table


if __name__ == "__main__":
    q_table = rl()
    print('\r\nQ-table:\n')
    print(q_table)
sarsa只需要改动两条
action_ = RL.choose_action(str(observation_))#由随机产生a_ 变成实际选出并做动作
q_target = r + self.gamma * self.q_table.loc[s_, a_]  



<think>好的,用户想了解如何使用t-SNE进行特征可视化,包括方法和实现步骤。首先我需要回忆t-SNE的基本概念和流程,确保信息准确。根据用户提供的三个引用,引用[1]提到了t-SNE的基本概念和sklearn的参数说明,引用[2]有Python实现的例子,引用[3]则总结了t-SNE的优势和应用场景。接下来需要结合这些信息来组织回答。 首先,要解释t-SNE是什么,它的作用是什么。这部分需要简明扼要,让用户有个初步认识。然后分步骤说明实现方法,可能包括数据准备、模型训练、特征提取、t-SNE降维和可视化。每个步骤需要具体,比如在数据准备阶段需要标准化数据,特征提取可能用CNN的例子,降维时使用sklearn的TSNE类,可视化用matplotlib或seaborn。同时要提到参数调整的重要性,比如perplexity和learning_rate的设置,以及结果解读的注意事项。 然后,需要给出一个Python的代码示例,这能让用户更直观地理解实现过程。代码应包括数据加载、预处理、特征提取(比如用PCA替代CNN,因为用户可能没有现成的模型)、t-SNE降维和绘图。代码注释要清楚,参数说明参考引用[1]中的sklearn函数参数。 接下来是注意事项,需要强调t-SNE的随机性、计算资源消耗和高维结构保留能力,这部分引用[3]中的内容,说明其优势和局限性。最后生成相关问题,引导用户进一步学习,比如与其他降维方法比较、参数影响、处理大数据时的优化等。 需要检查是否符合用户的格式要求:数学公式用$...$,独立公式用$$...$$,中文回答,结构清晰,引用标记正确。比如在解释高维空间相似度时,使用公式:$p_{j|i} = \frac{\exp(-||x_i - x_j||^2 / 2\sigma_i^2)}{\sum_{k \neq i} \exp(-||x_i - x_k||^2 / 2\sigma_i^2)}$,并确保LaTeX语法正确。 最后确认是否覆盖了用户的问题,是否引用了正确的资料,比如在参数说明部分引用[1],在优势和局限性部分引用[3]。同时确保生成的三个相关问题与t-SNE相关,帮助用户深入理解。</think>### t-SNE特征可视化方法及实现步骤 t-SNE(t-Distributed Stochastic Neighbor Embedding)是一种非线性降维算法,专门用于高维数据的可视化。其核心思想是通过概率分布建模,在低维空间中保留高维数据的局部结构[^1]。 --- #### **实现步骤** 1. **数据准备** - 标准化数据:对特征矩阵进行归一化处理,消除量纲影响 $$X_{\text{norm}} = \frac{X - \mu}{\sigma}$$ - 示例数据集:MNIST手写数字、CIFAR-10图像等 2. **模型训练与特征提取** - 使用卷积神经网络(CNN)等模型提取深层特征 - 最后一层全连接层输出作为特征向量 ```python # 示例:使用预训练模型提取特征 from tensorflow.keras.applications import VGG16 model = VGG16(weights='imagenet', include_top=False) features = model.predict(images) ``` 3. **t-SNE降维** - 使用`sklearn.manifold.TSNE`实现,关键参数: - `n_components`:降维后的维度(通常为2或3) - `perplexity`:控制局部结构的敏感度(建议5-50) - `learning_rate`:优化步长(通常100-1000)[^2] ```python from sklearn.manifold import TSNE tsne = TSNE(n_components=2, perplexity=30, random_state=42) X_tsne = tsne.fit_transform(features) ``` 4. **可视化** - 用散点图展示降维结果,不同类别用颜色区分 ```python import matplotlib.pyplot as plt plt.scatter(X_tsne[:,0], X_tsne[:,1], c=labels, cmap='tab10') plt.colorbar() plt.title('t-SNE Visualization') plt.show() ``` --- #### **技术原理** - **高维空间相似度**:通过高斯分布计算数据点相似度 $$p_{j|i} = \frac{\exp(-||x_i - x_j||^2 / 2\sigma_i^2)}{\sum_{k \neq i} \exp(-||x_i - x_k||^2 / 2\sigma_i^2)}$$ - **低维空间相似度**:采用t分布建模,避免“拥挤问题” $$q_{ij} = \frac{(1 + ||y_i - y_j||^2)^{-1}}{\sum_{k \neq l}(1 + ||y_k - y_l||^2)^{-1}}$$ --- #### **注意事项** 1. 结果具有随机性,建议多次运行取稳定结果 2. 计算复杂度为$O(n^2)$,大数据集需使用`Barnes-Hut`近似算法 3. 可配合PCA先进行初步降维(如保留95%方差)[^3] 4. 不同类别的分离程度反映原始特征区分性 --- ### 完整代码示例 ```python # 数据加载与预处理 from sklearn.datasets import load_digits import numpy as np digits = load_digits() X = digits.data / 16.0 # 归一化到[0,1] y = digits.target # t-SNE降维 from sklearn.manifold import TSNE tsne = TSNE(n_components=2, perplexity=40, n_iter=300) X_2d = tsne.fit_transform(X) # 可视化 import matplotlib.pyplot as plt plt.figure(figsize=(10,8)) plt.scatter(X_2d[:,0], X_2d[:,1], c=y, cmap='jet', alpha=0.7) plt.colorbar(ticks=range(10)) plt.clim(-0.5,9.5) plt.title('MNIST t-SNE Projection') plt.show() ``` ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值