1、自我介绍
2、你的方向是电磁为什么要报这个岗位呢
3、说一下这个比赛(2016编程之美挑战赛),你主要是负责什么的
4、写一个题吧,给你一个字符串为ip地址,例如“192.0.0.1”,把它转换成一个32位的整数。
一开始没有理解题意,以为是要将四个ip地址的数字拼起来,就问面试官这个整数可能有12个位数,是不是要用longlong存,面试官解释是将每一个数字存成八位,于是开始写
#include
#includd
using namespace std;
unsigned int Trans(string s)
{
unsigned int res = 0, temp = 0;
for(int i = 0; i < s.size(); i++)
{
if(s[i] <= '9' && s[i] >= '0')
{
temp = temp * 10 + s[i] - '0';
}
else
{
res <<= 8;
res |= temp;
temp = 0;
}
}
res <<= 8;
res |= temp;
return res;
}
int main(void)
{
string s;
cin >> s;
if(s == NULL || s.size() == 0)
{
cout << -1 <
return 0;
}
unsigned res = Trans(s);
cout << res << endl;
return 0;
}
面试官指出Trans函数没有异常处理,问如果数字大于255会有什么结果,还有为什么要先左移后与,其实先与再左移会比较好。
5、你都比较了解哪些机器学习的模型呢
比赛用过随机森林,SVM也比较了解。
那你说一下随机森林的随机都体现在什么地方呢?
主要体现在样本的抽取和建立决策树的特征选择方面,对于N个样本,M个特征,对于每一棵决策树在取样本的时候是从N个样本中有放回的取出n个来建树,同时建树的特征也是从M个特征中随机选取m个作为这棵决策树的特征,因此就避免了过拟合,体现了随机性。
那随机森林和GBDT有什么区别呢?
GBDT中每一棵树都是以上一棵树的残差作为目标值建树的,而随机森立每棵树都是相对独立的
未能答全面
随机森林既可以是分类树也可是回归树,但GBDT只能是回归树
随机森林由于树与树之间相对独立,因此可以并行生成,GBDT只有在上一棵树建立完成后才能进行下一棵树的建立
随机森林对异常值不敏感,GBDT反之
GBDT是基于权值的弱分类器的集成
随机森林是通过减少模型方差提高性能,GBDT是通过减少模型偏差提高性能
那说一下随机森林和GBDT误差函数的区别(记不太清问题了)
没答上来,待补充……
6、你知道逻辑回归么?写一下表达式
P(y = 1) = 1 / (1 + exp(theta * x))
P(y = 0) = 1 - P(y = 1)
P(y) = P(y = 1) ^ y * (1 - P(y = 1)) ^ (1 - y)
它的图是怎样的?
画了图。。。
那逻辑回归怎么对特征进行离散化,或者你都了解哪些离散化特征的方法呢?为什么?
概念不太清晰,之前看过但是问到的时候一时想不起来
连续性变量转化成离散型变量大致有两类方法:
(1)卡方检验方法;
(2)信息增益方法;
一: 卡方检验方法
1.1 分裂方法
1.2 合并方法
分裂方法,就是找到一个分裂点看,左右2个区间,在目标值上分布是否有显著差异,有显著差异就分裂,否则就忽略。这个点可以每次找差异最大的点。合并类似,先划分如果很小单元区间,按顺序合并在目标值上分布不显著的相邻区间,直到收敛。
二:信息增益方法
2.1 分裂方法
2.2 合并方法
这个和决策树的学习很类似。分裂方法,就是找到一个分裂点看,左右2个区间,看分裂前后信息增益变化阈值,如果差值超过阈值(正值,分列前-分裂后信息熵),则分裂。每次找差值最大的点做分裂点,直到收敛。合并类似,先划分如果很小单元区间,按顺序合并信息增益小于阈值的相邻区间,直到收敛。
特征组合是什么?
没答上来
7、你都知道哪些聚类的方法?
k-means,层次聚类(问还有没有别的,实在是不太清楚了)
1.k-mean聚类分析 适用于样本聚类;
2.分层聚类 适用于对变量聚类;
3.两步聚类 适用于分类变量和连续变量聚类;
4.基于密度的聚类算法;
5.基于网络的聚类;
k-means 在使用的时候,选的点的不同可能影响结果,问怎么选点?
没答上来
8、KNN的距离都有哪些,最常用的是什么?
有欧式距离、曼哈顿距离,欧氏距离较常用(答的不对,面试官反问了一下,还有别的答案)