25/1/14 算法笔记<强化学习> CBR加强化学习

devtools/2025/1/15 17:38:28/

CBR,基于案例的推理,它是一种基于过去的实际经验或经历的推理,他可以根据过往的案例找到与当前案例最相关的案例,然后对该案例做改动来解决当前的问题。

CBR的过程

CBR可以看作一个循环过程:相似按键检索-->案例重用-->案例修改-->案例学习

遇到新问题时,将新问题通过案例描述输入CBR系统,系统会检索出与目标案例最匹配的案例,若有与目标案例情况一致的源案例则直接交给用户,若没有则根据目标案例的情况对相似案例的解决方案调整修改。

                                

案例检索

那么案例检索会用到哪些方法呢?有以下几种:

1.基于内容的检索:提取案例关机按,使用距离度量计算新问题与案例之间的相似度。

2.基于索引的检索:先对案例进行所以,以快速检索,使用梳妆结构来组织案例,以提高检索效率

3.基于规则的检索:依赖预定义的规则来检索案例,规则可以基于专家知识或经验

4.基于类的检索:将案例根据某些特征分为不同的类,检索时首先确定新问题的类,然后在该类中查找相似案例。

5.混合检索:结合多种检索方法

6机器学习增强检索:利用机器学习技术来改进案例检索过程。使用神经网络提取特征,加入强化学习,反馈优化检索策略。

看到这我就发觉这算法和强化学习有多大区别吗,甚至都没归纳到机器学习中。

之后网上查找

首先推理机制不同

CBR是依赖过去的案例来解决问题,而不是通过学习模型来进行预测

机器学习是侧重学习模式,通过训练模型进行预测或者分类

简单的说是这样的,CBR作为一个研究领域,起源较早,主要是受到心理学和认知科学的影响,强调如何利用经验进行推理。

CBR和强化学习

嘿看我们的标题,你说这CBR不是经验吗,那这和强化学习不也就差不多吗,而且这不就是专家系统吗,为什么有不分入强化学习呢?

网上说并不是同一个概念,我看了之后发现其实还是有很多的相似点,不同肯能就是,专家系统是存储的是领域专家的知识,经验和规则,CBR存储的是案例,也可以是失败的案例,它是通过检索与新问题相似的历史案例来找到解决方案,应该就是一个找方案的方式不一样,一个是让训练好的专家分析,一个是去案例库里面直接找。

但是,CBR是不是专家系统那不重要啊(滑稽),我能让强化学习加入它吗?

包行的啊,老弟!

我们用CBR存储案例,然后强化学习过程中调用案例库,解决相似的问题

看下代码:
导入库
import numpy as np
import gym
from collections import deque 创建双端队列,适合存储案例。
CBR类
class CBR:def __init__(self, max_size=100):self.case_base = deque(maxlen=max_size)
添加案例

将一个新的案例(状态、动作、奖励、下一个状态)添加到案例库中。

    def add_case(self, state, action, reward, next_state):self.case_base.append((state, action, reward, next_state))
检索案例

根据当前状态检索最相似的案例

    def retrieve_case(self, current_state):if not self.case_base:return Nonereturn min(self.case_base, key=lambda case: np.linalg.norm(np.array(case[0]) - np.array(current_state)))
RL agent类
class RLAgent:def __init__(self, action_space):self.q_table = {}self.action_space = action_spaceself.epsilon = 1.0  # 探索率self.gamma = 0.99    # 折扣因子self.alpha = 0.1     # 学习率self.cbr = CBR()
动作选择
    def get_action(self, state):if np.random.rand() < self.epsilon:return self.action_space.sample()  # 随机选择动作return self.q_table.get(state, {}).get(max(self.q_table.get(state, {}), key=lambda x: self.q_table.get(state, {}).get(x, 0)), 0)
更新Q值
    def update_q_value(self, state, action, reward, next_state):if state not in self.q_table:self.q_table[state] = {}if action not in self.q_table[state]:self.q_table[state][action] = 0# Q-learning 更新best_next_action = max(self.q_table.get(next_state, {}), key=lambda x: self.q_table.get(next_state, {}).get(x, 0), default=0)td_target = reward + self.gamma * self.q_table.get(next_state, {}).get(best_next_action, 0)self.q_table[state][action] += self.alpha * (td_target - self.q_table[state][action])
