美文网首页
58面试算法

58面试算法

作者: sunnylxs | 来源:发表于2018-10-12 15:54 被阅读0次

1.LR中的函数为什么用sigmoid,替换成别的可以吗?在训练时候注意那几点?单机下对一个大文件,如何找出top10,时间复杂度?假设有1000万个记录,去重后只有300万

答:建立一个hash表,将内存中的日志记录逐一填入该表,每个表项中包含一个key用来存放关键词,一个value用来存放该关键词出现的次数,在hash造表的过程中,每次向hash表中插入关键词的时间复杂度为O(1),因此利用hash表的方法统计出每个关键词被检索次数的时间复杂度为O(N),相比于外部排序(归并等)O(NlgN)提高了一个数量级。

更优化:建立一个TOPK数组,省略了将300万个关键词排序的操作,只需遍历一次Hash表中的这300万个关键词,然后在TOPk数组中进行局部排序即可得到TOPK关键词。

复杂度计算:遍历一遍hash表,O(N);如果从hash表中拿到一个元素小于TOPK,只需比较堆中最后一个元素,O(1);若大于,则需要排序,即便是快排,也要O(KlogK);总的:O(N)+NO(KlogK)

继续优化,遍历hash表O(N)免不了,其实对于TOPK无需排序。可以将这些关键词按照value的大小做成小顶堆,当KEY插入堆中时,就只需要一次时间复杂度为O(logk)的调整堆即可,不需要再进行排序:O(N)+NO(logK)

综上:TOPK解题思路:使用hash表进行关键词频度的统计,使用局部小顶堆的方法进行TOPK元素的查找,按照这种方法时间复杂度为:O(N)+O(N)+N‘’O(logK) N为1000万,N”为300万,K为10

2.特征选择的方法?比如预测房价,怎么选择特征?有哪些指标?

1 特征工程是什么?目的是最大限度地从原始数据中提取特征以供算法和模型使用。特征处理是特征工程的核心部分,sklearn提供了较为完整的特征处理方法,包括数据预处理,特征选择,降维等。2 数据预处理  (1)不属于同一量纲:即特征的规格不一样,不能够放在一起比较。无量纲化可以解决这一问题。常见的无量纲化方法有标准化和区间缩放法。标准化的前提是特征值服从正态分布,标准化后,其转换成标准正态分布。区间缩放法利用了边界值信息,将特征的取值区间缩放到某个特点的范围,例如[0, 1]等。标准化需要计算特征的均值和标准差(2)信息冗余:对于某些定量特征,其包含的有效信息为区间划分,例如学习成绩,假若只关心“及格”或不“及格”,那么需要将定量的考分,转换成“1”和“0”表示及格和未及格。二值化可以解决这一问题。定量特征二值化的核心在于设定一个阈值,大于阈值的赋值为1,小于等于阈值的赋值为0(3)存在缺失值:缺失值需要补充。(4)信息利用率低:不同的机器学习算法和模型对数据中信息的利用是不同的,之前提到在线性模型中,使用对定性特征哑编码可以达到非线性的效果。类似地,对定量变量多项式化,或者进行其他的转换,都能达到非线性的效果。

2.1.3 标准化与归一化的区别

  简单来说,标准化是依照特征矩阵的列处理数据,其通过求z-score的方法,将样本的特征值转换到同一量纲下。归一化是依照特征矩阵的行处理数据,其目的在于样本向量在点乘运算或其他核函数计算相似性时,拥有统一的标准,也就是说都转化为“单位向量

3 特征选择

当数据预处理完成后,我们需要选择有意义的特征输入机器学习的算法和模型进行训练。通常来说,从两个方面考虑来选择特征:

特征是否发散:如果一个特征不发散,例如方差接近于0,也就是说样本在这个特征上基本上没有差异,这个特征对于样本的区分并没有什么用。

特征与目标的相关性:这点比较显见,与目标相关性高的特征,应当优选选择。除方差法外,本文介绍的其他方法均从相关性考虑。

 根据特征选择的形式又可以将特征选择方法分为3种:

3.Filter:过滤法,按照发散性或者相关性对各个特征进行评分,设定阈值或者待选择阈值的个数,选择特征。3.1.1 方差选择法使用方差选择法,先要计算各个特征的方差,然后根据阈值,选择方差大于阈值的特征。3.1.2 相关系数法使用相关系数法,先要计算各个特征对目标值的相关系数以及相关系数的P值。3.1.3 卡方检验经典的卡方检验是检验定性自变量对定性因变量的相关性。假设自变量有N种取值,因变量有M种取值,考虑自变量等于i且因变量等于j的样本频数的观察值与期望的差距,构建统计量。不难发现,这个统计量的含义简而言之就是自变量对因变量的相关性.3.1.4 互信息法经典的互信息也是评价定性自变量对定性因变量的相关性的,

Wrapper:包装法,根据目标函数(通常是预测效果评分),每次选择若干特征,或者排除若干特征。3.2.1 递归特征消除法 递归消除特征法使用一个基模型来进行多轮训练,每轮训练后,消除若干权值系数的特征,再基于新的特征集进行下一轮训练

