LSTM
主题模型是什么,狄利克雷分布是什么,共轭是什么,HDP模型的原理。
KMP算法的原理,
B+树的原理(2)
堆排序的原理,
SVM的原理,SVM和LR,SVM原问题和对偶问题关系?
决策树的原理。
LR为什么用sigmoid函数。这个函数有什么优点和缺点?为什么不用其他函数?
KKT条件用哪些,完整描述
L1正则为什么可以把系数压缩成0,坐标下降法的具体实现细节
https和连接建立过程
hash冲突解决
虚函数定义
set和map底层数据结构实现,为啥用红黑树
1.LSTM的原理
1.概述
Long Short Term Memory,循环神经网络的变形结构,在普通RNN基础上,在隐藏层各神经单元中增加记忆单元,从而使时间序列上的记忆信息可控,每次在隐藏层各单元间传递时通过几个可控门(遗忘门、输入门、候选门、输出门),可以控制之前信息和当前信息的记忆和遗忘程度,从而使RNN网络具备了长期记忆功能,对于RNN的实际应用,有巨大作用。
2.优缺点
优点:比RNN具备长期记忆功能,可控记忆能力。
缺点:网络结构上比较复杂,门多,对效率有影响。于是,在此基础上,2014年,更加简化实用的结构形式GRU(gate recurrent unit)提高了效率,它把输入门和遗忘门进行了合并,把St和Ct,即记忆单元和输出单元进行了合并。
2.主题模型
LDA主题模型(隐狄利克雷分布)
是一种无监督的贝叶斯模型。
是一种主题模型,它可以将文档集中的每篇文档按照概率分布的形式给出。
是一种无监督学习,在训练时不需要手工标注的训练集,需要的是文档集和指定主题的个数。
是一种典型的词袋模型,它认为一篇文档是由一组词组成的集合,词与词之间没有顺序和先后关系。
它主要的优点就是可以对每个主题,都找出一些词来描述它。
共轭分布
当先验分布和后验分布为同一分布时,先验分布(后验分布)与似然分布为共轭分布。
3.KMP算法
https://blog.csdn.net/x__1998/article/details/79951598
4.B+树的原理
B+树是一种树数据结构,是一个n叉树,每个节点通常有多个孩子,一棵B+树包含根节点、内部节点和叶子节点。根节点可能是一个叶子节点,也可能是一个包含两个或两个以上孩子节点的节点。B+树通常用于数据库和操作系统的文件系统中。NTFS, ReiserFS, NSS, XFS, JFS, ReFS 和BFS等文件系统都在使用B+树作为元数据索引。B+树的特点是能够保持数据稳定有序,其插入与修改拥有较稳定的对数时间复杂度。B+树元素自底向上插入。
所有的叶子结点中包含了全部关键字的信息,及指向含有这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大的顺序链接。(而B 树的叶子节点并没有包括全部需要查找的信息)。所有的非终端结点可以看成是索引部分,结点中仅含有其子树根结点中最大(或最小)关键字。(而B 树的非终节点也包含需要查找的有效信息)
为什么说B+树比B 树更适合实际应用中操作系统的文件索引和数据库索引?
1.B+树的磁盘读写代价更低
B+树的内部结点并没有指向关键字具体信息的指针。因此其内部结点相对B 树更小。如果把所有同一内部结点的关键字存放在同一盘块中,那么盘块所能容纳的关键字数量也越多。一次性读入内存中的需要查找的关键字也就越多。相对来说IO读写次数也就降低了。
举个例子,假设磁盘中的一个盘块容纳16bytes,而一个关键字2bytes,一个关键字具体信息指针2bytes。一棵9阶B-tree(一个结点最多8个关键字)的内部结点需要2个盘快。而B+树内部结点只需要1个盘快。当需要把内部结点读入内存中的时候,B 树就比B+树多一次盘块查找时间(在磁盘中就是盘片旋转的时间)。
2.B+树的查询效率更加稳定
由于非终结点并不是最终指向文件内容的结点,而只是叶子结点中关键字的索引。所以任何关键字的查找必须走一条从根结点到叶子结点的路。所有关键字查询的路径长度相同,导致每一个数据的查询效率相当。
B+树和B-树的区别
性质:B+树是B-树的变体,也是一种多路搜索树
5.堆排序原理
原理
堆分为"最大堆"和"最小堆"。最大堆通常被用来进行"升序"排序,而最小堆通常被用来进行"降序"排序。
鉴于最大堆和最小堆是对称关系,理解其中一种即可。以下是最大堆进行升序排序的基本思想:
① 初始化堆:将数列a[1…n]构造成最大堆。
② 交换数据:将a[1]和a[n]交换,使a[n]是a[1…n]中的最大值;然后将a[1…n-1]重新调整为最大堆。 接着,将a[1]和a[n-1]交换,使a[n-1]是a[1…n-1]中的最大值;然后将a[1…n-2]重新调整为最大值。 依次类推,直到整个数列都是有序的。
堆排序时间复杂度
堆排序的时间复杂度是O(NlogN)。
假设被排序的数列中有N个数。遍历一趟的时间复杂度是O(N),需要遍历多少次呢?
堆排序是采用的二叉堆进行排序的,二叉堆就是一棵二叉树,它需要遍历的次数就是二叉树的深度,而根据完全二叉树的定义,它的深度至少是lg(N+1)。最多是多少呢?由于二叉堆是完全二叉树,因此,它的深度最多也不会超过lg(2N)。因此,遍历一趟的时间复杂度是O(N),而遍历次数介于lg(N+1)和lg(2N)之间;因此得出它的时间复杂度是O(NlgN)。
堆排序稳定性
堆排序是不稳定的算法,它不满足稳定算法的定义。它在交换数据的时候,是比较父结点和子节点之间的数据,所以,即便是存在两个数值相等的兄弟节点,它们的相对顺序在排序也可能发生变化。
算法稳定性 – 假设在数列中存在a[i]=a[j],若在排序之前,a[i]在a[j]前面;并且排序之后,a[i]仍然在a[j]前面。则这个排序算法是稳定的!
6.SVM与LR的比较
相同点
1.LR和SVM都是分类算法。
看到这里很多人就不会认同了,因为在很大一部分人眼里,LR是回归算法。我是非常不赞同这一点的,因为我认为判断一个算法是分类还是回归算法的唯一标准就是样本label的类型,如果label是离散的,就是分类算法,如果label是连续的,就是回归算法。很明显,LR的训练数据的label是“0或者1”,当然是分类算法。其实这样不重要啦,暂且迁就我认为他是分类算法吧,再说了,SVM也可以回归用呢。
2.如果不考虑核函数,LR和SVM都是线性分类算法,也就是说他们的分类决策面都是线性的。
这里要先说明一点,那就是LR也是可以用核函数的,至于为什么通常在SVM中运用核函数而不在LR中运用,后面讲到他们之间区别的时候会重点分析。总之,原始的LR和SVM都是线性分类器,这也是为什么通常没人问你决策树和LR什么区别,决策树和SVM什么区别,你说一个非线性分类器和一个线性分类器有什么区别?
3.LR和SVM都是监督学习算法。
4.LR和SVM都是判别模型。
判别模型会生成一个表示P(Y|X)的判别函数(或预测模型),而生成模型先计算联合概率p(Y,X)然后通过贝叶斯公式转化为条件概率。简单来说,在计算判别模型时,不会计算联合概率,而在计算生成模型时,必须先计算联合概率。或者这样理解:生成算法尝试去找到底这个数据是怎么生成的(产生的),然后再对一个信号进行分类。基于你的生成假设,那么那个类别最有可能产生这个信号,这个信号就属于那个类别。判别模型不关心数据是怎么生成的,它只关心信号之间的差别,然后用差别来简单对给定的一个信号进行分类。常见的判别模型有:KNN、SVM、LR,常见的生成模型有:朴素贝叶斯,隐马尔可夫模型。当然,这也是为什么很少有人问你朴素贝叶斯和LR以及朴素贝叶斯和SVM有什么区别(哈哈,废话是不是太多)。
不同点
1.本质上是其loss function不同。
2.支持向量机只考虑局部的边界线附近的点,而逻辑回归考虑全局(远离的点对边界线的确定也起作用)。
当你读完上面两个网址的内容,深入了解了LR和SVM的原理过后,会发现影响SVM决策面的样本点只有少数的结构支持向量,当在支持向量外添加或减少任何样本点对分类决策面没有任何影响;而在LR中,每个样本点都会影响决策面的结果。用下图进行说明:
xxx
支持向量机改变非支持向量样本并不会引起决策面的变化
逻辑回归中改变任何样本都会引起决策面的变化
因为上面的原因,得知:线性SVM不直接依赖于数据分布,分类平面不受一类点影响;LR则受所有数据点的影响,如果数据不同类别strongly unbalance,一般需要先对数据做balancing。
3.在解决非线性问题时,支持向量机采用核函数的机制,而LR通常不采用核函数的方法。
这个问题理解起来非常简单。分类模型的结果就是计算决策面,模型训练的过程就是决策面的计算过程。通过上面的第二点不同点可以了解,在计算决策面时,SVM算法里只有少数几个代表支持向量的样本参与了计算,也就是只有少数几个样本需要参与核计算(即kernal machine解的系数是稀疏的)。然而,LR算法里,每个样本点都必须参与决策面的计算过程,也就是说,假设我们在LR里也运用核函数的原理,那么每个样本点都必须参与核计算,这带来的计算复杂度是相当高的。所以,在具体应用时,LR很少运用核函数机制。
7.决策树原理
决策树算法在机器学习中算是很经典的一个算法系列了。它既可以作为分类算法,也可以作为回归算法,同时也特别适合集成学习比如随机森林。
解决过拟合问题
使用决策树模型拟合数据时,容易过拟合,解决过拟合的方法一般是对决策树进行剪枝,有两种思路,前剪枝和后剪枝
1,前剪枝
前剪枝是在构建决策树的同时进行剪枝,在构建过程中,如果无法进一步降低信息熵,就是停止创建分支,为了避免过拟合,可以设定一个阈值,当信息熵减小的数量小于这个阈值,计算还会降低熵,也要停止继续创建分支。还可以限制叶子节点样本个数,当样本个数小于设定值,则不再继续创建分支
2,后剪枝
后剪枝是在决策树构建完成后进行剪枝。剪枝的过程就是对拥有同样父节点的一组节点进行检查,判断其如果合并是否信息熵的增加量小于某一个阈值,如果小于阈值,这一组节点可以合并成一个节点。后剪枝是目前比较普遍都得做法
8.为什么LR选择Sigmoid函数?
优点:
1.数据压缩能力,将数据规约在[0,1]之间
2.导数形式优秀,方便计算
缺点:
1.容易梯度消失,x稍大的情况下就趋近一条水平线
2.非0中心化,在神经网络算法等情况下,造成反向传播时权重的全正全负的情况。
为什么要用?
答案1:logistic是基于Bernoulli(伯努利)分布的假设,也就是y|X~Bernoulli分布,而Bernoulli分布的指数族的形式就是1/(1+exp(-z))
LR只能用于处理二分类,而Sigmod对于所有的输入,得到的输出接近0或者 1
KKT条件用哪些
KKT条件是思考如何把约束优化转化为无约束优化à进而求约束条件的极值点
L1正则为什么可以把系数压缩成0
L1正则化可以实现稀疏(即截断),使训练得到的权重为0;
l1正则会产生稀疏解,即不相关的的特征对应的权重为0,就相当于降低了维度。但是l1的求解复杂度要高于l2,并且l1更为流行
正则化就是对loss进行惩罚(加了正则化项之后,使loss不可能为0,lambda越大惩罚越大–>lambda较小时,约束小,可能仍存在过拟合;太大时,使loss值集中于正则化的值上)
正则化使用方法:L1/L2/L1+L2
11.https和连接建立过程
HTTPS的作用:在传输过程中通过加密来保护数据安全的,以免用户敏感信息被第三方获取后破解。它的工作流程如下:
开始加密通信之前,客户端和服务器首先必须建立连接和交换参数,这个过程叫做握手(handshake)
1.首先客户端向服务端发送一个请求,里面主要包括:一个客户端生成的随机数(Client random),以及客户端支持的加密算法(都是对称加密算法)。
2.服务端收到请求后从中选出一组加密算法和HASH算法,并将自己的数字证书、以及一个自己生成的随机数(Server random)发送给客户端。
3.客户端收到回复后,验证证书是否有效,如果有效就生成一个随机数,然后用证书中所包含的公钥加密这个随机数生成密文,并且用服务端刚才挑选的HASH算法对这个随机数进行加密,生成的hash值称之为校验值1,然后将密文和校验值1一起发送给服务端。
4.服务端收到后,用自己的私钥解密出随机数,然后用HASH算法对这个随机数进行加密得到校验值2,如果校验值1和校验值2相同则说明消息未被篡改,可以信任。最后,使用该随机数,加上之前第2步中选择的加密算法,加密一段握手消息,发还给客户端。同时HASH值也带上。
5.客户端收到服务器端的消息后,首先检查消息是否为握手消息,然后计算HASH值是否与发回的消息一致。
6.握手结束后,客户端和服务器端使用握手阶段产生的随机数以及挑选出来的算法进行对称加解密的传输。
12.hash冲突解决办法
通过构造性能良好的哈希函数,可以减少冲突,但一般不可能完全避免冲突,因此解决冲突是哈希法的另一个关键问题。创建哈希表和查找哈希表都会遇到冲突,两种情况下解决冲突的方法应该一致。下面以创建哈希表为例,说明解决冲突的方法。常用的解决冲突方法有以下四种:
开放定址法
这种方法也称再散列法,其基本思想是:当关键字key的哈希地址p=H(key)出现冲突时,以p为基础,产生另一个哈希地址p1,如果p1仍然冲突,再以p为基础,产生另一个哈希地址p2,…,直到找出一个不冲突的哈希地址pi ,将相应元素存入其中。这种方法有一个通用的再散列函数形式:
Hi=(H(key)+di)% m i=1,2,…,n
其中H(key)为哈希函数,m 为表长,di称为增量序列。增量序列的取值方式不同,相应的再散列方式也不同。主要有以下三种:
线性探测再散列
di=1,2,3,…,m-1
这种方法的特点是:冲突发生时,顺序查看表中下一单元,直到找出一个空单元或查遍全表。
二次探测再散列
di=1,-1,22,-22,…,k2,-k2 ( k<=m/2 )
这种方法的特点是:冲突发生时,在表的左右进行跳跃式探测,比较灵活。
伪随机探测再散列
di=伪随机数序列。
再哈希法
这种方法是同时构造多个不同的哈希函数:
Hi=RH1(key) i=1,2,…,k
当哈希地址Hi=RH1(key)发生冲突时,再计算Hi=RH2(key)……,直到冲突不再产生。这种方法不易产生聚集,但增加了计算时间。
链地址法
这种方法的基本思想是将所有哈希地址为i的元素构成一个称为同义词链的单链表,并将单链表的头指针存在哈希表的第i个单元中,因而查找、插入和删除主要在同义词链中进行。链地址法适用于经常进行插入和删除的情况。
建立公共溢出区
这种方法的基本思想是:将哈希表分为基本表和溢出表两部分,凡是和基本表发生冲突的元素,一律填入溢出表。
优缺点
开放散列(open hashing)/ 拉链法(针对桶链结构)
1)优点: ①对于记录总数频繁可变的情况,处理的比较好(也就是避免了动态调整的开销) ②由于记录存储在结点中,而结点是动态分配,不会造成内存的浪费,所以尤其适合那种记录本身尺寸(size)很大的情况,因为此时指针的开销可以忽略不计了 ③删除记录时,比较方便,直接通过指针操作即可
2)缺点: ①存储的记录是随机分布在内存中的,这样在查询记录时,相比结构紧凑的数据类型(比如数组),哈希表的跳转访问会带来额外的时间开销 ②如果所有的 key-value 对是可以提前预知,并之后不会发生变化时(即不允许插入和删除),可以人为创建一个不会产生冲突的完美哈希函数(perfect hash function),此时封闭散列的性能将远高于开放散列 ③由于使用指针,记录不容易进行序列化(serialize)操作
封闭散列(closed hashing)/ 开放定址法
1)优点: ①记录更容易进行序列化(serialize)操作 ②如果记录总数可以预知,可以创建完美哈希函数,此时处理数据的效率是非常高的
2)缺点: ①存储记录的数目不能超过桶数组的长度,如果超过就需要扩容,而扩容会导致某次操作的时间成本飙升,这在实时或者交互式应用中可能会是一个严重的缺陷 ②使用探测序列,有可能其计算的时间成本过高,导致哈希表的处理性能降低 ③由于记录是存放在桶数组中的,而桶数组必然存在空槽,所以当记录本身尺寸(size)很大并且记录总数规模很大时,空槽占用的空间会导致明显的内存浪费 ④删除记录时,比较麻烦。比如需要删除记录a,记录b是在a之后插入桶数组的,但是和记录a有冲突,是通过探测序列再次跳转找到的地址,所以如果直接删除a,a的位置变为空槽,而空槽是查询记录失败的终止条件,这样会导致记录b在a的位置重新插入数据前不可见,所以不能直接删除a,而是设置删除标记。这就需要额外的空间和操作。
13.虚函数定义
1、虚函数的概念
虚函数是以virtual关键字声明的基类函数。如果在基类中将某个函数指定为virtual,并且派生类中有另外一个该函数的定义,则编译器将知道我们不想静态连接该函数。我们真正需要的是基于调用该函数的对象种类,在程序的特定位置选择调用哪一个函数。
2、定义
语法:virtual 函数返回类型 函数名(参数表) {函数体}
虚函数必须是基类的非静态成员函数,其访问权限可以是private或protected或public,在基类的类定义中定义虚函数的一般形式:
class基类名{
…
virtual 返回值类型 将要在派生类中重载的函数名(参数列表);
};
14.set和map为啥用红黑树
map,set底层都提供了排序功能,且查找速度快。红黑树实际上是AVL的一种变形,但是其比AVL(平衡二叉搜索树)具有更高的插入效率,当然查找效率会平衡二叉树稍微低一点点,毕竟平衡二叉树太完美了。但是这种查找效率的损失是非常值得的。它的操作有着良好的最坏情况运行时间,并且在实践中是高效的: 它可以在O(log n)时间内做查找,插入和删除,这里的n是树中元素的数目。
何为红黑树?
红黑树是每个节点都带有颜色属性的二叉查找树,颜色或红色或黑色。
性质1 节点是红色或黑色。
性质2 根节点是黑色。
性质3 每个叶节点(NIL节点,空节点)是黑色的。
性质4 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)
性质5 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。
这些约束的好处是:保持了树的相对平衡,同时又比AVL的插入删除操作的复杂性要低许多。