从案例中学习
    def learn_from_case(self, case):state, action, reward, next_state = caseself.update_q_value(state, action, reward, next_state)
主函数
def main():env = gym.make('CartPole-v1')agent = RLAgent(env.action_space)num_episodes = 1000for episode in range(num_episodes):state = env.reset()done = Falsewhile not done:action = agent.get_action(tuple(state))next_state, reward, done, _ = env.step(action)# 存储案例agent.cbr.add_case(tuple(state), action, reward, tuple(next_state))# 更新 Q 值agent.update_q_value(tuple(state), action, reward, tuple(next_state))# 从案例中学习case = agent.cbr.retrieve_case(tuple(state))if case:agent.learn_from_case(case)state = next_state# 逐渐减少探索率agent.epsilon = max(0.01, agent.epsilon * 0.995)env.close()

实际当中,我们还需要根据案例然后对对当前状态进行调整,这里就做了个大概。

ok,over,明天见啦!


http://www.ppmy.cn/devtools/150731.html

相关文章

测试链接 勿看

这里写自标题 自定义定阿萨德义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定…

Spring Boot性能提升的核武器,速度提升500%!

虚拟线程是 Java 21 引入的一个新特性&#xff0c;用于简化并发编程。它与传统的操作系统线程相比&#xff0c;具有显著的优势&#xff1a; 轻量级&#xff1a;虚拟线程由 JVM 管理&#xff0c;而非操作系统&#xff0c;因此它们的内存占用和创建成本远低于传统线程。理论上&am…

多云架构,JuiceFS 如何实现一致性与低延迟的数据分发

随着大模型的普及&#xff0c;GPU 算力成为稀缺资源&#xff0c;单一数据中心或云区域的 GPU 资源常常难以满足用户的全面需求。同时&#xff0c;跨地域团队的协作需求也推动了企业在不同云平台之间调度数据和计算任务。多云架构正逐渐成为一种趋势&#xff0c;然而该架构下的数…

mac intel芯片下载安卓模拟器

一、调研 目前主流两个模拟器&#xff1a; 雷神模拟器 不支持macosmumu模拟器pro版 不支持macos intel芯片 搜索到mumu的Q&A中有 “Intel芯片Mac如何安装MuMu&#xff1f;” q&a&#x1f517;&#xff1a;https://mumu.163.com/mac/faq/install-on-intel-mac.html 提…

mysql 与Redis 数据强一致方案

前言mysql与Redis能实现数据的强一致?分布式实现数据的强一致的方案是什么?mysql 与 Redis 能强一致吗?Redis 的事务不适合实现强一致那怎么办?(mysql 与Redis 有强一致方案吗?) 前言 mysql与Redis一般不会使用强一致性因为不仅设计复杂并且性能差(典型的吃力不讨好类型)…

【深度学习】PyTorch:手写数字识别

在这个技术博客中,我们将一起探索如何使用PyTorch来实现一个手写数字识别系统。这个系统将基于经典的MNIST数据集,这是一个包含60,000个训练样本和10,000个测试样本的手写数字(0-9)数据库。通过这个项目,你将了解如何使用PyTorch进行深度学习模型的构建、训练和评估。 文…

【2025最新】Poe保姆级订阅指南,Poe订阅看这一篇就够了!最方便使用各类AI!

1.Poe是什么&#xff1f; Poe, 全称Platform for Open Exploration。 Poe本身并不提供基础的大语言模型&#xff0c;而是整合多个来自不同科技巨头的基于不同模型的AI聊天机器人&#xff0c;其中包括来自OpenAI的ChatGPT&#xff0c;Anthropic的Claude、Google的PaLM&#xf…

如何在gitlab cicd中实现每月10号上午执行

在 GitLab CI/CD 中&#xff0c;可以通过设置定时触发器&#xff08;Schedules&#xff09;和脚本中的时间判断逻辑结合&#xff0c;确保任务只在每月 10 号的上午运行。 以下是实现的步骤&#xff1a; 1. 设置定时触发器 GitLab 提供了 Schedules 功能&#xff0c;可以指定每…