Q-Learning以及.NET环境下的实现

news2024/11/23 5:10:43

Q-Learning以及.NET环境下的实现

  • 写在前面
    • 机器学习
    • Q-Learning
          • 环境准备
          • 试题准备
          • 解题过程
  • 写在结尾

写在前面

看过我的文章的朋友应该都知道,我之前一直在研究视觉相关的知识,也看了一些卷积神经网络(CNN),深度学习相关的文章。但说实话,大部分知识点和例子,我都是一知半解,明白他这样做能达到什么效果,但是不知道他为什么这么做,这样肯定不行啊!所以也是借着过年的这段时间学习了一些机器学习的基础知识,其实现在大家熟悉的深度学习也属于机器学习中的一部分。

机器学习

机器学习是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。它是人工智能核心,是使计算机具有智能的根本途径。
– 摘抄自百度百科

Q-Learning

Q-Learning则是机器学习中的一个分支强化学习中的一个算法。我们今天也是窥一斑而见全豹,见一叶而知深秋,通过学习这个算法来感受一下深度学习的伟大。
这里我用我自己的理解再介绍一下强化学习,强化学习顾名思义,突出的就是一个强化,好像听起来抽象,这样一个词怎么转换成一串表达式呢?这里其实有一个很重要的概念就是反馈,通过结果去强化原因这就是反馈,听起来更抽象了吧!但其实医学实验上经常会用到这个概念,比如在小白鼠面前放置两个可以被触发的开关,第一个开关被触发会电击小白鼠,这就是负反馈。第二个开关被触发会投放食物,这就是正反馈,同时强化了老鼠对这两个开关的认识,在不断的电击和投食后,老鼠对第一个开关的负反馈达到阈值,他将永远不会再触发第一个开关,这就是我们要用代码实现的。好吧你还是很迷茫,不过不要紧,继续往下看就行。

环境准备

环境的话就是我们最熟悉的.NET换进,只要能开发控制台程序就行。

试题准备

试题也是我再网上找的范例,比较简单。
在这里插入图片描述
这张图上一共有6个房间(我们将外面5也看成一个大房间的话),我们需要用强化学习让机器人能进入房间5(也就是外面)。

解题过程
  1. 对于机器人来说,当前房间就相当于所处的环境State,他要打开门进入下一个房间Action。由此我们稍微简化一下我们的例图
    在这里插入图片描述
    因为门都是可以进出的,所以两个环境之间的箭头也是双向的。

  2. 因为我们的目标是房间5,所以我们对指向房间5的箭头要有一些正反馈,其他正常的箭头就无反馈
    在这里插入图片描述
    这里要注意一点,房间5有个指向他自己的箭头,这是为了让机器人停留在目标房间,当然你也可以用其他方式来实现,比如不停的判断机器人当前所处的房间(这样真的太low了)

  3. 下面我们就要把这张图转化成代码了,这里说实话,让我自己想我估计永远想不明白该怎么转换,但谁叫咱们都站在巨人的肩膀上呢。这里我们要这张图转换成一个二位数组
    在这里插入图片描述
    -1,代表不存在这个箭头,0表示无反馈,100表示正反馈,简单理解一下就是房间0到房间0这个箭头是没有的,房间5到房间5这个箭头的鼓励的,房间0到房间4这个箭头是无反馈的。同时这个数组我们记作R。

int[][] R = new int[6][] { 
                new int[]{ -1, -1, -1, -1, 0, -1 },
                new int[]{ -1, -1, -1, 0, -1, 100 },
                new int[]{ -1, -1, -1, 0, -1, -1 },
                new int[]{ -1, 0, 0, -1, 0, -1 },
                new int[]{ 0, -1, -1, 0, -1, 100 },
                new int[]{ -1, 0, -1, -1, 0, 100 } };
  1. 再来一个行列相等的数据,来储存机器学习的结果,我们记作Q在这里插入图片描述
static double[][] Q = new double[6][] { new double[6], new double[6], new double[6], new double[6], new double[6], new double[6] };
  1. 然后引入我们的公式在这里插入图片描述
    这里需要注意的就是两个我们可以控制的参数:
    一个就是的α学习效率,它定义了一个旧的Q值将从新的Q值哪里学到的新Q占自身的多少比重。值为0意味着代理不会学到任何东西(旧信息是重要的),值为1意味着新发现的信息是唯一重要的信息。
    一个就是γ折扣因子,它定义了未来奖励的重要性。值为0意味着只考虑短期奖励,其中1的值更重视长期奖励。
    说实话,这个公式不太好理解,我们稍微给它删减一下,保留他最核心的内容,至于这个公式是怎么推到得出的,哥们我只能说我就是个搬运工高数也忘的差不多了。
    在这里插入图片描述
		Q[state][stateNext] = myMath(R, stateNext, state);

		static double myMath(int[][] R, int newstate, int oldstate)
        {
            double y = 0.8; //学习率
            // 选出不为负数的行为
            List<int> action = new List<int>();
            for (int i = 0; i < R[newstate].Length; i++)
            {
                if (R[newstate][i] >= 0)
                {
                    action.Add(i);
                }
            }

            // 根据这些行为,获取奖励值
            List<double> actionQ = new List<double>();
            for (int i = 0; i < action.Count; i++)
            {
                actionQ.Add(Q[newstate][action[i]]);
            }

            // 获取最大值
            double max = actionQ.Max();

            // 根据这些行为计算上一个state的奖励值
            return R[oldstate][newstate] + (y * max);
        }
  1. 现在可以开始了,先将机器人随机放到一个房间作为State,然后从与他相连的房间里选一间作为Action,也就是先确实R数组中的行数,再从那一行中非负列中随机选择一行,这样我们就完成了第一步,上代码
