这次主要是调试Android system/bt目录下的代码,也就是蓝牙相关的代码,是源于对几个CVE(cve-2018-9355~cve-2018-9362)的学习,这几个CVE是蓝牙相关的漏洞。
蓝牙相关代码分析
因为之前对蓝牙相关代码没有了解过,所以先对AOSP中关于蓝牙的代码进行学习。首先是从Android应用层编程开始,几个基本操作:
支持向量机是一种二分类模型。它的基本模型是定义在特征空间上的间隔最大的线性分类器,支持向量机还包括核技巧,这使它成为实质上的非线性分类器。支持向量机的学习策略就是间隔最大化,可形式化为一个求解凸二次规划的问题。
支持向量机学习方法包含构建由简至繁的模型:
分类决策树模型是一种描述对实例进行分类的树形结构,决策树由结点和有向边组成,结点有两种类型:内部结点和叶结点。内部结点表示一个特征或属性,叶结点表示一个类。
用决策树分类,从根结点开始,对实例的某一特征进行测试,根据测试结果,将实例分配到其子结点;这时,每一个子结点对应着该特征的一个取值。如此递归地对实例进行测试并分配,直至达到叶结点。最后将实例分到叶结点的类中。决策树学习的目的是为了产生一个泛化能力强,即处理未见示例能力强的决策树,其基本流程遵循简单且直观的分而治之(divide-and-conquer)策略。
关于卷积神经网络的原理这篇文章先不做介绍,推荐机器视角:长文揭秘图像处理和卷积神经网络架构和卷积:如何成为一个很厉害的神经网络这两篇文章,这里记录一下PyTorch对卷积神经网络的实现。
当构建神经网络时,我们经常想把计算分配到各个layer,一些可学习参数(learnable parameter)在学习的过程中会被优化。在PyTorch中nn
包提供了计算图(computational graph)的高级抽象,nn
包定义了一系列Module
,和神经网络的layer大致相同,Module接收输入Tensor,计算输出Tensor,同时也保存中间状态,如包含可学习参数的Tensor。nn
包也定义了一系列有用的损失函数。
之前听过前向传播和反向传播,也看到项目中有这两个步骤,但是不知道具体是干什么的,在看PyTorch官方教程的时候看到一个用numpy实现的2层神经网络,里面实现了前向传播和反向传播,这里记录一下,同时也记录一下我的PyTorch学习过程。
我们需要一个函数能接受所有的输入然后预测出类别,例如在两个类的情况下,这个函数输出0或1。单位阶跃函数具有这种性质,然而它的问题在于在跳跃点上从0瞬间跳跃到1,这个瞬间跳跃过程有时很难处理。幸好另一个函数也有类似性质,且数学上更易处理,这就是sigmoid函数。
最近一直在做机器学习相关的工作,但是对机器学习的基础还没有什么太好的掌握,所以打算从头开始学习一些基本的算法,太深入的数学原理先不深究,需要用到时再补吧(说得跟真的一样)。
$k$-近邻算法,它的工作原理是:存在一个样本数据集合,也称作训练样本集,并且样本集中每个数据
都存在标签,即我们知道样本集中每个数据
与所属分类的对应关系。输入没有标签的新数据后,将新数据的每个特征与样本集中数据
对应的特征进行比较,然后算法提取样本集中特征最相似数据
的分类标签。一般来说,我们只选择样本数据集中前$k$个最相似的数据
,这就是$k$-近邻算法中$k$的出处,通常$k$是不大于20的整数。最后,选择$k$个最相似数据中出现次数最多的分类,作为新数据的分类。