这次是阿里云的三面(主管面),是意外给我的惊喜。本来我以为二面挂了,毕竟确实在计算机基础知识方面回答地不好,但是这一切从二面后的第三天那个下午发生了改变…
老规矩,先讲面试内容:
简历+基础+开放题
- 自我介绍:与之前二面不同的是,这次在自我介绍这一块,前辈就我的经历提了问题或者叫做感兴趣的点。一,校园助手app(本科带队做的一个院级项目)的用处?如何在地图上框定目标区域?二,公众号运营的经历(作者+编辑)+参与开源项目的成果(Datawhale组织的南瓜书项目)(研究生期间参与的)【这里打个广告:欢迎大家关注“机器学习算法工程师”公众号和Datawhale组织,干货满满】。这些都是个人经历,答案并不唯一,给大家建议就是积极参与各种类型的活动,有更丰富的体验与技能树,算是加分项吧。
- 计算机领域的一些基础术语:进程死锁,属于OS基础题,记住死锁发生的常见场景,A进程占有D资源,想申请E资源,但B进程占有E资源,想申请D资源,这就会互相僵持,也即是死锁。更深的知识点:死锁的四大必要条件(资源互斥、请求保持、不剥夺以及环路等待)、如何预防死锁、解除死锁等;NOSQL SQL,属于数据库的题,数据库现在一般分为关系型数据库和非关系式数据库,区别在于前者擅长处理结构化数据,比较精确;后者擅长处理非结构化数据,要求多变,数据类型多样,看重速度与可扩展性,适用于大数据场景。更深的知识点可以有NOSQL常用的场景?NOSQL数据库四大类型是哪些,各自的优缺点?时序数据预测,时序数据是一类按照时间顺序记录的数据,强调的是顺序性,时序数据预测更多的是根据历史记录
的数据来预测
出现某值的概率,
。这道题属于NLP领域,就我目前的知识储备,有回归模型、数模中的ARIMA模型以及马尔科夫链模型和LSTM(循环神经网络)等ML的知识可以深入。
参考资料:
死锁面试题(什么是死锁,产生死锁的原因及必要条件)
阿里P8架构师谈:NoSQL和SQL的区别,NoSQL的使用场景和选型比较
动手学深度学习之语言模型与数据集 - 开放题:
一,两个指标相关联,这道题算是概率统计的题,指标抽象地看就是变量,也就是问两个统计变量之间的相似性,一般是求皮尔逊相关系数(这是度量线性关系的统计量,数模中最常见的概念,当时怎么就忘记了,还自创了两个土办法,傅里叶转换与采样的方法),相关系数计算公式是:
这里的协方差非常重要,可以用于衡量两个变量的总体误差。计算方法如下:
参考资料:协方差、相关系数
二,如何构建一个疫情预测机器学习系统,具体流程有哪些? 这道题考察工程实践能力(综合能力),问的是机器学习工程落地的完整流程。流程为:理解需求(建模,回归/分类/聚类任务)->数据采集和清洗->特征工程->模型训练、调优->模型诊断->模型融合->上线运行。很明显,第一步需要学会数学建模的能力,也就是数学的能力;第二步,会爬虫与数据库;第三步,无监督学习的各项能力;第四步,有监督学习的各项能力;第五步,可视化以及根据实验结果分析模型、反复验证前面步骤的能力;第六步,技巧,竞赛常用的集成学习大杀器得派上,毕竟机器学习界有个No Free Lunch定理;最后一步,检验收工。其实在这一问中,前辈重点问了两个问题:1.疫情数据如何获取? 讲到疫情数据获取,我当时很自然地想到了用爬虫技术去爬取那些公开处理的数据,如官方报道的新闻,丁香医生、支付宝等,但是前辈问的更深,丁香医生这些平台又是如何获取到的信息呢?现在想来,确切真实的数据最根本的源头一定是来自于政府官方数据,而这疫情数据就是中国疾病预防中心提供的,官方数据,只要是这种在网页展示的,就可以去爬取,通过查看源码,知道该网站并没有反爬的robot协议,所以可以爬取;2.曲线相似性如何计算? 基本等价于刚才的两个指标相关联,都是问相似度的计算,这里进行下扩充,相似度的计算一般都是用距离度量的,有常见的欧式距离、曼哈顿距离以及广义的明科夫斯基距离,还有余弦距离这类只看重方向的距离(这些出发点是数学的几何学),当然还包括上面提到的皮尔逊相关系数(这个出发点是概率统计学)。不过,问题远远没有说的这么简单,前面讲的那些计算相似性的方法在时序数据拟合成的曲线(这才是前辈想问的问题)上或多或少都存在一些问题,其实查阅资料后发现这里面水很深,大家可以查看下面的资料。
参考资料:机器学习项目完整流程、一个完整机器学习项目流程总结、常用的相似度计算方法原理及实现、如何计算两条曲线的相似性?、如何判断曲线之间的相似性、离散Fréchet(弗雷歇)距离评价曲线相似度、时间序列相似性度量综述
算法题
只有一道题,不过有更明确的要求:20分钟内完成,bug-free。要更细心点。
题目:某个班级在如下分组, 分组里面有着不同的人。
group_a = []
group_b = []
group_c = []
现在需要对分组内人数进行分批
输入参数有两个,最小分批数min_batch_count, 每批最大人数batch_max_num
第一批:要求从每个组里面选出一个人。
剩下的批数:均衡从每个组里面选出。
请给出代码实现
如:
group_a = [‘a1’, ‘a2’, ‘a3’]
group_b = [‘b1’, ‘b2’]
group_c = [‘c1’, ‘c2’, ‘c3’, ‘c4’, ‘c5’]
最小分批数是:2
每批最大人数是: 3 (高优先级)
得出如下结果:
batch_list = [
[‘a1’, ‘b1’, ‘c1’],
[‘a2’, ‘b2’, ‘c2’]
[‘a3’, ‘c3’, ‘c4’]
[‘c5’]
]
我的思路非常简单,就是先按照列的顺序将所有数据排个序,把排序后的结果放到一个新的数组里,然后首先满足batch_max_num去分组,代码整理如下:
class Solution:
def divideGroup(self, group_list, batch_max_num, min_batch_count):
def rankValues():
max_len = 0
# 得到最长一行数据的长度
for i in range(len(group_list)):
max_len = max(max_len, len(group_list[i]))
for i in range(max_len):
for j in range(len(group_list)):
if i < len(group_list[j]): # 这一行的数据在当前列下还有,就按照顺序添加进去
all_list.append(group_list[j][i])
if not group_list:
return []
all_list = []
rankValues()
res = []
cur = 0
while cur + batch_max_num < len(all_list):
res.append(all_list[cur:cur + batch_max_num])
cur += batch_max_num
res.append(all_list[cur:])
return res
if __name__ == '__main__':
data = [['a1', 'a2', 'a3'],['b1', 'b2'],['c1', 'c2', 'c3', 'c4', 'c5']]
solution = Solution()
result = solution.divideGroup(data,3,2)
print(result)
结语
我对三面的感觉与前两面不同,三面更多地是前辈在带节奏来引导我思考、询问以及回答。就我现在整理的情况来看,也不是说你一定能找到最佳的答案,这是一次考验交流沟通以及专业能力的综合面试。另外,由于这是主管面,所以自身丰富的技能树也是一种打动面试官的途径,比如我爱好写作,参加过公众号运营与开源项目的经历就让前辈很感兴趣。最后想说的是,无论是什么情况,不到最后决不放弃!只要在提升自己,路就还长,找工作的过程心态平稳积极最重要。
转载:https://blog.csdn.net/gongsai20141004277/article/details/104723385