!!Linux系统!!
- linux 查看文件内容的命令
cat、 vi、more、less
cat -n filename 现实行号
大文件:
more 一页一页显示 space向后翻页
less 和more类似,space向后翻页,b(back)向前翻页
head -n filename 显示前n行
tail -n filename 显示后n行 - linux如何查看系统状态
查看cpu top
查看内存 free
查看进程动态 ps (process status) - Shell 快捷命令
ctrl+a 移动到当前行首home 或者 shift+home
ctrl+e 移动到当前行尾end
vi 命令
- vi如何跳转到行尾 shift+4
- vi如何跳转到行首 shift+6
- vi命令如何跳转到指定行 :100
- 跳到文本的最后一行:shift+g
- 跳到文本的第一行 先按两次 g
!!Python 开发!!
深拷贝和浅拷贝的区别
Python 中的__new__和__init__的区别
【同】
二者均是Python面向对象语言中的函数,__new__比较少用,__init__则用的比较多。
【异】
__new__是在实例创建之前被调用的,因为它的任务就是创建实例然后返回该实例对象,是个静态方法。
__init__是当实例对象创建完成后被调用的,然后设置对象属性的一些初始值,通常用在初始化一个类实例的时候。是一个实例方法。
python中 +和join的区别
在用"+"连接字符串时,结果会生成新的对象
用join时结果只是将原列表中的元素拼接起来,所以join效率比较高
线程进程区别 Python GIL
一个进程可以包含多个线程,这些线程可以共享当前进程中的内存空间 ,这种特性就出现了线程不安全的概念,即多个线程同时使用了一个空间,导致程序逻辑错误 ,常见的方式就是使用锁或信号量等机制来限制公共资源的使用 。
对于计算密集型的任务,多进程效率会更高一下;对于IO密集型的任务(比如文件操作,网络爬虫),采用多线程编程效率更高。
Python进阶:深入GIL
python处理多进程和多线程的底层原理
进程间通信
- 管道
- 信号量
- 共享内存
- 套接字(socket)
多态重载
读写锁 互斥锁
Python引入其他库,底层实现是怎么样的
!!数学基础!!
置信水平、置信区间的含义;中心极限定理;条件概率计算题目;假设检验;方差分析
最小二乘法原理
如果误差的分布是正态分布,那么最小二乘法得到的就是最有可能的值
集齐十二星座的期望
12/12+12/11+12/10+…+12/1 ≈ 37.24
集齐十二星座、十二生肖的期望
dp[i][j] = 1 + (星座多1个的概率) * dp[i+1][j]
+ (生肖多1个的概率) * dp[i][j+1]
+ (都增加的概率) * dp[i+1][j+1]
+ (都不增加的概率) * dp[i][j]
使用均匀分布随机数产生器构造任意分布的随机数产生器
一根绳子切成三段组成三角形的几率是多少
设绳长为12,分成的三段分别为x,y,12-x-y,且x>y>12-x-y,则x,x应满足以下5条关系:x+y<12, x>0, y>0, x>y, y>12-x-y,在平面直角坐标系中是以(12,0), (6,6), (4,4)为顶点的三角形区域,易求出面积等于12。
由于x>y>12-x-y,只需再满足x<6,这三段就能构成三角形。即在上述5条关系后再加上第6条:x<6,组成了以(6,3), (6,6), (4,4)为顶点的三角形区域,易求出面积等于3。
问题就解决了,构成三角形的概率是3/12=1/4
数据结构
两个很大的数据集存着url 找到两个数据集共有的url
step1:遍历文件a,对每个url求取hash(url)%1000,然后根据所取得的值将url分别存储到1000个小文件(记为a0,a1,…,a999,每个小文件约300M),为什么是1000?主要根据内存大小和要分治的文件大小来计算,我们就大致可以把320G大小分为1000份,每份大约300M(当然,到底能不能分布尽量均匀,得看hash函数的设计)
step2:遍历文件b,采取和a相同的方式将url分别存储到1000个小文件(记为b0,b1,…,b999)(为什么要这样做? 文件a的hash映射和文件b的hash映射函数要保持一致,这样的话相同的url就会保存在对应的小文件中,比如,如果a中有一个url记录data1被hash到了a99文件中,那么如果b中也有相同url,则一定被hash到了b99中)
所以现在问题转换成了:找出1000对小文件中每一对相同的url(不对应的小文件不可能有相同的url)
step3:因为每个hash大约300M,所以我们再可以采用(1)中的想法
!!机器学习!!
信息熵、KL散度、交叉熵
1、熵的定义
s
(
x
)
=
−
∑
i
P
(
x
i
)
l
o
g
P
(
x
i
)
s(x) = -\sum_{i}P(x_i)logP(x_i)
s(x)=−i∑P(xi)logP(xi)
x
x
x 指的不同的事件比如喝茶,
P
(
x
i
)
P(xi)
P(xi) 指的是某个事件发生的概率比如喝红茶的概率。对于一个一定会发生的事件,其发生概率为1,
S
(
x
)
=
−
l
o
g
(
1
)
∗
1
=
−
0
∗
1
=
0
S(x)=−log(1)∗1=−0∗1=0
S(x)=−log(1)∗1=−0∗1=0,信息量为0。
- 越不可能发生的事件信息量越大, 比如“我不会死”这句话信息量就很大。而确定事件的信息量就很低,比如“我是我妈生的”,信息量就很低甚至为0。
- 独立事件的信息量可叠加。比如“a. 张三今天喝了阿萨姆红茶,b. 李四前天喝了英式早茶”的信息量就应该恰好等于a+b的信息量,如果张三李四喝什么茶是两个独立事件。
2、KL散度——衡量两个事件/分布之间的不同
离散分布
D
K
L
(
A
∣
∣
B
)
=
∑
i
P
(
A
i
)
l
o
g
(
P
A
(
x
i
)
P
B
(
x
i
)
)
=
∑
i
P
(
A
i
)
l
o
g
(
P
A
(
x
i
)
)
−
∑
i
P
(
A
i
)
l
o
g
(
P
B
(
x
i
)
)
D_{KL}(A||B) = \sum_{i}P(A_i)log(\frac{P_A(x_i)}{P_B(x_i)}) = \sum_{i}P(A_i)log(P_A(x_i)) - \sum_{i}P(A_i)log(P_B(x_i))
DKL(A∣∣B)=i∑P(Ai)log(PB(xi)PA(xi))=i∑P(Ai)log(PA(xi))−i∑P(Ai)log(PB(xi))
连续分布
D
K
L
(
A
∣
∣
B
)
=
∫
a
(
x
i
)
l
o
g
(
a
(
x
)
b
(
x
)
)
D_{KL}(A||B) = \int a(x_i)log(\frac{a(x)}{b(x)})
DKL(A∣∣B)=∫a(xi)log(b(x)a(x))
此处我们介绍默认的计算方法:KL散度,有时候也叫KL距离,一般被用于计算两个分布之间的不同。看名字似乎跟计算两个点之间的距离也很像,但实则不然,因为KL散度不具备有对称性。在距离上的对称性指的是A到B的距离等于B到A的距离。
如果PA=PB,即两个事件分布完全相同,那么KL散度等于0。观察公式2.1,可以发现减号左边的就是事件A的熵,请记住这个发现。
3、交叉熵
H
(
A
,
B
)
=
−
∑
i
P
A
(
x
i
)
l
o
g
P
B
(
x
i
)
H(A,B) = -\sum_{i}P_A(x_i)logP_B(x_i)
H(A,B)=−i∑PA(xi)logPB(xi)
此处最重要的观察是,如果S(A)S(A)是一个常量,那么DKL(A∣∣B)=H(A,B),也就是说KL散度和交叉熵在特定条件下等价。这个发现是这篇回答的重点。
同时补充交叉熵的一些性质:
- 和KL散度相同,交叉熵也不具备对称性:H(A,B)≠H(B,A),此处不再赘述。
- 从名字上来看,Cross(交叉)主要是用于描述这是两个事件之间的相互关系,对自己求交叉熵等于熵。即 H(A,A)=S(A)H(A,A)=S(A),注意只是非负而不一定等于0。
信息增益、信息增益率、基尼指数
数据集的信息熵:
H
(
D
)
=
−
∑
k
=
1
K
∣
C
k
∣
∣
D
∣
l
o
g
2
∣
C
k
∣
∣
D
∣
H(D) = -\sum_{k = 1}^K\frac{|C_k|}{|D|}log_2\frac{|C_k|}{|D|}
H(D)=−k=1∑K∣D∣∣Ck∣log2∣D∣∣Ck∣
针对某个特征 A,对于数据集 D 的条件熵H(D|A) 为
H
(
D
∣
A
)
=
−
∑
i
=
1
n
∣
D
i
∣
∣
D
∣
H
(
D
i
)
=
−
∑
i
=
1
n
∣
D
i
∣
∣
D
∣
(
−
∑
k
=
1
K
∣
C
i
k
∣
∣
D
i
∣
l
o
g
2
∣
C
i
k
∣
∣
D
i
∣
)
H(D|A) = -\sum_{i = 1}^n\frac{|D_i|}{|D|}H(D_i)\\ = -\sum_{i = 1}^n\frac{|D_i|}{|D|}(-\sum_{k = 1}^K\frac{|C_{ik}|}{|D_i|}log_2\frac{|C_{ik}|}{|D_i|})
H(D∣A)=−i=1∑n∣D∣∣Di∣H(Di)=−i=1∑n∣D∣∣Di∣(−k=1∑K∣Di∣∣Cik∣log2∣Di∣∣Cik∣)
信息增益 = 信息熵 - 条件熵:
G
a
i
n
(
D
,
A
)
=
H
(
D
)
−
H
(
D
∣
A
)
Gain(D,A) = H(D) - H(D|A)
Gain(D,A)=H(D)−H(D∣A)
信息增益率 :
G a i n r a t i o ( D , A ) = G a i n ( D , A ) H A ( D ) , H A ( D ) = − ∑ n = 1 n ∣ D i ∣ ∣ D ∣ l o g 2 ∣ D i ∣ ∣ D ∣ Gain_{ratio}(D,A) = \frac{Gain(D,A)}{H_A(D)},\\ H_A(D) = -\sum_{n = 1}^n\frac{|D_i|}{|D|}log_2\frac{|D_i|}{|D|} Gainratio(D,A)=HA(D)Gain(D,A),HA(D)=−n=1∑n∣D∣∣Di∣log2∣D∣∣Di∣
基尼指数:
G i n i ( D ) = − ∑ k = 1 K ∣ C k ∣ ∣ D ∣ ( 1 − ∣ C k ∣ ∣ D ∣ ) = 1 − ∑ k = 1 K ( ∣ C k ∣ ∣ D ∣ ) 2 G i n i ( D ∣ A ) = − ∑ n = 1 n ∣ D i ∣ ∣ D ∣ G i n i ( D i ) Gini(D) = -\sum_{k = 1}^K\frac{|C_k|}{|D|}(1-\frac{|C_k|}{|D|})\\ = 1-\sum_{k = 1}^K(\frac{|C_k|}{|D|})^2Gini(D|A)\\ = -\sum_{n = 1}^n\frac{|D_i|}{|D|}Gini(D_i) Gini(D)=−k=1∑K∣D∣∣Ck∣(1−∣D∣∣Ck∣)=1−k=1∑K(∣D∣∣Ck∣)2Gini(D∣A)=−n=1∑n∣D∣∣Di∣Gini(Di)
当 CART 为二分类,其表达式为:
G
i
n
i
(
D
∣
A
)
=
∣
D
1
∣
∣
D
∣
G
i
n
i
(
D
1
)
+
∣
D
2
∣
∣
D
∣
G
i
n
i
(
D
2
)
Gini(D|A) = \frac{|D_1|}{|D|}Gini(D_1) + \frac{|D_2|}{|D|}Gini(D_2)
Gini(D∣A)=∣D∣∣D1∣Gini(D1)+∣D∣∣D2∣Gini(D2)
特征工程
线性回归为什么用均方差
使用平方形式的时候,使用的是“最小二乘法”的思想,这里的“二乘”指的是用平方来度量观测点与估计点的距离(远近),“最小”指的是参数值要保证各个观测点与估计点的距离的平方和达到最小。最小二乘法以估计值与观测值的平方和作为损失函数,在误差服从正态分布的前提下(这一点容易被忽视),与极大似然估计的思想在本质上是相同。也就是说不是我们特意去选择mse作为线性回归的损失函数而是因为我们假设误差服从正态分布,使用极大似然法(最大化误差项目为εi的样本总体出现的概率最大)来求解参数,进一步经过推导之后得到的mse的公式而已,具体流程见下:
如何构造特征
为什么 LR 模型要使用 sigmoid 函数,背后的数学原理是什么?
K-means聚类算法中K值如何选择?
-
数据的先验知识,或者数据进行简单分析能得到
-
基于变化的算法:即定义一个函数,随着K的改变,认为在正确的K时会产生极值。如Gap
Statistic Jump Statistic 。可以这么理解,给定一个合理的类簇指标,比如平均半径或直径,只要我们假设的类簇的数目等于或者高于真实的类簇的数目时,该指标上升会很缓慢,而一旦试图得到少于真实数目的类簇时,该指标会急剧上升 -
基于结构的算法:即比较类内距离、类间距离以确定K。这个也是最常用的办法,如使用平均轮廓系数,越趋近1聚类效果越好;如计算类内距离/类间距离,值越小越好;等。其中轮廓系数(silhouette coefficient)。结合了凝聚度和分离度。计算公式如下
其中 [公式] 向量到所有它属于的簇中其它点的距离的平均, [公式] 向量到所有非本身所在簇中其它点的距离的平均距离
-
基于一致性矩阵的算法:即认为在正确的K时,不同次聚类的结果会更加相似,以此确定K
-
基于层次聚类:即基于合并或分裂的思想,在一定情况下停止从而获得K
-
基于采样的算法:即对样本采样,分别做聚类;根据这些结果的相似性确定K。如,将样本分为训练与测试样本;对训练样本训练分类器,用于预测测试样本类别,并与聚类的类别比较
-
使用Canopy Method算法进行初始划分
GDBT模型、XGBoost和LightGBM之间的区别与联系
xgboost和lightgbm区别
1、切分算法(切分点的选取)
2、占用的内存更低,只保存特征离散化后的值,而这个值一般用8位整型存储就足够了,内存消耗可以降低为原来的1/8
2、LightGBM直接支持类别特征
4、决策树生长策略不同
XGBoost采用的是带深度限制的level-wise生长策略。level-wise过一次数据可以能够同时分裂同一层的叶子,容易进行多线程优化,不容易过拟合;但不加区分的对待同一层叶子,带来了很多没必要的开销(实际上很多叶子的分裂增益较低,没必要进行搜索和分裂)
LightGBM采用leaf-wise生长策略,每次从当前所有叶子中找到分裂增益最大(数据量最大)的一个叶子,进行分裂,如此循环;但会生长出比较深的决策树,产生过拟合(因此LightGBM在leaf-wise之上增加了一个最大深度的限制,在保证高效率的同时防止过拟合)
item2vec 和word2vec
word2vec 通过单隐层dnn,将高维稀疏的one-hot或multi-hot的特征向量转化成低维稠密的特征向量,便于机器学习模型学习,item2vec把一些序列信息类比成语句,采用同样的方式来生成低维稠密向量。广义上来说,不仅仅是传统的dnn的word2vec,其他的将高维稀疏的item向量转换成低维稠密的方法都可以叫item2vec。
word2vec的损失函数
贝叶斯超参数搜索
svm怎么解决不容易找到超平面的问题
1、软间隔、引入松弛变量
2、核函数,在高维空间中找超平面
如何解决过拟合; L1 L2的区别,batchnorm的作用
数据不均衡怎么处理
1、从数据上入手,可以做一些负采样或者过采样的操作,使得数据不平衡得到缓减。
- 对数据相对不足的类别上采样(oversampling the minority)
- 对数据相对过多的下采样(under-sampling the majority)
- SMOTE (Synthetic Minority Oversampling Technique) 对数据较少的类别人工合成样本。
SMOTE,对少数类样本 S m i n S_{min} Smin中选取每个样本x,在 S m i n S_{min} Smin中的k近邻中随机选一个样本y,在x,y的连线熵选取一点,作为新生成的样本,可以降低过拟合的风险。
2、从损失函数上入手,我们可以采用类似focal loss,对不同数据量不同的类别采用不同的权重。
Focal Loss
F
L
(
p
t
)
=
−
α
t
(
1
−
p
t
)
γ
l
o
g
(
p
t
)
FL(pt) = - \alpha _t (1-p_t)^\gamma log(p_t)
FL(pt)=−αt(1−pt)γlog(pt)
其中,通过
α
\alpha
α 来解决正负样本不平衡,通过
γ
\gamma
γ 来解决easy和hard examples的不平衡。
PR曲线会随着正负样本比例的变化而变化;但是ROC曲线不会
终于说清楚了!!
机器学习之类别不平衡问题 (1) —— 各种评估指标
机器学习之类别不平衡问题 (2) —— ROC和PR曲线
机器学习之类别不平衡问题 (3) —— 采样方法
分类为什么不用平方损失
最小化平方损失函数本质上等同于在误差服从高斯分布的假设下的极大似然估计,在分类问题下大部分时候误差并不服从高斯分布。分类问题中的标签也没有距离的含义。
梯度消失、爆炸的原因怎么解决
梯度消失,选择合适的激活函数,如果用sigmoid或者tanh函数,含容易进入梯度表现不好的区间,会引起梯度消失,可以采用relu激活函数。同时也可以采用batch norm,保持每层的输出也就是下一层的输入是一个稳定的分布,这样梯度也会保持在一个数值比较好的区间内。
如何解决模型不收敛问题 以及如何加快模型的训练速度
1、确认数据和label有没有问题。
2、确认模型有没有问题,是否模型空间太小,一直欠拟合。
3、调节学习率,学习率太大,一直震荡。
FM 是怎么学习隐向量的
Xgboost 和 GBDT的区别 以及如何改进和提升Xgboost模型
XGBoost是GBDT的工程化实现,不仅支持CART树,还支持其他的模型,添加了正则化。
XGBoost相对于普通GBDT的实现,可能具有以下的一些优势:
1)显式地将树模型的复杂度作为正则项加在优化目标公式
2)推导里用到了二阶导数信息,而普通的GBDT只用到一阶
3)允许使用column(feature) sampling来防止过拟合,借鉴了Random Forest的思想,sklearn里的gbm好像也有类似实现。
4)实现了一种分裂节点寻找的近似算法,用于加速和减小内存消耗。
5)节点分裂算法能自动利用特征的稀疏性。
6)data事先排好序并以block的形式存储,利于并行计算
7)cache-aware, out-of-core computation,这个我不太懂。。
8)支持分布式计算可以运行在MPI,YARN上,得益于底层支持容错的分布式通信框架rabit。
哪些模型可以做自动的特征选择
LR + L1 norm
GBDT
Bagging和Boosting的区别:
1)样本选择上:
Bagging:训练集是在原始集中有放回选取的,从原始集中选出的各轮训练集之间是独立的。
Boosting:每一轮的训练集不变,只是训练集中每个样例在分类器中的权重发生变化。而权值是根据上一轮的分类结果进行调整。
2)样例权重:
Bagging:使用均匀取样,每个样例的权重相等
Boosting:根据错误率不断调整样例的权值,错误率越大则权重越大。
3)预测函数:
Bagging:所有预测函数的权重相等。
Boosting:每个弱分类器都有相应的权重,对于分类误差小的分类器会有更大的权重。
4)并行计算:
Bagging:各个预测函数可以并行生成
Boosting:各个预测函数只能顺序生成,因为后一个模型参数需要前一轮模型的结果。
stacking和blending的对比分析
!!深度学习!!
卷积怎么反向传播
动态图和静态图的区别
pooling作用
- invariance(不变性),这种不变性包括translation(平移),rotation(旋转),scale(尺度)
- 保留主要的特征同时减少参数(降维,效果类似PCA)和计算量,防止过拟合,提高模型泛化能力
- 提高感受野大小
反向传播的时候怎么传递pooling的导数
mean pooling的前向传播就是把一个patch中的值求取平均来做pooling,那么反向传播的过程也就是把某个元素的梯度等分为n份分配给前一层,这样就保证池化前后的梯度(残差)之和保持不变,
max pooling也要满足梯度之和不变的原则,max pooling的前向传播是把patch中最大的值传递给后一层,而其他像素的值直接被舍弃掉。那么反向传播也就是把梯度直接传给前一层某一个像素,而其他像素不接受梯度,也就是为0。
优化器的区别Adagrad、Adam…
!!计算机网络!!
输入网址后发生什么
http的各种安全性问题
GET和POST区别
tcp报文head有什么
https怎么保证安全
9.tcp和udp的区别
答:tcp是面向连接的,udp不面向连接;tcp是一对一的,udp可以是一对一、一对多、多对一和多对多;tcp面向字节流提供服务,udp面向报文提供服务;tcp是安全的,udp不安全
10.tcp和upd的使用场景
答:tcp一般用于传输文件,对数据准确性要求比较高;udp一般用来即时通信,比如现在我和您(面试官)之间的视频连线,偶然丢一两个数据帧,有一些卡顿,还是可以接受的。
11.tcp协议和ip协议的联系
答:(没太明白面试官问的是什么,按照自己的理解回答了一波)tcp是传输层协议,ip是网络层协议,都是为报文在网络的传输提供服务。
12.http用的是tcp还是udp
答:用的是tcp,但是也有用udp的,叫httpu
13.说一下https
答:http用的是对称加密,https用的是非对称加密和对称加密,https是建立在ssl协议上的http
14.https跟http的性能上的对比
答:https多了一次非对称加密过程,所以性能上不如http