如何成为当下一个合格的算法工程师
知乎上看了SimonS大神的一个live做了一些笔记
一,Q&A部分:
1.一个特征分析的例子。。。(听不懂)
2. 还是一个机器学习的例子,(听不懂)大致,降低复杂度。
3. 传统算法合格的标准,Leetcode(简单,中等毫无压力,hard难度有一定时间思考可以解决)
4. Machine Learning算法基础,数学基础(统计学,微积分,线性代数,离散数学)
5. 数据挖掘相关的竞赛
(ACM没太大帮助,仅仅针对传统算法, 针对数据挖掘的竞赛:Kagle, KDD数据挖掘)
6. 算法工程师需要博士么?
live主只有本科学历,和基础知识。
(硕士比较有必要 因为面试结果好于本科,也就是认可度较高)
7. 高维空间xxx相关的问题(还是听不懂)
8. 基础烂的人,如何学习算法?
(花时间去补基础,锻炼自己独立学习独立解决问题的能力)
9. 数据挖掘要学spark?
Live主认为python足够。
10. 合格的算法工程师需要的数学基础?
后续另外一个部分介绍
11. 怎样练习算法?指传统的算法和数据结构
1)以模块化形式 针对训练。例如学习图轮,相对于刷图论相关的题目
学习动态规划,刷动态规划相关的题目。
(根据模块学习和训练)
2)leetcode 随机刷题。自己想方案来解决
(根据实际问题选择算法解决问题)
12. 有一定高数基础和机器学习的基础概念,如何实际训练
Kaggle 和KDD 训练,
尝试写爬虫自己挖掘数据进行研究。
13. 应用数学/统计专业如何转型算法
1)学习写代码。例如python
2)稳固统计学,并学习机器学习相关的知识。
14. 数据挖掘工程师,有必要深入研究传统算法,例如算法导论么?
还是重点关注学习,统计等算法呢?
作者认为没有必要。
传统算法(算法导论)偏向系统工程方面。
数据挖掘便向统计方面。
15. 本科生非ACMER 需要什么程度才算算法合格?
作者前面说的Leetcode初级,中级无压力。高级题花时间能研究出来。
16. 算法工程师和数据 data scientist的区别
在中小企业是不做区分的。
很大的公司中会有区别。
例如算法工程师提供更底层的模块
数据挖掘工程师更偏向于业务。
17. 算法工程师的编程能力要达到什么水平?
如果不做系统级的开发对编程能力要求并不高。
系统开发,比如分布式计算,并行计算。对编程要求就高很多。
18. 传统数据结构和算法是否对于机器学习有必要?体现在什么地方?
类比参加高考的数理化训练。训练思维的方式,思考方式和基础。
传统数据结构算法接触大量计算机的解决问题的思维。
机器学习中会用到传统数据结构算法,例如图论,动态规划。
字典树,自动机等等。
---------------------------
二,正文大纲:
如何成为当下合格的算法工程师
1. 定义算法工程师
2. 所需内功和外公
3. 不可替代性和成长性
4. 如何快速成长
5. 算法岗面经
6. 量化合格的标准
1. 什么是算法工程师:
从个大招聘网站的算法岗JD开始
主流应用:音频,视频,图,像数据挖掘,搜索
技术核心:机器学习
未来:人工智能
(live主认为机器学习未必是实现人工智能的唯一方式,
万一有人脑的API,那么机器学习热潮可能会退去)
live主分析了一份阿里的JD
涵盖了主流机器学习的应用和方向
C/C++要求。上手python java快。也能造轮子
(同时说明部门老大技术应该很牛,有可能上升的空间就较小)
分析一份百度的JD
C/C++要求,分布式计算,自然语言处理。JD描述看似简单
往往需要讲出自己非常牛的项目经历。
词云图:广告(DSP)
java/C++/Python
数学
硕士
2. 内功和外功
1)内功
统计学
线性代数
微积分
算法和数据结构
机器学习模型
特征工程
自然语言处理
分布式计算
...
2) 外功
C/C++/java
Pyton/R/Matlab
Hadoop/Hive
Spark/Mlib
/Mahout/Tensorflow/Caff
SASS/SPSS
Weka/Stat
MySQL/HBase/MongoDB
...
live主认为高效的方法是先学会如何用,然后在学习如何用好。
也就是先学习外功,再慢慢弥补内功。
如果只专注内功而忽略外功,很容易成为理论家,而不会实际应用。
数学基础:
机器学习,统计学习符号,能够看懂技术书籍上的推导证明
参考学习路线图。
(1,2,3,4,5)完成5条路线可以胜任大部分的应用。
3. 算法工程师不可代替性
1)非增删改查开发接口等体力活
2)大脑价值大于代码价值
3)技术业务两手抓,容易成为项目核心
4)行业热点,不懂技术的老板也知道大数据重要
5)如何量化不可代替性,工作交接时间长
成长性高
待遇高,5年以后薪资成长迅猛
有机会接触到更多IT大牛
大多数ACM获奖的应届生选择算法岗位
挑战性极强,工作难度大
会随着大数据热潮变得抢手
4. 如何快速成长
1)从外功入手,兼顾内功修炼
《集体智慧编程》+《统计基本方法》
所见即所得,有实际反馈。
2)这是工科,不是理科,因此需要更多实际项目的训练
LeetCode + Kaggle
需要更多练习,接近实际的练习。
leetcode训练传统算法
Kaggle数据挖掘竞赛(特征工程,大于学习模型本身的重要性)
3) 训练自己快速阅读paper的能力
ICML NIPS AAAI CVPR等
机器学习相关的期刊的名称。
比如深度学习,可以通过期刊了解到新等模型体系,可以有针对性的做一些学习。
5.算法岗面经
C/C++
1.白板编程:反转二叉树,单链表中删除特定值的节点。
2.Vector空间的增长方式,容器是否线程安全,map的时间空间复杂度,allocator原理,string内存分配。
3.父类和子类中构造函数以及析构函数调用顺序
4.引用和指针的区别,右值引用的特点以及应用场景(移动构造函数),性能提升原因
5.解释深拷贝和浅拷贝并说明应用场景 (自定义拷贝构造函数)
6.C++的优势与劣势,如何看待C++中繁多的特性
C++11 和C++14标准
算法与数据结构
1. 分治,快排思想:求第k大数(中位数)
2. 堆,优先队列:找出出现最多的top100个值
3. 动态规划:数字金字塔,求两个字符串的编辑举例,最长不下降子序列
4. 并查集:求好友圈个数,注意路径压缩优化
5. 线段树,树状数组: 区间更新和查询
6. KMP,AC自动机:海量字符串检索比较
Python
1. 数据分析:numpy,scipy,sklearn, pandas, matplotlib
2. 爬虫: requests, urllib, scrpay, beautifulsoup, selenium, 中文编码
3. 白板编程:重新实现filter, map, reduce, 反转二叉树
4. Python的优势与劣势,分析为何GIL带来影响。如何解决
如果是初入门可以看廖雪峰的博客进行学习,否则看官方文档。
统计学:
1. 量化统计模型结果好坏(准确,召回,ROC,AUC, F1-Measure)
2. 样本于理论推测的偏差:卡方检验 X^2 = sigma ((A-T)^2/T)
3. 比较两个变量波动性 变异系数 CV = sigma(x) / E(x) = STD(x) / AVG(x)
4. 正态分布N(u, keshi^2) 如何检验正态分布
阅读课本。
数据挖掘:
1. 介绍Logistics Regression, Random Forest, GBDT并分析其优缺点
2. 阐述L1和L2正则项并做比较
3. 如何解决推荐系统冷启动问题
*4. 特征工程:可用性评估,采样,无量纲化, PCA/LDA, 衍生变量
5. 各个模型的损失函,数牛顿学习法,SGD如何训练
6. 如何生产标签并构造用户画像(word2vec, kmeans, LDA, TF-IDF)
【live主认为特征工程是最重要的】
量化合格标准
语言:C++/Java/Python
能使用擅长的语言造轮子,写爬虫,数据分析和挖掘
算法和数据结构:以独立完成Leetcode为佳
(poj, zoj训练)
统计:熟悉基本统计方,法要有自己完整的统计体系。
指标分析->提出猜想->验证->结论->模型
机器学习:熟悉常见模型和特征工程方法
同样要有自己完整的特征工程体系,对模型优劣有基础认识,
以纯手工实现逻辑回归为佳
一些学习资料:
美团点评技术 - 《机器学习中的数据清洗与特征处理综述》 http://tech.meituan.com/machinelearning-data-feature-process.html
使 sklearn做特征 程 http://blog.csdn.net/xw_classmate/article/details/51331787
Max Kuhn / Kjell Johnson - Applied Predictive Modeling
Trevor Hastie / Robert Tibshirani / Jerome Friedman - Elements of Statistical Learning
本文参考文档:
https://cn.100offer.com/blog/posts/313?campaign_code=zhihu
《集体智慧编程》+《统计基本方法》
作者给出连一条路线
可以先做后端开发->边工作边学习转算法