int stateInit = random.Next(0, 6);
test(R, stateInit);

		// 进入一次运算
        static Random random = new Random();
        static int stateNext = -1;
        // 选出不为负数的行为
        static List<int> action = new List<int>();
        // 选出奖励最大的行为,可能为多个
        static List<int> actionM = new List<int>();
        static void test(int[][] R, int state)
        {
            action.Clear();
            actionM.Clear();
            for (int i = 0; i < R[state].Length; i++)
            {
                if (R[state][i] >= 0)
                {
                    action.Add(i);
                }

                if (R[state][i] == R[state].Max())
                {
                    actionM.Add(i);
                }
            }

            stateNext = action[random.Next(0, action.Count)];
            Q[state][stateNext] = myMath(R, stateNext, state);

            if (stateNext != 5)
            {
                test(R, stateNext);
            }
            else
            {
                Q[state][stateNext] = myMath(R, stateNext, state);
            }
        }
  1. 我们通过代码还原了算法,然后通过算法训练出了模型,你可以把你自己比作那个笨笨的机器人,看看在你的模型下,是否能很快去到房间5。
    在这里插入图片描述

写在结尾

最近在研究机器学习相关的知识点,后面可能还会更新一两篇文章,在这里我要说一下,我的文章虽然是原创,但这是我在看了其他大佬的文章后理解其中内容得到的一些感悟,也有一些自己的实践创新,如果有问题的话,希望大家一起探讨,天道酬勤,与君共勉。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/189344.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

强化学习之:价值学习Value-Based Learning

文章目录参考内容动作价值函数&#xff08;Action-value Function&#xff09;深度强化学习&#xff08;DQN&#xff09;学习目标&#xff08;Goal&#xff09;如何获得尽可能好的 Q∗(st,a)→Q^{*}(s_t, a) \rightarrowQ∗(st​,a)→ 用神经网络通过学习获得时间差分算法&…

cocos creater 3.x 开发笔记(踩坑总结)

1、cocos creater 3.x 花屏闪屏黑屏 1.1 花屏 排序是一个很简单的功能&#xff0c;但是最终的呈现却是根据不同平台提供的渲染能力来的。因此&#xff0c;在这里说明一下&#xff0c;如果遇到了 UI 渲染出错&#xff0c;花屏&#xff0c;闪屏等现象&#xff0c;首先要检查的就…

【安装合集】Mysql8.0安装 2023年1月31日 22点15分

1.鼠标右击【Mysql8.0】压缩包选择【解压到Mysql8.0】。 2. 鼠标右击【mysql-installer-community-8.0.17.0】选择【安装】 3. 勾选【I accept the license terms】然后点击【Next】。 4. 选择【Custom】然后点击【Next】。 5. 双击【MySQL Servers】 双击【MySQL Server】&am…

数据指标体系的建设思考(四)

这一篇主要介绍对数据指标体系的价值、数据指标管理平台的理解及数据分析的趋势解读。 一、数据指标体系价值 关于数据指标体系的价值&#xff0c;我想大多数从事数据工作的人员都可以感受得到&#xff0c;毕竟数据指标的输出可以通过可视化的方式&#xff08;如大屏、驾驶舱…

Linux 中去除 vi/vim 和 git diff 中的 ^M 问题解决办法

去除 vi/vim 和 git diff 中的 ^M 问题解决办法问题现象初步分析进一步查看问题解决Source Insightdos2unixNodpadVimsed 命令综上Reference问题现象 git diff 时发现下面的情况&#xff0c;新修改的代码之处都是携带 ^M 字符&#xff0c; 初步分析 肯定是因为 Windows 和 …

推荐5款常用的有限元分析CAE软件

正如我们之前谈到的&#xff0c;计算机辅助软件有助于进行有限元分析。但是我们如何识别好的 CAE 软件呢&#xff1f;CAE 软件必须满足以下要求才能被纳入其类别使用户能够通过图形用户界面 (GUI) 创建模拟允许在模拟中测试组件&#xff0c;同时具有可自定义的环境变量协助优化…

JAVA队列-接口

前言 说到队列,大家都不陌生,很多场景都需要使用到队列,今天我们一起学习JDK提供的队列源码 类图 Queue接口的实现类有很多 从中,我们看到几个熟悉的,BlockingQueue 阻塞队列、Deque 双端队列 Queue 官方介绍: A collection designed for holding elements prior to proce…