Embedded:嵌入法,先使用某些机器学习的算法和模型进行训练,得到各个特征的权值系数,根据系数从大到小选择特征。类似于Filter方法,但是是通过训练来确定特征的优劣。3.3.1 基于惩罚项的特征选择法 使用带惩罚项的基模型,除了筛选出特征外,同时也进行了降维。使用feature_selection库的SelectFromModel类结合带L1惩罚项的逻辑回归模型,3.3.2 基于树模型的特征选择法 树模型中GBDT也可用来作为基模型进行特征选择。使用feature_selection库的SelectFromModel类结合GBDT模型

4 降维当特征选择完成后,可以直接训练模型了,但是可能由于特征矩阵过大,导致计算量大,训练时间长的问题,因此降低特征矩阵维度也是必不可少的。常见的降维方法除了以上提到的基于L1惩罚项的模型以外,另外还有主成分分析法(PCA)和线性判别分析(LDA),线性判别分析本身也是一个分类模型。PCA和LDA有很多的相似点,其本质是要将原始的样本映射到维度更低的样本空间中,但是PCA和LDA的映射目标不一样:PCA是为了让映射后的样本具有最大的发散性;而LDA是为了让映射后的样本有最好的分类性能。所以说PCA是一种无监督的降维方法,而LDA是一种有监督的降维方法。

特征工程中数值型数据处理:对数变换和标准化

类别型数据处理:lable  0 1 2

one-hot encoding:010 100 001

3.cnn和pool的区别?都可以特征提取呀?

4.从高到低排队,新加一个人,最优的算法?用数据结构中的那个结构?时空间复杂度?

5.GDBT和xgboost的区别?传统GBDT以CART作为基分类器,xgboost还支持线性分类器,这个时候xgboost相当于带L1和L2正则化项的逻辑斯蒂回归(分类问题)或者线性回归(回归问题)。

传统GBDT在优化时只用到一阶导数信息,xgboost则对代价函数进行了二阶泰勒展开,同时用到了一阶和二阶导数。顺便提一下,xgboost工具支持自定义代价函数,只要函数可一阶和二阶求导。

xgboost在代价函数里加入了正则项,用于控制模型的复杂度。正则项里包含了树的叶子节点个数、每个叶子节点上输出的score的L2模的平方和。从Bias-variance tradeoff角度来讲,正则项降低了模型的variance,使学习出来的模型更加简单,防止过拟合,这也是xgboost优于传统GBDT的一个特性。

Shrinkage(缩减),相当于学习速率(xgboost中的eta)。xgboost在进行完一次迭代后,会将叶子节点的权重乘上该系数,主要是为了削弱每棵树的影响,让后面有更大的学习空间。实际应用中,一般把eta设置得小一点,然后迭代次数设置得大一点。(补充:传统GBDT的实现也有学习速率)

列抽样(column subsampling)即特征抽样。xgboost借鉴了随机森林的做法,支持列抽样,不仅能降低过拟合,还能减少计算,这也是xgboost异于传统gbdt的一个特性。

对缺失值的处理。对于特征的值有缺失的样本,xgboost可以自动学习出它的分裂方向。

xgboost工具支持并行

6,怎么去选取特征?

7.L1,L2的区别?dropout的作用?缺点?大论文中怎么进行参数优化的

8.lstm有那几部门单元构成?线程进程?数据库会吗?

9.数据不平衡?2.常见的解决办法

2.1 数据采样

数据采样通过对原始数据集进行处理,使各类别数据比例维持在一个合理的比例。可分为上采样下采样

(1)上采样上采样(Oversampling)是通过把少量数据类别的数据重复复制的方法使各类别数据比例维持在合理的比例,但是基于这样采样方法训练出来的模型容易出现过拟合,可以在每次生成新数据的时候加入轻微随机扰动。

(2)下采样下采样(Undersampling)是通过从多数数据类中筛选出部分数据使各类别数据比例维持在合理的比例,但是这种采样方法容易丢失关键数据,可以通过多次随机下采样来解决。

2.2 数据合成

数据合成利用已有样本的特征相似性生成更多新的样本,主要应用在小数据场景下,如医学图像分析。

2.3 加权

加权的方法是通过对不同类别分类错误施加不同权重的代价,使得不同类别的加权损失值近似相等

2.4 一分类

当正负样本比例严重失衡时,靠单纯的采样和数据合成已经并不能很好地解决问题。因为上述方法虽然解决了训练数据的正负样本比例问题,但却严重偏离了原始数据的真实分布情况,会导致模型训练结果并不能真正反映实际的情况,会有很大的偏差。

此时,可以考虑用一分类(One-class Classification)来解决。最常见的一分类方法是One-class SVM,其基本思路如下:利用高斯核函数将样本空间映射到核空间,在核空间中找到一个能够包含所有数据的一个球体,当进行判别时,如果测试数据位于这个高维球体之中,则将其归为多数类,否则就归为少数类。一分类除了可用来解决数据严重不平衡时的分类问题,还可以应用于金融医疗领域异常检测

总结来说,在样本数据量较大,且正负样本比例相差并不悬殊(两个数量级以内)的情况下,可以考虑使用采样加权的方法解决;在正负样本数据都非常之小时,可以考虑用数据合成的方法解决;在正负样本数据比例相差悬殊的情况下,可以考虑用一分类的方法解决。

linux进程间通信方式?linux命令的分类?管道?

1Byte字节=8bit位或比特

https://blog.csdn.net/gzldecsdn/article/details/79754251:

相关文章

网友评论

      本文标题:58面试算法

      本文链接:https://www.haomeiwen.com/subject/fijgaftx.html