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 None
return 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_space
self.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 = case
self.update_q_value(state, action, reward, next_state)
主函数
def main():
env = gym.make('CartPole-v1')
agent = RLAgent(env.action_space)
num_episodes = 1000
for episode in range(num_episodes):
state = env.reset()
done = False
while 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,明天见啦!