KNN算法中K值对分类效果影响较为显著,一般K值较大时,对噪声比较敏感。(X)
朴素贝叶斯算法对缺失数据特别敏感,事先需要知道先验概率。
SVM算法可以解决高维问题。提高泛化性能。
集成学习算法可能存在过拟合、鲁棒性不强等问题。
KNN
K值得选取非常重要,因为:
如果当K的取值过小时,一旦有噪声得成分存在们将会对预测产生比较大影响,例如取K值为1时,一旦最近的一个点是噪声,那么就会出现偏差,K值的减小就意味着整体模型变得复杂,容易发生过拟合;
如果K的值取的过大时,就相当于用较大邻域中的训练实例进行预测,学习的近似误差会增大。这时与输入目标点较远实例也会对预测起作用,使预测发生错误。K值的增大就意味着整体的模型变得简单;
朴素贝叶斯算法
对缺失数据不太敏感,算法也比较简单,常用于文本分类。需要知道先验概率,且先验概率很多时候取决于假设,假设的模型可以有很多种,因此在某些时候会由于假设的先验模型的原因导致预测效果不佳。
贝叶斯公式
考虑两队之间的足球比赛:队0 和队 1。假设65%的比赛队0胜出、P(Y=0)=0.65。剩余的比赛队1胜出、P(Y=1)=0.35。队0获胜的比赛中只有30%在队1的主场、P(X=1|Y=0)=0.3,而队1获胜的比赛中75%是主场获胜、P(X=1|Y=1)=0.75。则队1在主场获胜的概率即P(Y=1|X=1)为:
根据贝叶斯定理:P(Y = 1|X = 1) = P(X = 1|Y =1) * P(Y = 1)/P(X = 1)
根据全概率公式:P(X =1) = P(X = 1|Y = 1) * P(Y = 1) + P(X = 1|Y = 0) * P(Y = 0) = 0.75 * 0.35 + 0.3* 0.65 = 0.4575
所以队1取胜的概率P(Y = 1|X = 1) = 0.75 * 0.35/ 0.4575 = 0.5738
队0取胜的概率P(Y = 1|X = 0) = 1 – 0.5738= 0.4262
矩阵求逆
A-1=1/|A|* A*
函数求导与极限
EM算法思想(区分贝叶斯)
假设我们想估计A和B这两个参数,在开始状态下二者都是未知的,但如果知道了A的信息就可以得到B的信息,反过来知道了B也就得到了A。可以考虑首先赋予A某种初值,以此得到B的估计值,然后从B的当前值出发,重新估计A的取值,这个过程一直持续到收敛为止,该算法是EM的算法思想。
EM算法解决这个的思路是使用启发式的迭代方法,既然我们无法直接求出模型分布参数,那么我们可以先猜想隐含数据(EM算法的E步),接着基于观察数据和猜测的隐含数据一起来极大化对数似然,求解我们的模型参数(EM算法的M步)。由于我们之前的隐藏数据是猜测的,所以此时得到的模型参数一般还不是我们想要的结果。不过没关系,我们基于当前得到的模型参数,继续猜测隐含数据(EM算法的E步),然后继续极大化对数似然,求解我们的模型参数(EM算法的M步)。以此类推,不断的迭代下去,直到模型分布参数基本无变化,算法收敛,找到合适的模型参数。
故答案是EM算法。
N-gram(unigram、bigram和trigram)
N-gram是一种简单有效的统计语言模型,通常n采用1-3之间的值,它们分别称为unigram、bigram和trigram。现有给定训练语料合计三个文档如下:
D1: John read Moby Dick
D2: Mary read a different book,
D3: She read a book by Cher
利用bigram求出句子“John read a book”的概率大约是( )
2-gram公式
P(s1,s2,s3…) = P(s1)*P(s2|s1)*P(s3|s2)…
john在文章开头的概率:P(john) = 1/3
P(read | John) = 1
P(a|read) = 2/3
P(book|a) = 1/2
P(尾巴|book) = 1/2, book出现两次,其中一次是在句子结尾处
P(“John read a book”) = 1/3 * 1 * 2/3 * 1/2 * 1/2 = 1/18 ≈ 0.06,故选择B
二项分布
二项分布
期望 np
方差 np(1-p)
标准差 1/n *(np(1-p))^1/2
置信区间
如果假设h在n=65的独立抽取样本上出现r=10个错误,真实的错误率的90%的置信区间(双侧的)是( )
决策树
ID3决策树是根据信息增益来划分属性
C4.5决策树是根据增益率来划分属性
CART决策树是根据基尼指数来划分属性
基尼指数反映了从样本集D中随机抽取两个样本,其类别标记不一致的概率,因此越小越好
机器学习损失函数
在机器学习中,下列关于各算法对应的损失函数正确的是( )
正确答案: A B C D
最小二乘-Square loss
SVM-Hinge Loss
Logistic Regression-(log-Loss)
AdaBoost-指数损失函数
类别不平衡问题
类别不平衡(class-imbanlance)就是指分类问题中不同类别的训练样本相差悬殊的情况,例如正例有900个,而反例只有100个,这个时候我们就需要进行相应的处理来平衡这个问题,下列方法正确的是( )
正确答案: A C D
在训练样本较多的类别中进行欠采样
在训练样本较多的类别中进行过采样
直接基于原数据集进行学习,对预测值进行再缩放处理(实可以用原数据进行训练,但是把反例的权重都×9)
通过对反例中的数据进行插值,来产生额外的反例
正则表达式
import re
str1 = "Python's features"
str2 = re.match( r'(.*)on(.*?) .*', str1, re.M|re.I)
print str2.group(1)
re模块实现正则的功能
re.match(正则表达式,要匹配的字符串,[匹配模式])
要匹配的字符串为str1 = "Python's features"
正则表达式r'(.*)on(.*?) .*'
r表示后面的字符串是一个普通字符串(比如\n会译为\和n,而不是换行符)
()符号包住的数据为要提取的数据,通常与.group()函数连用。
.匹配单个任意字符
*匹配前一个字符出现0次或无限次
?匹配前一个字符出现0次或1次
(.*)提取的数据为str1字符串中on左边的所有字符,即Pyth
(.*?)提取的数据为str1中on右边,空格前面,即's
.group(0)输出的是匹配正则表达式整体结果
.group(1) 列出第一个括号匹配部分,.group(2) 列出第二个括号匹配部分
求最大公约数(公因数)
def f(a, b):
if b == 0:
print a
else:
f(b, a%b)
a, b = input(“Enter two natural numbers: ”)
print f(a, b)
Python中一次读取多个值
Python 2里面读取输入的函数是raw_input(), Python 3的是input(),读入一个值后回车读取输入就退出了,想要一次读取多个输入,可以像下面这样:
a, b = raw_input().split()
输出的是字符串,要想读取的是数值,可以稍微改一下,像这样:
a, b = map(int, raw_input().split())
int可以换成其它需要的类型,左边可以是任意多个变量
还可以把读取的值存到一个列表里:
input_list = map(int, raw_input().split())
form math import sqrt 或import math +math.sqrt
python socket 套接字
sk.recv(bufsize[,flag]):接受套接字的数据。数据以字符串形式返回,bufsize指定最多可以接收的数量。flag提供有关消息的其他信息,通常可以忽略。
sk.recvfrom(bufsize[.flag]):与recv()类似,但返回值是(data,address)。其中data是包含接收数据的字符串,address是发送数据的套接字地址。
sk.getsockname():返回套接字自己的地址。通常是一个元组(ipaddr,port)
sk.connect(address):连接到address处的套接字。一般,address的格式为元组(hostname,port),如果连接出错,返回socket.error错误。
sk.listen(backlog):开始监听传入连接。backlog指定在拒绝连接之前,可以挂起的最大连接数量。
shell
是真想不出昵称啊
$$
Shell本身的PID(ProcessID)
$!
Shell最后运行的后台Process的PID
$?
最后运行的命令的结束代码(返回值)
$-
使用Set命令设定的Flag一览
$*
所有参数列表。如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。
$@
所有参数列表。如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。
$#
添加到Shell的参数个数
$0
Shell本身的文件名
$1~$n
添加到Shell的各参数值。$1是第1参数、$2是第2参数…
DNS
DNS负载均衡是通过循环复用实现的,如果发现主机名的多个地址资源记录,则可用它循环使用包含在查询应答中的主机资源记录
数据链路层
只要记住,有连接的一定要确认
数据链路层一般都提供3种基本服务,即无确认的无连接服务、有确认的无连接服务、有确认 的面向连接的服务。
(1)无确认的无连接服务 无确认的无连接服务是源机器向目的机器发送独立的帧,而目的机器对收到的帧不作确认。 如果由于线路上的噪声而造成帧丢失,数据链路层不作努力去恢复它,恢复工作留给上层去完成。 这类服务适用于误码率很低的情况,也适用于像语音之类的实时传输,实时传输情况下有时数据延误比数据损坏影响更严重。 大多数局域网在数据链路层都使用无确认的无连接服务。
(2)有确认的无连接服务 这种服务仍然不建立连接,但是所发送的每一帧都进行单独确认。 以这种方式,发送方就会知道帧是否正确地到达。如果在某个确定的时间间隔内,帧没有到达,就必须重新发此帧。
(3)有确认的面向连接的服务 采用这种服务,源机器和目的机器在传递任何数据之前,先建立一条连接。 在这条连接上所发送的每一帧都被编上号,数据链路层保证所发送的每一帧都确实已收到。 而且,它保证每帧只收到一次,所有的帧都是按正确顺序收到的。面向连接的服务为网络进程间提供了可靠地传送比特流的服务。
网络协议
STP(生成树协议)的原理是按照树的结构来构造网络拓扑,消除网络中的环路,避免由于环路的存在而造成广播风暴问题。
宽带速度
100 Mbps 是按 bit 传输的,所以需要转化为 byte 的传输速度,需要除以 8,即下载速度是 12.5Mb/s,所以需要 2 秒
哈夫曼树
哈夫曼树只是一棵最优二叉树,不一定是完全二叉树,也不一定是平衡二叉树哈夫曼树不关注树的结构,只关注带权路径长度
二叉树的根节点
依次将关键字序列7, 6, 4, 10, 8, 11插入到一棵空的平衡二叉树中,插入后的平衡二叉树的根结点为( 8 )
在这里插入图片描述
最大堆
哈希冲突
算法空间复杂度(辅助空间)
O(1) 冒泡排序
O(1) 简单选择
O(1) 直接插入
O(1) 希尔排序
O(1) 堆排序
O(n) 归并排序
O(log n)~O(n) 快速排序
基数排序:k进制的话需要k个桶
快速排序:基于递归,考虑栈空间,空间复杂度从最坏O(N)到最好O(logN)
矩阵连乘次数最小原则
快(快排)些(希尔)以O(n㏒n)的速度归(归并)队(堆)
时间复杂度
平均情况下:快(快速排序)些(希尔排序)以“nlogn”的速度归(归并排序)队(堆排序)!其它n^2
最坏情况下:快速排序n^2,其他和平均情况一样。
空间复杂度
快速排序logn
归并排序n
其它1
稳定性:快(快速排序)些(希尔排序)选(简单选择)一堆(堆排序)好友聊天!(不稳定)
参考:这个总结的很详细
待排序元素规模较小时,宜选取冒泡排序算法效率最高
1.选择排序:不稳定,时间复杂度 O(n^2)
选择排序的基本思想是对待排序的记录序列进行n-1遍的处理,第i遍处理是将L[i..n]中最小者与L[i]交换位置。这样,经过i遍处理之后,前i个记录的位置已经是正确的了。
2.插入排序:稳定,时间复杂度 O(n^2)
插入排序的基本思想是,经过i-1遍处理后,L[1..i-1]己排好序。第i遍处理仅将L[i]插入L[1..i-1]的适当位置,使得L[1..i] 又是排好序的序列。要达到这个目的,我们可以用顺序比较的方法。首先比较L[i]和L[i-1],如果L[i-1]≤ L[i],则L[1..i]已排好序,第i遍处理就结束了;否则交换L[i]与L[i-1]的位置,继续比较L[i-1]和L[i-2],直到找到某一个位置j(1≤j≤i-1),使得L[j] ≤L[j+1]时为止。图1演示了对4个元素进行插入排序的过程,共需要(a),(b),(c)三次插入。
3.冒泡排序:稳定,时间复杂度 O(n^2)
冒泡排序方法是最简单的排序方法。这种方法的基本思想是,将待排序的元素看作是竖着排列的“气泡”,较小的元素比较轻,从而要往上浮。在冒泡排序算法中我们要对这个“气泡”序列处理若干遍。所谓一遍处理,就是自底向上检查一遍这个序列,并时刻注意两个相邻的元素的顺序是否正确。如果发现两个相邻元素的顺序不对,即“轻”的元素在下面,就交换它们的位置。显然,处理一遍之后,“最轻”的元素就浮到了最高位置;处理二遍之后,“次轻”的元素就浮到了次高位置。在作第二遍处理时,由于最高位置上的元素已是“最轻”元素,所以不必检查。一般地,第i遍处理时,不必检查第i高位置以上的元素,因为经过前面i-1遍的处理,它们已正确地排好序。
4.堆排序:不稳定,时间复杂度 O(nlog n)
堆排序是一种树形选择排序,在排序过程中,将A[n]看成是完全二叉树的顺序存储结构,利用完全二叉树中双亲结点和孩子结点之间的内在关系来选择最小的元素。
5.归并排序:稳定,时间复杂度 O(nlog n)
设有两个有序(升序)序列存储在同一数组中相邻的位置上,不妨设为A[l..m],A[m+1..h],将它们归并为一个有序数列,并存储在A[l..h]。
6.快速排序:不稳定,时间复杂度 最理想 O(nlogn) 最差时间O(n^2)
快速排序是对冒泡排序的一种本质改进。它的基本思想是通过一趟扫描后,使得排序序列的长度能大幅度地减少。在冒泡排序中,一次扫描只能确保最大数值的数移到正确位置,而待排序序列的长度可能只减少1。快速排序通过一趟扫描,就能确保某个数(以它为基准点吧)的左边各数都比它小,右边各数都比它大。然后又用同样的方法处理它左右两边的数,直到基准点的左右只有一个元素为止。
根据平均时间复杂度,查找算法的快慢比较顺序
顺序查找 < 分块查找 < 二叉排序树查找 < 二分查找(等同于平衡二叉排序树的查找)< 哈希查找
排序算法
下列关于排序算法的描述错误的是(B)
在待排序的记录集中,存在多个具有相同键值的记录,若经过排序,这些记录的相对次序仍然保持不变,称这种排序为稳定排序
二叉查找树的查找效率与二叉树的树型有关,在节点太复杂时其查找效率最低
在排序算法中,希尔排序在某趟排序结束后不一定能选出一个元素放到其最终位置上。
插入排序方法可能出现这种情况:在最后一趟开始之前,所有的元素都不在其最终应在的正确位置上
递归调用
递归条件
一个含直接或间接调用本函数语句的函数被称之为递归函数,在上面的例子中能够看出,它必须满足以下两个条件:
1) 在每一次调用自己时,必须是(在某种意义上)更接近于解;
2) 必须有一个终止处理或计算的准则。
函数间接调用自己不是递归(X)
递归调用可以用队列实现(X)
递归调用可以用栈实现(对)
函数直接调用自己是递归(X)
稳定排序算法
在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的。
归并(稳定)
冒泡(稳定)
插入(稳定)
快速排序(不稳定)
从n个数里面找最大的两个数理论最少需要比较(n+ logn -2)
类似比赛晋级,两两配对比较,赢的再两两配对,最后得到冠军(最大的数),可以看成是一棵二叉树,最差情况的比较次数为(单枝树):n-1次,然后第二大的数肯定是跟冠军比较过的数字,那么很明显每一层都有一个,所以有logn-1次比较。 所以总共是n+logn-2次比较。
二叉树前中后序遍历
已知二叉树后序遍历序列是dabec,中序遍历序列debac,它的前序遍历序列是(cedba)
后序遍历就是:左右根,中序遍历就是:左根右。
1.后序遍历得C为根节点。
2.中序得C无右子树,后序得C下一个根节点为E。
3,中序DEBA得D为E的左子树,后序DAB得B为E的下一个根节点,只能为E的右子树了,中序BA得A为B的右之树。
以下哪些算法可以检测一个有向图中是否存在环( )
深度优先遍历:(广度不行)
拓扑排序
relu( sigmoid(x) ) == relu( relu( sigmoid(x) ) )
dropout类似的效果:bagging
典型的神经网络其训练流程是将输入通过网络进行正向传导,然后将误差进行反向传播,Dropout就是针对这一过程之中,随机地删除隐藏层的部分单元,保持输入输出神经元不变,接着将输入通过修改后的网络进行前向传播,然后将误差通过修改后的网络进行反向传播。
Bagging首先随机地抽取训练集(training set),以之为基础训练多个弱分类器。然后通过取平均,或者投票(voting)的方式决定最终的分类结果。因为它随机选取训练集的特点,Bagging可以一定程度上避免过拟合(overfit);
Boosting按照某种策略将训练完的模型进行优化,最后能将弱分类器组合成强分类器;
stacking类似堆叠方式的模型集合方式。
blending:利用不相交的数据集进行训练,然后累加求平均。
对于输入维度为 [N, H, W, C] 的 Tensor, Batch Normalization 在哪个(些)维度上做归一化(N,C)
使用BN层可以归一化层的输入和输出,使不同分布的输入差异的影响最小,让学习率调整得更加便捷,减少过拟合风险,加快训练速度。但使用BN后,会造成训练和预测的输出差异,这种差异在小数据量时尤为明显。
KKT条件
下列描述错误的是?(C)
函数在某点的梯度方向与取得最大方向导数的方向一致。
在等式约束条件下,约束的梯度向量与目标函数的梯度向量在最优解处一定平行。
KKT条件是强对偶成立的充要条件。
函数在某点的梯度的模为方向导数的最大值。
解释:KKT和强对偶条件应该是必要不充分关系
1*1卷积核的作用
降维
实现了跨通道的信息组合,并增加了非线性特征
使用11卷积核,实现降维和升维的操作其实就是channel间信息的线性组合变化,33,64channels的卷积核前面添加一个11,28channels的卷积核,就变成了33,28channels的卷积核,原来的64个channels就可以理解为跨通道线性组合变成了28channels,这就是通道间的信息交互。因为1*1卷积核,可以在保持feature map尺度不变的(即不损失分辨率)的前提下大幅增加非线性特性(利用后接的非线性激活函数),把网络做的很deep,增加非线性特性。
不能扩大感受野