机器学习-强化学习
强化学习 强化学习的主要任务就是通过在环境中不断地尝试,根据尝试获得的反馈信息调整策略,最终生成一个较好的策略π,机器根据这个策略便能知道在什么状态下应该执行什么动作。 我觉得比较重要的几个观点: RL is learning from trial and error interaction with the world. RL is training by rewards and punishments. 增强学习的研究建立在经典物理学的范畴上,也就是没有量子计算也没有相对论。这个世界的时间是可以分割成一个一个时间片的,并且有完全的先后顺序,因此可以形成这样的状态,动作和反馈系列。这些数据样本是进行增强学习的基础。 另一个很重要的假设就是 「上帝不掷筛子!」 在增强学习的世界,我们相信如果输入是确定的,那么输出也一定是确定的。试想一下,有一个机械臂在练习掷筛子,以掷出 6 点作为目标。但是如果无论机械臂如何调整其关节的角度及扭矩,掷出的点数永远是随机的,那么无论如何也不可能通过算法使机械臂达成目标。因此,增强学习算法要有用,就是相信在增强学习中每一次参数的调整都会对世界造成确定性的 ...
机器学习-神经网络
神经网络 在机器学习中,神经网络(neural networks)一般是指“神经网络学习”。所谓神经网络,目前用得最广泛的一个定义是“神经网络是由具有适应性的简单单元组成的广泛并行互连的网络,它的组织能够模拟生物神经系统对真实世界物体所做出的反应”。它是一种黑箱模型,解释性较差,但效果很好。目前已有一些工作尝试改善神经网络的可解释性。 这一章的内容大致如下: 神经元模型:什么是神经元模型?它的构造是怎样的?激活函数是什么?如何组建神经网络? 感知机与多层网络:感知机的构造是怎样的?感知机不能解决什么问题?多层网络是怎样的?多层前馈神经网络有什么特点? 误差逆传播算法:BP算法如何调整参数?有什么值得注意的地方?标准BP算法和累积BP算法有什么区别?如何设置隐层神经元的个数?如何处理BP神经网络的过拟合问题? 全局最小与局部极小:什么是全局最小?什么是局部极小?如何跳出局部极小? 其他常见神经网络:有哪些常见的神经网络?它们各自有什么特点?什么是竞争型学习?可塑性、稳定性、增量学习、在线学习各指什么?(没讲) 深度学习:深度学习是如何提升模型容量的?如何训练深度神经网络?怎么理解深度学 ...
机器学习-线性模型
线性模型 给定一个包含d个属性的实例 令梯度为零可以得到x=(x1;x2;...;xd)令梯度为零可以得到\mathbf{x} = (x_1;x_2;...;x_d)令梯度为零可以得到x=(x1;x2;...;xd),线性模型(linear model)的原理是学得一个可以通过属性的线性组合来进行预测的函数,也即: f(x)=w1x1+w2x2+...+wdxx+bf(x) = w_1x_1 + w_2x_2 + ... + w_dx_x + b f(x)=w1x1+w2x2+...+wdxx+b 一般写作向量形式:f(x)=wTx+bf(x) = w^Tx + bf(x)=wTx+b。其中权重向量 www和偏置项 bbb就是我们需要学习的参数。 线性模型有良好的可解释性,每个属性对应的权重可以理解为它对预测的重要性。并且建模较为简单,许多功能更为强大的非线性模型都是在线性模型的基础上引入层级结构或高维映射得到的。 线性回归 离散属性连续化 由于不同模型对数据的要求不一样,在建模之前,我们需要对数据做相应的处理。一般的线性回归模型要求属性的数据类型为连续值,故需要 ...
机器学习-KNN
KNN KNN简介 KNN的原理就是当预测一个新的值x的时候,根据它距离最近的K个点是什么类别来判断x属于哪个类别。 思路是:如果一个样本在特征空间中的k个最邻近的样本中的大多数属于某一个类别,则该样本也划分为这个类别。 KNN算法中,所选择的邻居都是已经正确分类的对象。该方法在定类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。 该算法假定所有的实例对应于N维欧式空间 A^nÂ_nA^n 中的点。通过计算一个点与其他所有点之间的距离,取出与该点最近的K个点,然后统计这K个点里面所属分类比例最大的,则这个点属于该分类。 该算法涉及3个主要因素:实例集、距离或相似的衡量、k的大小。 一个实例的最近邻是根据标准欧氏距离定义的。更精确地讲,把任意的实例x表示为下面的特征向量: <a1(x),a2(x),...,an(x)><a_1(x),a_2(x),...,a_n(x)> <a1(x),a2(x),...,an(x)> 其中 ar(x)a_r(x)ar(x) 表示实例 xxx 的第 rrr 个属性值。那么两个实例 xix_i ...
机器学习-SVM
SVM 很多摘自 https://tangshusen.me/2018/10/27/SVM/ 后期整合其他博客与学校课程PPT SVM是什么 支持向量机(英语:support vector machine,常简称为SVM,又名支持向量网络)是在分类与回归分析中分析数据的监督式学习模型与相关的学习算法。给定一组训练实例,每个训练实例被标记为属于两日函数求导并令导数个类别中的一个或另一个,SVM训练算法创建一个将新的实例分配给两个类别之一的模型,使其成为非概率二元线性分类器。SVM模型是将实例表示为空间中的点,这样映射就使得单独类别的实例被尽可能宽的明显的间隔分开。然后,将新的实例映射到同一空间,并基于它们落在间隔的哪一侧来预测所属类别。 简单点讲,SVM就是一种二类分类模型,他的基本模型是的定义在特征空间上的间隔最大的线性分类器,SVM的学习策略就是间隔最大化。 直观理解 我们先来看看下面这个图 图中有分别属于两类的一些二维数据点和三条直线。如果三条直线分别代表三个分类器的话,请问哪一个分类器比较好? 我们凭直观感受应该觉得答案是H3。首先H1不能把类别分开,这个分类器肯定是不行的 ...
机器学习-决策树
决策树 这一章的内容大致如下: 基本流程:决策树是如何决策的?决策树学习的目的是什么?如何生成一颗决策树? 划分选择:怎样选择最优划分属性?有哪些判断指标?具体是怎样运作的? 剪枝处理:为什么要剪枝?如何判断剪枝后决策树模型的泛化性能是否提升?预剪枝和后剪枝是怎样工作的?有什么优缺点? 连续与缺失值:如何把连续属性离散化?如何基于离散化后的属性进行划分?和离散属性有何不同?如何在属性值缺失的情况下选择最优划分属性?给定划分属性,如何划分缺失该属性值的样本? 多变量决策树:决策树模型的分类边界的特点是怎样的?多变量决策数是如何定义的?又是如何工作的? 基本流程 决策树(decision tree)是一种模仿人类决策的学习方法。举个例子,比方说买电脑,我们首先看看外观帅不帅气,然后再看看性能怎么样,还得看看价格如何,最终经过一系列的判断做出是否购买电脑的决策。 一棵决策树可以分成三个部分:叶节点,非叶节点,分支。叶节点对应决策结果,也即分类任务中的类别标记;非叶节点(包括根节点)对应一个判定问题(某属性=?);分支对应父节点判定问题的不同答案(可能的属性值),可 ...
机器学习-贝叶斯分类器
贝叶斯分类器 基础知识:什么是贝叶斯定理 这现实生活中的问题,大部分都是“逆概率”问题。因为生活中绝大多数决策面临的信息都是不全的,我们手中只有有限的信息。既然无法得到全面的信息,我们就只能在信息有限的情况下,尽可能做出一个好的预测。 比如天气预报说,明天降雨的概率是30%,这是什么意思呢?我们无法像计算频率概率那样,重复地把明天过上100次,然后计算出大约有30次会下雨(下雨的天数/总天数),而是只能利用有限的信息(过去天气的测量数据),用贝叶斯定理来预测出明天下雨的概率是多少。 同样的,在现实世界中,我们每个人都需要预测。想要深入分析未来、思考是否买股票、政策给自己带来哪些机遇、提出新产品构想,或者只是计划一周的饭菜。 贝叶斯定理就是为了解决这些问题而诞生的,它可以根据过去的数据来预测出未来事情发生概率。贝叶斯定理的思考方式为我们提供了有效的方法来帮助我们做决策,以便更好地预测未来的商业、金融、以及日常生活。 贝叶斯定理: P(A∣B)=P(A)P(B∣A)P(B)P(A|B)=P(A)\dfrac{P(B|A)}{P(B)} P(A∣B)=P(A)P(B)P(B∣A) 比如我经 ...
机器学习-模型评估与选择
模型评估与选择 误差 在分类任务中,通常把错分的样本数占样本总数的比例称为错误率(error rate)。比如m个样本有a个预测错了,错误率就是a/m;与错误率相对的有精度(accuracy),或者说正确率,数值上等于 1−错误率1-错误率1−错误率。 更一般地,通常会把模型输出和真实值之间的差异称为误差(error)。在训练集上的误差称为训练误差(training error)或者经验误差(empirical error)。而在新样本上的误差则称为泛化误差(generalization error)。我们希望模型的泛化误差尽可能小,但现实是,我们无法知道新样本是怎样的,所以只能尽可能地利用训练数据来最小化经验误差。 但是否经验误差小,泛化误差就一定小呢?这不是一定的,如果模型相比训练数据来说过于复杂,那就很有可能把训练数据本身的一些特点当作整个样本空间的特点,从而使得在训练数据上有很小的经验误差,但一旦面对新样本就会有很大误差,这种情况叫做过拟合(overfitting)。相对的是欠拟合(underfitting)。 欠拟合很容易避免,只要适当地增加模型复杂度(比方说增加神经网络的层 ...
机器学习-绪论
绪论 机器学习的定义 人可以通过经验学习,比方说“朝霞不出门,晚霞行千里”,就是通过经验得来的知识。获得知识后,即使在不同的地点,不同的时间,看到不同的霞,我们也能作出正确的判断。那么,机器是否也能学习并利用经验,从而对一些未出现过的情况,在不通过显式编程(人作出判断并告诉机器)的情况下也能作出正确的预测呢?答案是可以的,这就是机器学习。 对于机器来说,经验是通过数据传达的。机器学习的主要研究内容就是从数据中产生模型的算法,也即学习算法。Mitchell给出一个更为形式化的定义,假设我们用P来表示程序处理任务T时的性能,如果程序通过利用经验E提高了在任务T上的性能,则称该程序对E进行了学习。 在本书中,模型泛指所有从数据中学得的结果,在别的文献中,也有对模型和模式作出区分的,模型指学得的全局性结果(比如一棵决策树),模式指学得的局部性结果(比如一条规则)。 另一本经典教材的作者Mitchell给出了一个形式化的定义,假设: P:计算机程序在某任务类T上的性能。 T:计算机程序希望实现的任务类。 E:表示经验,即历史的数据集。 若该计算机程序通过利用经验E在任务T上获得了性能P的改善 ...
How-To-Use-Hexo Hexo建站小教程
How To Use Hexo:Hexo建站小教程 使用Hexo 安装Git Git是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理,帮助我们把本地网页上传到Github。 win版本点击此处进入Git官网下载相应版本,默认安装即可。 参考资料:《如何在windows下安装GIT》 (By 俊雨廷休) 检验是否安装成功:cmd中输入并回车 1git --version 出现git版本即为成功。 Github 如果没有,点击此处进入Github官网点击 Sign Up 注册账户。 创建git仓库 登录Github创建一个仓库 如下图所示,输入自己的项目名字,后面一定要加.github.io后缀,README初始化也要勾上。名称一定要和你的Github名字完全一样,比如你github名字叫A,那么仓库名字一定要是A.github.io。 连接Github与本地 右键单击鼠标,点击 Git Bash Here输入以下命令: 12git config --global user.name "Name"git config --gl ...
协变 (Covariant)、逆变 (Contravariant) 与抗变 (Invariant)
协变 (Covariant)、逆变 (Contravariant) 与抗变 (Invariant) 定义 我们会记起里氏替换原则,对于任意类型关系而言,子类型可以胜任父类型的任何场景。 数组情况 以数组为例,我们有Animal以及继承自Animal 的 Cat和Dag。 协变:一个List<Cat>也是一个List<Animal> 逆变:一个List<Animal>也是一个List<Cat> 以上二者均不是则为不变 如果要避免类型错误,且数组支持对其元素的读、写操作,那么只有第3个选择是安全的。List<Animal>并不是总能当作List<Cat>,因为当一个客户读取数组并期望得到一个Cat,但List<Animal>中包含的可能是个Dog。所以逆变规则是不安全的。 反之,一个List<Cat>也不能被当作一个List<Animal>。因为总是可以把一个Dog放到List<Animal>中,也就是说,我们可能尝试将Dog写入这个被当做List<Anim ...
OS课设
大水老师,老师人超级好,97 OS课设 环境配置 老师给了安装教程PPT,并不麻烦。 在apt install前,确认你的虚拟机网络可用。 关于虚拟机的网络配置,我参考了https://zhuanlan.zhihu.com/p/130984945,整个教程我也复制整理了一遍放在文末。 Linux下使用CLion进行Debug 首先打开项目:将以下两个Makefile进行Associte With File Type,定义为GNU MakeFile文件,记得定义第一行匹配模式。完成后: MakeFile.common中会报错,将如下冒号替换成空格: 然后打开具体的lab文件夹,会发现有报错,在Seetings中找到MakeFile,删掉Build target的all,选OK即可。 对于Configurations: 然后就可以打断点用debug模式运行了。 Lab1:Road Map Through Nachos 1234567891011121314151617181920212223242526272829303132333435363738394041424344 ...
Dart-Mixin是什么
Dart-Mixin是什么 Mixin 是一种在多个类层次结构中重用代码的方法。mixin是面向对象程序设计语言中的类,其他类可以访问mixin类的方法、变量而不必成为其子类。Mixin的作用就是在多个类层次结构中重用类的代码,在类中混入其他功能,来增强代码的复用能力。可以使用with关键字将多个mixins放入同一个类中,而且dart对这个数量没有作任何限制。 举例 123456789101112131415161718192021mixin TestMixin { void test() { print('test'); } int testInt = 1; void test2();}class Test with TestMixin { @override test2() { print('test2'); }}void main() { Test().test(); // test print(T ...
KalmanFilters-theory-and-demo
卡尔曼滤波:理论与实践 定义与应用场景 卡尔曼滤波(Kalman filter)是一种高效的自回归滤波器,它能在存在诸多不确定性情况的组合信息中估计动态系统的状态。对于这个滤波器,我们几乎可以下这么一个定论:只要是存在不确定信息的动态系统,卡尔曼滤波就可以对系统下一步要做什么做出有根据的推测。即便有噪声信息干扰,卡尔曼滤波通常也能很好的弄清楚究竟发生了什么,找出现象间不易察觉的相关性。因此卡尔曼滤波非常适合不断变化的系统,它的优点还有内存占用较小(只需保留前一个状态)、速度快,是实时问题和嵌入式系统的理想选择。 样例下的卡尔曼滤波推导 举个栗子:你造了一个可以在树林里四处溜达的小机器人,为了让它实现导航,机器人需要知道自己所处的位置。 也就是说,机器人有一个包含位置信息和速度信息的状态 x⃗k\vec x_kxk:x⃗k=(p⃗,v⃗)\vec x_k=(\vec p,\vec v)xk=(p,v) ,其中p代表位置,v代表速度,或者更通俗的,可以是任意描述系统状态的两个向量(当然也可以是多个) 我们的小机器人装有GPS传感器,定位精度10米。虽然一般来说这点精度够用了,但我们 ...
众智实验
众智实验 当年的众智实验 不知道从哪里翻出来的报告与源码 原本报告是md写的,不知道扔哪去了 lab1 lab2 lab3 lab4 lab5 合集
图解TCP/IP拾遗
图解TCP/IP拾遗 书中一些重点知识的摘抄与一些个人理解。 第一章 内容不多,1.7以前的都可以略读吧。 1.7传输方式分类 面向有连接与无连接,课上会讲。 电路交换与分组交换 课上也讲 电路交换:建立连接 -> 通话 -> 释放连接;在通话的全部时间内,通话的双方始终占用端到端的通信资源; 报文交换:整个报文先传送到相邻节点,全部存储下来后查找转发表,转发到下一个节点; 分组交换:把一个报文划分为几个数据段后,在其前面加上一些由必要控制信息组成的“首部(存有目的地址、源地址以及控制信息)”后,就形成了“分组”发送给路由器,路由器将这些分组数据缓存到自己的缓冲区,再转发给目标计算机。 分组交换的优点: 分组交换的问题: 分组在各路由器存储转发时需要排队,会引起一定的“时延”; 无法保证通信时端到端所需的带宽; 分组必须携带的控制信息可能成为一定的开销。 1.8地址 地址的唯一性,很好理解,我们必须通过一个地址唯一确定一个通信主体。 层次性主要解决的是性能问题,毕竟MAC地址有48位,一点一点查,就算有缓存也会导致性能不高,MAC地址与IP地址都有唯一性 ...
CSharp从入门到入门
CSharp从入门到入门 开发环境:VSCode,需要先装NET的SDK,不装的话打开一个cs文件也会提醒你装。 win64下载: https://dotnet.microsoft.com/zh-cn/download/dotnet/thank-you/sdk-6.0.401-windows-x64-installer?journey=vs-code 你的SDK会安装在这里:C:\Program Files\dotnet\sdk c#与java相似之处可能会很简略。 项目创建 我们创建一个控制台应用,可以参考 https://learn.microsoft.com/zh-cn/dotnet/core/tutorials/with-visual-studio-code?pivots=dotnet-6-0。 首先打开你的项目文件夹,控制台输入dotnet new console --framework net6.0,回车。 然后将 Program.cs 的内容替换为你的代码,比如hello world: 12345678910using System;namespace HelloWorl ...
FLutter性能优化
FLutter性能优化 准备 以 profile 模式启动应用,如果是混合 Flutter 应用,在 Flutter SDK的flutter/packages/flutter_tools/gradle/flutter.gradle 的 buildModeFor 方法中将 debug 模式改为 profile即可。 当然,如非必要,不太建议使用第二种方式 位置如图: Run > Flutter Run main.dart in Profile Mode 与调试代码可以在调试模式下检测 Bug 不同,性能问题需要在发布模式下使用真机进行检测。这是因为,相比发布模式而言,调试模式增加了很多额外的检查(比如断言),这些检查可能会耗费很多资源,而更重要的是,调试模式使用 JIT 模式运行应用,代码执行效率较低。这就使得调试模式运行的应用,无法真实反映出它的性能问题。 而另一方面,模拟器使用的指令集为 x86,而真机使用的指令集是 ARM。这两种方式的二进制代码执行行为完全不同,因此,模拟器与真机的性能差异较大,例如,针对一些 x86 指令集擅长的操作,模拟器会比真机快,而另一些操作 ...