贝叶斯方法
贝叶斯定理定理: P(H | X) = \frac{P(X | H) * P(H)}{P(X)}
其中P(H | X)可以读作x条件下p的概率。
这个公式的意义在于我们可以使用先验概率来求解后验概率。例如:
上面的例子中,买不买电脑是我们想知道的。而给出一个新的样例,我们不知道他买不买电脑,但是我知道它的年龄,收入等其他信息,现在我需要根据这些信息推断它买不买电脑也就是P( buys - computer = "yes" | age ="<=30")(小于30的人买电脑概率有多大)
朴素贝叶斯归纳方法朴素贝叶斯就是各个属性之间相互独立。有一个数据样本集,每个样本是一个n维向量X=(x1, x2, …xn)有m个类:C1, C2, …Cm;每个样本唯一的归属于一个类。
如果现在来了一个未知类别的数据X,想要求得它的分类,也就是P(H | X) H \in {C1, C2, …, C_m},可以写为P(C_j | X)
依照贝叶斯定理,可得P(C_j |X) = P(X|C_j) P(C_j ),由于P(X)是定值,所以P(X)可以省略。P( ...
51单片机结构
端口
在复位状态下,所有的sfr为0,所有的p端口为1
p0端口: 39-52脚。可以作为通用数据io端口或者地址数据复用总线。作为通用io端口时,有8个ttl的负载,在和外部负载连接时需要外接一个上拉电阻。作为地址数据复用总线时,首先输出外部存储器的低八位地址,然后变成数据总线进行数据输入输出。当作为io端口时,控制=0,因此上面的三极管输出始终为0,因此需要一个上拉电阻提供信号,当下面三极管为0时,由上拉电阻提供电压,引脚值为1。当下面三极管为1时,电路直接从上拉电阻到接地,引脚值为0,这被称为漏极开路作为地址数据端口时,控制=1,因此mux连接上面的地址数据io。当地址或数据为1时,上面的三极管输出1,当地址或数据为0时,下面的三极管有效,对外输出为0.
输入时需要先写1: 输入也就是读引脚,如果原来锁存器是0那么下面的三极管不连通,这样会有上拉电阻的干扰导致结果一定是1。因此先需要向锁存器输入1.mov a, #0ffh;mov p0, a; 向端口p0写1,共有8个输入端口ov a, p0;从p0口输入数据到a
读引脚和读锁存器是不同的通道,凡是读-修改-写(读锁存器中的 ...
缓存一致性
介绍现代计算机体系结构中往往使用多级缓存加快访存速度,往往使用多级缓存,其中1,2级缓存为每个核独享,而3级缓存往往是所有核共享。如果不同核同时对同一地址进行写,那么针对同一地址便有了不同的值,这种问题称为缓存一致性问题。
监听协议监听协议的特点为:
实现了一种广播机制来通知更改,通常使用总线
当CPU涉及全局操作时,需要在获取总线控制权之后,才可以进行更改。例如写入内存
所有处理器一直监听总线,并检测总线上的地址是否在本地中存在,如果有,则进行操作
写操作的串行化: 写操作必须在获得总线后才可进行
一个简单的监听协议中每个数据块有三种状态:
无效: 总线中的缓存在本地中不存在
共享: 当前缓存可能在其他处理器中有副本。只要发出读请求,就会进入共享状态,无论其他处理器中是否存在
独占: 当前缓存只在该处理器中存在
当接收到来自处理器的请求时,会发生如下转换:
当读写命中时:
当读写未命中时:
当总线中的请求命中时:
总的来说,当写入一块缓存时,这片缓存将会切换到独占状态,并且清除其他处理器中的缓存。当读取一块缓存时,将从其他处理器和内存中取得,并且将状态修改为共享
...
LLBP
本文为The last-level branch predictor的阅读笔记
context局部性
context: 每两个无条件分支之间的指令为一个context
pattern(模式): 该分支在不同的分支历史下会有不同的结果,每一种分支历史对应的结果称为一个模式。例如从不同位置调用某个函数时该函数内的分支可能有多种行为。如果某个历史长度下该模式提供了正确的预测,更短的历史长度便预测错误,那么称该模式为一个有用的模式。
观点:
如果某一个分支模式越多,那么他所需要的分支历史也越多
如果一个分支有多种模式,那么一个给定上下文只对部分模式有用
发现:
前十难预测分支的模式中平均分支数量为200
两个无条件分支之间平均包含3.89个条件分支。也就是说一个长度为200的分支将跨越50多个无条件分支
当上下文大小为2时,50%的分支每个上下文中包含3个有用的模式,当上下文大小为32时,95%的分支每个上下文中包含9个有用的模式。这说明我们可以将每个上下文中的模式限制在少数几个,这称为上下文局部性。
结构
RCR(rolling context register): 维护无条件 ...
Unity旋转
向量旋转首先我们需要知道旋转的角度,设为$\theta$
例如把AB旋转到AC,设$\angle XAB = \sigma$, B的坐标(x, y), C的坐标(a, b),半径为R,则
\begin{aligned}
AB =& R = \frac{x}{cos(\sigma)} = \frac{y}{sin(\sigma)}\\
AC =& R = \frac{a}{cos(\sigma + \theta)} = \frac{b}{sin(\sigma + \theta)}\\
a =& R * cos(\sigma + \theta) = R * cos(\sigma)cos(\theta) - R * sin(\sigma)sin(\theta)\\
=& \frac{x}{cos(\sigma)} cos(\sigma)cos(\theta) - \frac{y}{sin(\sigma)}sin(\sigma)sin(\theta)\\
=& x \times cos(\theta) - y \times sin(\theta)\\
b =& R * cos(\si ...
Tomasulo算法
冲突
结构冲突: 由于硬件资源争夺导致的冲突,例如同时两条指令产生访问请求,或者ICache和DCache同时对L2 Cache产生访问请求。
数据冲突: 数据冲突分为写后读冲突(RAW),写后写冲突(WAW),读后写冲突(WAR)。写后读可以认为写在读之后
控制冲突: 主要是分支指令导致的冲突
其中结构冲突和控制冲突无法避免,我们需要想办法消除数据冲突
WARADD F2, F0, F1SUB F3, F2, F4其中F2存在读后写相关RAWADD F2, F0, F1SUB F1, F3, F4其中F1存在写后读相关WAWADD F2, F0, F1SUB F2, F3, F4其中F2存在写后写相关
其中写后读相关是无法避免的,在乱序执行中必须要等待写完成才可以读,在顺序处理器中使用前推解决。而写后读相关和写后写相关在顺序处理器中是不存在的,但是在乱序处理器中可能存在问题。
例如写后写相关,本来存储器中最终保存的是SUB的数据,但是现在保存的是ADD的数据。而读后写相关调换位置就变成了写后读相关。
Tomasulo算法
大致步骤:
流水线前端的指令信息保存在指令队列中
根据指令 ...
tensorflow
本篇博客基于此。感谢龙龙老师提供的免费资料
tensorflow函数文档
下载文档
tensorflow基础数据类型
标量(Scaler): 单个实数,例如1.2,3.4等,维度为0,shape为[]
向量(Vector): 相当于数组,n个实数集合,维度为1, shape为[n]
矩阵(Matrix): n行m列。维度为2, shape为[n, m]
张量(Tensor): 所有维度大于2的都可以叫张量(其实上面的也可以是), 张量的每个维度也可以称作轴(Axis)。tf的运算时基于张量的,constant和Variable函数产生的都是张量
例如:a = tf.constant(1) #创建标量x = tf.constant([1. ,2 , 3]) #创建向量print(x)#输出为<tf.Tensor: id=165, shape=(3,), dtype=float32, numpy=array([1 , 2 , 3], type=float32)>m = tf.constant([[1, 2], [3, 4]])# ...
SQL语句速查
基础名词
数据库: 保存有组织数据的容器,一般是一个或一组文件
表: 表在数据库中,用来进行分类存储各式各样的信息。如果把数据库看为一个柜子,那么表就是一个个抽屉,里面装着一些文件。表在实际应用中可以是顾客清单,产品目录等。
列: 表是由列和行构成。例如一个城市信息表,它的列可以使地址,城市,州,邮政编码等等。
行: 行是表中的一个记录。例如一个学生信息表,一个行包含一个学生的名字、年龄、性别等信息。
主键: 是一列,这一列可以唯一的标识每一个行。例如身份证号可以唯一的标识每一个人,而姓名不可以。因此身份证号可以作为主键。
外键: 将这个表中的某一列和另外一个表中的列关联起来。如果另一个表的对应列中不存在那个数据那么这个表中就无法插入这个数据。外键不是键
注释: 有--、#、/*...*/三种,注意第一种后面要有一个空格
USE和SHOW
USE 数据库名:
使用某个数据库
SHOW DATABASES:
返回可用数据库的列表
SHOW TABLES:
展示数据库内列表的信息
SHOW COLUMNS FROM 列表名:
DESCRIBE 列表名作用与它相同
展示数 ...
RNN及其拓展
RNNRNN的特点是上一次输入会对下一次产生影响,相当于有了记忆功能,常用于自然语言处理。
这是RNN的结构图,它与传统神经网络的区别是在隐藏层有了一个循环。
这张图的含义是每一个时间点都可以有输出o,也可以没有。每一个时间点隐藏层输出作为下一个隐藏层的输入,也就是说该次训练对下一次训练会产生影响。
网上演示的时候隐藏层只有一层,这里就以一层为例。
隐藏层计算:z(h)(t)=U⋅x(t)+W⋅s(t−1) #s(t-1)是前一刻隐藏层输出s(t)=fh(z(h)(t))s(t)是隐藏层输出, fh是激活函数,一般使用tanh或LeRu。
输出层使用softmax函数进行转换,然后损失函数使用交叉熵
Lt=−∑(N, i=0)yi(t)log(oi(t))
其中yi是真实值,oi是预测值
BPTTBPTT是RNN所使用的反向传播算法。它和传统反向传播算法的区别是它还要照顾到W(前一层到这一层的权重)
大体上还是使用这四个式子
δk(t) 表示t时刻损失函数对output layer 节点的输入zk(t)的导数(也就是求上面方程中第一个式子)。
δk(t) = o(t) - 1
...
pagerank算法
基础算法pagerank算法假设不返回已经浏览过的页面。假设给定一个页面按照页面跳转到该页面下其他页面的概率为q,浏览厌烦后随机跳转到其他页面的概率为1-q
R(u) = (1-q) + q * \sum_{v \in B_u}\frac{R(v)}{N_v}其中$N_v$是v网页外链个数。1-q的含义是点击这个页面的概率,后面一部分是从其他页面跳转到这个页面的概率。
这种计算方式的问题是速度太慢,只有三个页面就要83次迭代。
矩阵求解
其中$A_{ij}$是第j个页面指向第i个页面的平均概率
假设$\vec{r}$是矩阵的特征向量,则从其他页面跳转到该页面按照$\vec{r} = qA\vec{r}$计算。
其中$\vec{r}$也就是前面式子中的R(v),A矩阵是前面式子中的$\frac{1}{N_v}$
而要获得初始概率可以使用$\vec{r} = \frac{1-q}{N}I\vec{r}$
其中I是单位矩阵,实际上也就是1-q
合并两个部分可以得到最终公式$\vec{r} = (qA + \frac{1-q}{N}I)\vec{r}$