MORPHVOX PRO 变声器 软件 Crack

MORPHVOX PRO 变声器 变音的全新层次 在网上聊天和游戏中使你变音 它具有超高语音学习技术&#xff0c;背景取消和高音质特点&#xff0c;将变音带向全新层次。 上好的变音质量 聆听MorphVOX Pro上好的变音质量。 *变音的音频因人而异&#xff0c;但它确实是同一个说话者发出…

国内爬虫图鉴

文章目录爬虫图鉴1.三个问题2.互联网上的爬虫2.1豪哥与爬虫2.2爬虫简介2.3APP身边的爬虫2.4爬虫排名1、排名第一的是出行2、排名第二的是社交。3、排名第三的是电商。4、接下来是 O2O 和搜索引擎。5、最后再说说政府部门。3.关于爬虫的几点疑问4.爬虫的TopN爬虫图鉴 本文案例来…

【数学建模】层次分析法(AHP)-Python实现

1 前言 本文主要讲解层次分析法&#xff08;AHP&#xff09;的python实现&#xff0c;后续会跟进实例分析 2 代码实现 导入包 import numpy as np2.1 构造判断矩阵 判断矩阵一般采用专家意见法&#xff0c;也就是德尔菲法。但是比赛的时候也没有什么专家&#xff0c;大家自…

2019-arXiv-Edge Contraction Pooling for Graph Neural

2019-arXiv-Edge Contraction Pooling for Graph Neural Paper: https://arxiv.org/abs/1905.10990 Code: https://github.com/pyg-team/pytorch_geometric/tree/master/benchmark/kernel 图神经网络的边缘收缩池化 池化层可以使GNN对抽象的节点组而不是单个节点进行推理。为…

【基础篇】5 # 链表(下):写好链表代码的六个实用技巧

说明 【数据结构与算法之美】专栏学习笔记 技巧一&#xff1a;理解指针或引用的含义 指针或引用都是存储所指对象的内存地址。将某个变量赋值给指针&#xff0c;实际上就是将这个变量的地址赋值给指针。 例如&#xff1a; p —> next q&#xff1a;表示 p 结点中的 ne…

opencv——Canny边缘检测

1、Canny边缘检测流程a、使用高斯滤波器&#xff0c;以平滑图像&#xff0c;滤除噪声。b、计算图像中每个像素点的梯度强度和方向。c、应用非极大值抑制&#xff0c;以消除边缘检测带来的杂散效应。d、应用双阈值检测来确定真实的和潜在的边缘。e、通过抑制孤立的弱边缘最终完成…

webpack4和webapck5的及新特性

30.webpack——webpack5新特性&#xff08;启动、持久化缓存、资源模块、URIs、moduleIds和chunkIds、tree shaking、nodeJs的polyfill被移除、模块联邦&#xff09;_俞华的博客-CSDN博客_chunkids 1、新特性1——启动命令 webpack4启动devServer&#xff0c;用的命令是webpac…

clickhouse库通过字段分组后获取排序后每天的前N条数据

各种查资料&#xff0c;都没找到&#xff0c;建议还是多看文档 方法1 &#xff1a;简单便捷&#xff1a; order by date,count desc limit 5 by date (取每天前5条数据&#xff0c;5可以随便换) sql可以随便写&#xff1a; 统计每天学生人数&#xff0c;按降序排序&#xff…

高级Spring之jdk 和 cglib 在 Spring 中的统一

Spring 中对切点、通知、切面的抽象如下 切点&#xff1a;接口 Pointcut&#xff0c;典型实现 AspectJExpressionPointcut 通知&#xff1a;典型接口为 MethodInterceptor 代表环绕通知 切面&#xff1a;Advisor&#xff0c;包含一个 Advice 通知&#xff0c;PointcutAdvisor…

关于构建校园能源管理平台的研究进展

摘要&#xff1a;能源与发展的矛盾已成为当今世界关注的焦点&#xff0c;高等学校做为一个特定的环境&#xff0c;近年来办学规模、校园面积、师生数量急剧增长&#xff0c;对能源的消耗也大幅提高。为抑制能源不合理增长&#xff0c;实现低碳发展&#xff0c;本文通过对校园能…

Go protobuf 的简单应用

环境搭建 安装 protobuf 编译器 https://github.com/protocolbuffers/protobuf/releases 解压&#xff0c;将bin目录加入环境变量 安装 protocol-gen-go 生成器 用于生成Go代码 https://github.com/protocolbuffers/protobuf-go/releases 解压&#xff0c;将可执行文件加…

第27章 分布式缓存数据库的定义实现

1 Core.HashHelper using System.Security.Cryptography; namespace Core { /// <summary> /// 【哈希助手--类】 /// <remarks> /// 摘要&#xff1a; /// 该类通过1个指定哈希加密算法生成1个唯一性的字符串(当前安全性较强的SHA-2包括有&#xff1a;SHA-2…