① 互联网公司最常见的算法面试题有哪些
很多人都搞不清辞职的流程方法,所以才会遇到这种尴尬的局面。
提出离职之前,应当先提出加薪申请。如果加薪通过,你继续安心干活,如果加薪申请被驳回,直接辞职信奉上,再也不要相信任何挽留的条件。
当然,你提出加薪申请的时候,千万不要流露出老子早找好下家了,不给加薪老子就炒你鱿鱼这样的表情,这对于谈判没什么帮助。多谈谈自己对公司的贡献,不要说公司之外的事情。 来自职Q用户:萝卜三人行
几乎必问排序,排序算法不下十种,不一定非要用快排,这种问题答的越多越好。 来自职Q用户:兔小灰
② 深度学习(视觉)面试中常问的知识点有哪些
一些基础算法题。包含但不仅限于大学里面ACM-ICPC竞赛中的数论、图论、数据结构、动态规划、几何数学等。不过鉴于很多面试官不是选手出身,所以你被问到的很可能是“Google面试题”、“Facebook面试题”、“国内某BATM面试题”之类的算法题,你可以以这些为关键字上网搜搜看,或者上LeetCode之类的刷题网站(ps:我没有用过)刷刷题找找感觉。
情景题。面试官可能会给你出一个情景题“在XXX情况下(此处省略100字),你有什么比较好的方案”。比如说你面试的是搜索引擎,面试官就和可能和你聊一些搜索引擎的问题;比如你面试的是在线广告竞价,他可能就会和你聊一聊一些小网站里面的小广告;又或者你去面试游戏,可能会被问怎么解决当摄像头跑到墙后面时候的问题。你这里是深度学习,可能也会被问到以后这方面的情景题吧,你要准备一下。不过其实你回答不出来也没有很大问题(如果你是校招或者刚刚转行想做这个),这方面主要考考你的逻辑思维和口头表达能力。
专业知识。深度学习这方面的专业知识。具体看公司要求了。如果他是想要找一些底子好的苗子自己培养,你这块懂不懂也没有太大关系。不过这是一个现实的社会,基本上都是要你在深度学习(视觉)方面的能力达到他们的需求的。而且我要是刚刚把你培养出来你就跳槽了那公司不就亏大了,所以现在招工基本上都要招能马上上手的。
聊聊梦想。其实你在去面试之前,HR就可能做好了背景调查,所以你可能已经是他们想要的人了。这个时候面试官可能忽略上述条件直接和你聊生活聊理想了。这个时候要切记工资是否达到了你的要求,将来是否有长足的发展,因为如果饭都吃不饱,还谈个什么理想!不过也有可能是在测试你的沟通能力。
③ 如何准备算法面试
主要介绍算法面试的一些问题、以及如何准备算法面试
!--more--
算法面试不仅仅是正确的回答问题
对于面试中遇到的大多数问题,都能有一个合理的思考路径
让大家在面对面试中的算法问题时,有一个合理的思考路径:
不代表能够“正确”回答每一个算法问题,但是合理的思考方向其实更重要,也是正确完成算法面试问题的前提
算法面试优秀不意味着技术面试优秀
技术面试优秀不意味着能够拿到Offer
算法面试的目的不是给出一个“正确”答案,
而是展示给面试官你思考问题的方式。
算法面试不是高考。
把这个过程看作是和面试官一起探讨一个问题的解决方案。
对于问题的细节和应用环境,可以和面试官沟通。
这种沟通本身很重要,它暗示着你思考问题的方式。
我们需要对一组数据进行排序
设计排序接口,标准库的设计,业务中排序算法。
排序是基础操作,很重要。
解决
快速排序算法:O(nlogn)
忽略了算法使用的基础环境。要动态选择。
(向面试官提问):这组数据有什么样的特征?
有没有可能包含有大量重复的元素?
如果有这种可能的话,三路快排是更好地选择。
普通数据:普通快速排序就行了;java语言标准库排序使用的三路快排。
是否大部分数据距离它正确的位置很近?是否近乎有序?
如果是这样的话,插入排序是更好地选择。
按照业务发生顺序,先发生先完成,几乎有序,插入排序是更好的选择。
是否数据的取值范围非常有限?比如对学生成绩排序。
如果是这样的话,计数排序是更好地选择。高考成绩取值范围有限:计数排序更好。
(向面试官提问):对排序有什么额外的要求?
是否需要稳定排序?
如果是的话,归并排序是更好地选择。
(向面试官提问):数据的存储状况是怎样的?
是否是使用链表存储的?
如果是的话,归并排序是更好地选择。
快排依赖于数组的随机存取。
(向面试官提问):数据的存储状况是怎样的?
数据的大小是否可以装载在内存里?
数据量很大,或者内存很小,不足以装载在内存里,需要使用外排序算法。
有没有可能包含有大量重复的元素?
是否大部分数据距离它正确的位置很近?是否近乎有序?
是否数据的取值范围非常有限?比如对学生成绩排序。
是否需要稳定排序?
是否是使用链表存储的?
数据的大小是否可以装载在内存里?
正确除了你能把代码编出来运行出正确的结果。正确还包含对问题的独到见解;优化;代码规范;容错性;
o 不仅仅是给出解决算法问题的代码,还要把上面因素包括。
o 如果是非常难的问题,对你的竞争对手来说,也是难的。
关键在于你所表达出的解决问题的思路。
甚至通过表达解题思路的方向,得出结论:这个问题的解决方案,应该在哪一个领域,我可以通过查阅或者进一步学习解决问题。
算法面试只是面试的一部分
算法面试只是技术面试的一部分。
根据你的简历和应聘职位的不同,势必要考察其他技术方面。
项目经历和项目中遇到的实际问题
o 解决能力,是否参与
o 深入思考
o 技术态度
面试前梳理自己简历上所写到的项目:整理一下可能会问到的。
你遇到的印象最深的bug是什么?
面向对象
设计模式
网络相关;安全相关;内存相关;并发相关;…
系统设计;scalability(大规模)
技术面试只是面试的一部分。面试不仅仅是考察你的技术水平,还是了解你的过去以及形成的思考行为方式。
关于过去:参与项目至关重要
工作人士
研究生
本科生
o 毕业设计
o 其他课程设计(大作业)
实习
创建自己的项目
o 自己做小应用:计划表;备忘录;播放器…
o 自己解决小问题:爬虫;数据分析;词频统计...
o “不是项目”的项目:一本优秀的技术书籍的代码整理等…(github)
o 分享:自己的技术博客;github等等
通过过去了解你的思考行为方式:
遇到的最大的挑战?
犯过的错误?
遭遇的失败?
最享受的工作内容?
遇到冲突的处理方式?
做的最与众不同的事儿?
具体阐述:我在某某项目中遇到一个怎样的算法问题:这个问题是怎样的。它是我遇到的最大的挑战,我是如何克服解决的。
整个小组的大概运行模式是怎样的?
整个项目的后续规划是如何的?
这个产品中的某个问题是如何解决的?
为什么会选择某些技术?标准?
我对某个技术很感兴趣,在你的小组中我会有怎样的机会深入这种技术?
算法面试仍然是非常重要的一部分
如何准备算法面试
准备面试和准备算法面试是两个概念
算法面试,只是面试中的一个环节。
远远不需要啃完一本《算法导论》
o 强调理论证明
o 第一遍读不需要弄懂证明
o 前几遍阅读应该记住结论就行了,不需要弄懂证明。把更多的精力放在算法思想上。
针对算法面试,算法导论里面的理论推导和证明不是很重要的方面。
选择合适的oj
leetcode
o Online Portal for IT Interview
o 真实的面试问题
o http://www.leetcode.com
HankeRank
o 特点是对于问题的分类很详细。偏难,不过可以对某一类细分问题解决。
o http://www.hackerrank.com
在学习和实践做题之间,要掌握平衡
基础算法实现与算法思想
如何回答算法面试问题
注意题目中的条件
o 给定一个有序数组...(二分法)
有一些题目中的条件本质是暗示
o 设计一个O(nlogn)的算法(分治:在一颗搜索树中完成任务,对于数据排序)
o 无需考虑额外的空间(用空间换时间上的优化)
o 数据规模大概是10000(O(n^2)就可以)
当没有思路的时候
自己给自己几个简单的测试用例,试验一下
不要忽视暴力解法。暴力解法通常是思考的起点。
例子
LeetCode 3 LongestSubstringWithout Repeating Characters
在一个字符串中寻找没有重复字母的最长子串
如”abcabcbb”,则结果为”abc”
如”bbbbb”,则结果为”b”
对于字符串s的子串s[i...j]
使用O(n^2)的算法遍历i,j,可以得到所有的子串s[i...j]
使用O(length(s[i...j]))的算法判断s[i...j]中是否含有重复字母
三重循环:复杂度O(n^3),对于n=100的数据,可行
遍历常见的算法思路
遍历常见的数据结构
空间和时间的交换(哈希表)
预处理信息(排序)
在瓶颈处寻找答案:O(nlogn)+ O(n^2); O(n^3)
o O(n^2)能否优化。
什么样的问题使用什么样的思路和数据结构。
极端条件的判断
o 数组为空?
o 字符串为空?
o 数量为0?
o 指针为NULL?
代码规范:
o 变量名
o 模块化
o 复用性
④ 数据分析常见面试题有哪些
1、如何理解过拟合?
过拟合和欠拟合一样,都是数据挖掘的基本概念。过拟合指的就是数据训练得太好,在实际的测试环境中可能会产生错误,所以适当的剪枝对数据挖掘算法来说也是很重要的。
欠拟合则是指机器学习得不充分,数据样本太少,不足以让机器形成自我认知。
2、为什么说朴素贝叶斯是“朴素”的?
朴素贝叶斯是一种简单但极为强大的预测建模算法。之所以称为朴素贝叶斯,是因为它假设每个输入变量是独立的。这是一个强硬的假设,实际情况并不一定,但是这项技术对于绝大部分的复杂问题仍然非常有效。
3、SVM 最重要的思想是什么?
SVM 计算的过程就是帮我们找到超平面的过程,它有个核心的概念叫:分类间隔。SVM 的目标就是找出所有分类间隔中最大的那个值对应的超平面。在数学上,这是一个凸优化问题。同样我们根据数据是否线性可分,把 SVM 分成硬间隔 SVM、软间隔 SVM 和非线性 SVM。
4、K-Means 和 KNN 算法的区别是什么?
首先,这两个算法解决的是数据挖掘中的两类问题。K-Means 是聚类算法,KNN 是分类算法。其次,这两个算法分别是两种不同的学习方式。K-Means 是非监督学习,也就是不需要事先给出分类标签,而 KNN 是有监督学习,需要我们给出训练数据的分类标识。最后,K 值的含义不同。K-Means 中的 K 值代表 K 类。KNN 中的 K 值代表 K 个最接近的邻居。
⑤ 做图像类算法面试的时候会不会面试数学
我在《再谈逗我是怎么招程序员地》中比较保守地说过,逗问难的算法题并没有错,错的很多面试官只是在肤浅甚至错误地理解着面试算法题的目的。地,今天,我想加强一下这个观点——我反对纯算法题面试!(注意,我说的是纯算法题)图片源Wikipedia(点击图片查看词条)我再次引用我以前的一个观点——能解算法题并不意味着这个人就有能力就能在工作中解决问题,你可以想想,小学奥数题可能比这些题更难,但并不意味着那些奥数能手就能解决实际问题。好了,让我们来看一个示例(这个示例是昨天在微博上的一个讨论),这个题是——逗找出无序数组中第2大的数地,几乎所有的人都用了O(n)的算法,我相信对于我们这些应试教育出来的人来说,不用排序用O(n)算法是很正常的事,连我都不由自主地认为O(n)算法是这个题的标准答案。我们太习惯于标准答案了,这是我国教育最悲哀的地方。(广义的洗脑就是让你的意识依赖于某个标准答案,然后通过给你标准答案让你不会思考而控制你)功能性需求分析试想,如果我们在实际工作中得到这样一个题 我们会怎么做看我一定会分析这个需求,因为我害怕需求未来会改变,今天你叫我找一个第2大的数,明天你找我找一个第4大的数,后天叫我找一个第100大的数,我不搞死了。需求变化是很正常的事。分析完这个需求后,我会很自然地去写找第K大数的算法——难度一下子就增大了。很多人会以为找第K大的需求是一种逗过早扩展地的思路,不是这样的,我相信我们在实际编码中写过太多这样的程序了,你一定不会设计出这样的函数接口 —— Find2ndMaxNum(int* array, int len),就好像你不会设计出 DestroyBaghdad(); 这样的接口,而是设计一个DestoryCity( City& ); 的接口,而把Baghdad当成参数传进去!所以,你应该是声明一个叫FindKthMaxNum(int* array, int len, int kth),把2当成参数传进去。这是最基本的编程方法,用数学的话来说,叫代数!最简单的需求分析方法就是把需求翻译成函数名,然后看看是这个接口不是很二看!(注:不要纠结于FindMaxNum()或FindMinNum(),因为这两个函数名的业务意义很清楚了,不像Find2ndMaxNum()那么二)非功能性需求分析性能之类的东西从来都是非功能性需求,对于算法题,我们太喜欢研究算法题的空间和时间复杂度了。我们希望做到空间和时间双丰收,这是算法学术界的风格。所以,习惯于标准答案的我们已经失去思考的能力,只会机械地思考算法之内的性能,而忽略了算法之外的性能。如果题目是——逗从无序数组中找到第K个最大的数地,那么,我们一定会去思考用O(n)的线性算法找出第K个数。事实上,也有线性算法——STL中可以用nth_element求得类似的第n大的数,其利用快速排序的思想,从数组S中随机找出一个元素X,把数组分为两部分Sa和Sb。Sa中的元素大于等于X,Sb中元素小于X。这时有两种情况:1)Sa中元素的个数小于k,则Sb中的第 k-|Sa|个元素即为第k大数;2) Sa中元素的个数大于等于k,则返回Sa中的第k大数。时间复杂度近似为O(n)。搞学术的nuts们到了这一步一定会欢呼胜利!但是他们哪里能想得到性能的需求分析也是来源自业务的!我们一说性能,基本上是个人都会问,请求量有多大看如果我们的FindKthMaxNum()的请求量是m次,那么你的这个每次都要O(n)复杂度的算法得到的效果就是O(n*m),这一点,是书呆子式的学院派人永远想不到的。因为应试教育让我们不会从实际思考了。工程式的解法根据上面的需求分析,有软件工程经验的人的解法通常会这样:1)把数组排序,从大到小。2)于是你要第k大的数,就直接访问 array[k]。排序只需要一次,O(n*log(n)),然后,接下来的m次对FindKthMaxNum()的调用全是O(1)的,整体复杂度反而成了线性的。其实,上述的还不是工程式的最好的解法,因为,在业务中,那数组中的数据可能会是会变化的,所以,如果是用数组排序的话,有数据的改动会让我重新排序,这个太耗性能了,如果实际情况中会有很多的插入或删除操作,那么可以考虑使用B+树。工程式的解法有以下特点:1)很方便扩展,因为数据排好序了,你还可以方便地支持各种需求,如从第k1大到k2大的数据(那些学院派写出来的代码在拿到这个需求时又开始挠头苦想了)2)规整的数据会简化整体的算法复杂度,从而整体性能会更好。(公欲善其事,必先利其器)3)代码变得清晰,易懂,易维护!(学院派的和STL一样的近似O(n)复杂度的算法没人敢动)争论你可能会和我有以下争论,如果程序员做这个算法题用排序的方式,他一定不会像你想那么多。是的,你说得对。但是我想说,很多时候,我们直觉地思考,恰恰是正确的路。因为逗排序地这个思路符合人类大脑处理问题的方式,而使用学院派的方式是反大脑直觉的。反大脑直觉的,通常意味着晦涩难懂,维护成本上升。就是一道面试题,我就是想测试一下你的算法技能,这也扯太多了。没问题,不过,我们要清楚我们是在招什么人看是一个只会写算法的人,还是一个会做软件的人看这个只有你自己最清楚。这个算法题太容易诱导到学院派的思路了。是的这道逗找出第K大的数地,其实可以变换为更为业务一点的题目——逗我要和别的商户竞价,我想排在所有竞争对手报价的第K名,请写一个程序,我输入K,和一个商品名,系统告诉我应该订多少价看(商家的所有商品的报价在一数组中)地——业务分析,整体性能,算法,数据结构,增加需求让应聘者重构,这一个问题就全考了。你是不是在说算法不重要,不用学看千万别这样理解我,搞得好像如果面试不面,我就可以不学。算法很重要,算法题能锻炼我们的思维,而且也有很多实际用处。我这篇文章不是让大家不要去学算法,这是完全错误的,我是让大家带着业务问题去使用算法。问你业务问题,一样会问到算法题上来。小结看过这上面的分析,我相信你明白我为什么反对纯算法面试题了。原因就是纯算法的面试题根本不能反应一个程序的综合素质!那么,在面试中,我们应该要考量程序员的那些综合素质呢看我以为有下面这些东西:会不会做需求分析看怎么理解问题的看解决问题的思路是什么看想法如何看会不会对基础的算法和数据结构灵活运用看另外,我们知道,对于软件开发来说,在工程上,难是的下面是这些挑战:软件的维护成本远远大于软件的开发成本。软件的质量变得越来越重要,所以,测试工作也变得越来越重要。软件的需求总是在变的,软件的需求总是一点一点往上加的。程序中大量的代码都是在处理一些错误的或是不正常的流程。所以,对于编程能力上,我们应该主要考量程序员的如下能力:设计是否满足对需求的理解,并可以应对可能出现的需求变化。
⑥ 计算机视觉算法工程师笔试主要什么内容
你好,领学网为你解答:
计算机视觉部分:
1、考察特征点匹配算法,输入两幅图像中的特征点对,输出匹配的特征点对,(128维描述子)距离计算函数已给出无需考虑复杂度。编写伪代码,分析算法复杂度;
2、考察图像旋转。左边图像时旋转一定角度后的图像(有黑边),右边为正常图像。已知两幅图像都为WxH,以及左图像与四边的切点A1A2A3A4,设计旋转算法使左图像变换矫正成右图像,编写伪代码,分析算法复杂度及优缺点;
3、主要考察双目视觉中的标定知识。给出了双目视觉的成像原理图及相关定理和表达。第一小题,需要证明x'Fx=0 x'x为左右图像中的匹配点对,并要求给出F矩阵的秩;第二小题要求推导出最少可由多少对左右图像中匹配点可以推导出F矩阵;
4、要求写出图像处理和计算机视觉在无人飞行器中的3个重要应用。给出理由和解决方案并分析。
图像处理部分:
1、主要考察一维中值滤波,退化为区间滤波 编写伪代码,分析算法复杂度;
2、主要考察二维中值滤波,编写伪代码,分析算法复杂度;
3、如何去除脉冲噪声,图像中有大量随机产生的255和0噪声;
4、考察加权中值滤波公式推导以及一维加权中值滤波
控制部分:
对象举例均为四旋翼无人飞行器,各题目要求设计控制器,给出控制率,还有观测方案设计等等;有一题比较简单就是说明PID的各部分含义以及如何调节。
希望帮到你!
⑦ 算法面试
我在《再谈“我是怎么招程序员”》中比较保守地说过,“问难的算法题并没有错,错的很多面试官只是在肤浅甚至错误地理解着面试算法题的目的。”,今天,我想加强一下这个观点——我反对纯算法题面试!(注意,我说的是纯算法题)图片源Wikipedia(点击图片查看词条)我再次引用我以前的一个观点——能解算法题并不意味着这个人就有能力就能在工作中解决问题,你可以想想,小学奥数题可能比这些题更难,但并不意味着那些奥数能手就能解决实际问题。好了,让我们来看一个示例(这个示例是昨天在微博上的一个讨论),这个题是——“找出无序数组中第2大的数”,几乎所有的人都用了O(n)的算法,我相信对于我们这些应试教育出来的人来说,不用排序用O(n)算法是很正常的事,连我都不由自主地认为O(n)算法是这个题的标准答案。我们太习惯于标准答案了,这是我国教育最悲哀的地方。(广义的洗脑就是让你的意识依赖于某个标准答案,然后通过给你标准答案让你不会思考而控制你)功能性需求分析试想,如果我们在实际工作中得到这样一个题 我们会怎么做?我一定会分析这个需求,因为我害怕需求未来会改变,今天你叫我找一个第2大的数,明天你找我找一个第4大的数,后天叫我找一个第100大的数,我不搞死了。需求变化是很正常的事。分析完这个需求后,我会很自然地去写找第K大数的算法——难度一下子就增大了。很多人会以为找第K大的需求是一种“过早扩展”的思路,不是这样的,我相信我们在实际编码中写过太多这样的程序了,你一定不会设计出这样的函数接口 —— Find2ndMaxNum(int* array, int len),就好像你不会设计出 DestroyBaghdad(); 这样的接口,而是设计一个DestoryCity( City& ); 的接口,而把Baghdad当成参数传进去!所以,你应该是声明一个叫FindKthMaxNum(int* array, int len, int kth),把2当成参数传进去。这是最基本的编程方法,用数学的话来说,叫代数!最简单的需求分析方法就是把需求翻译成函数名,然后看看是这个接口不是很二?!(注:不要纠结于FindMaxNum()或FindMinNum(),因为这两个函数名的业务意义很清楚了,不像Find2ndMaxNum()那么二)非功能性需求分析性能之类的东西从来都是非功能性需求,对于算法题,我们太喜欢研究算法题的空间和时间复杂度了。我们希望做到空间和时间双丰收,这是算法学术界的风格。所以,习惯于标准答案的我们已经失去思考的能力,只会机械地思考算法之内的性能,而忽略了算法之外的性能。如果题目是——“从无序数组中找到第K个最大的数”,那么,我们一定会去思考用O(n)的线性算法找出第K个数。事实上,也有线性算法——STL中可以用nth_element求得类似的第n大的数,其利用快速排序的思想,从数组S中随机找出一个元素X,把数组分为两部分Sa和Sb。Sa中的元素大于等于X,Sb中元素小于X。这时有两种情况:1)Sa中元素的个数小于k,则Sb中的第 k-|Sa|个元素即为第k大数;2) Sa中元素的个数大于等于k,则返回Sa中的第k大数。时间复杂度近似为O(n)。搞学术的nuts们到了这一步一定会欢呼胜利!但是他们哪里能想得到性能的需求分析也是来源自业务的!我们一说性能,基本上是个人都会问,请求量有多大?如果我们的FindKthMaxNum()的请求量是m次,那么你的这个每次都要O(n)复杂度的算法得到的效果就是O(n*m),这一点,是书呆子式的学院派人永远想不到的。因为应试教育让我们不会从实际思考了。工程式的解法根据上面的需求分析,有软件工程经验的人的解法通常会这样:1)把数组排序,从大到小。2)于是你要第k大的数,就直接访问 array[k]。排序只需要一次,O(n*log(n)),然后,接下来的m次对FindKthMaxNum()的调用全是O(1)的,整体复杂度反而成了线性的。其实,上述的还不是工程式的最好的解法,因为,在业务中,那数组中的数据可能会是会变化的,所以,如果是用数组排序的话,有数据的改动会让我重新排序,这个太耗性能了,如果实际情况中会有很多的插入或删除操作,那么可以考虑使用B+树。工程式的解法有以下特点:1)很方便扩展,因为数据排好序了,你还可以方便地支持各种需求,如从第k1大到k2大的数据(那些学院派写出来的代码在拿到这个需求时又开始挠头苦想了)2)规整的数据会简化整体的算法复杂度,从而整体性能会更好。(公欲善其事,必先利其器)3)代码变得清晰,易懂,易维护!(学院派的和STL一样的近似O(n)复杂度的算法没人敢动)争论你可能会和我有以下争论,如果程序员做这个算法题用排序的方式,他一定不会像你想那么多。是的,你说得对。但是我想说,很多时候,我们直觉地思考,恰恰是正确的路。因为“排序”这个思路符合人类大脑处理问题的方式,而使用学院派的方式是反大脑直觉的。反大脑直觉的,通常意味着晦涩难懂,维护成本上升。就是一道面试题,我就是想测试一下你的算法技能,这也扯太多了。没问题,不过,我们要清楚我们是在招什么人?是一个只会写算法的人,还是一个会做软件的人?这个只有你自己最清楚。这个算法题太容易诱导到学院派的思路了。是的这道“找出第K大的数”,其实可以变换为更为业务一点的题目——“我要和别的商户竞价,我想排在所有竞争对手报价的第K名,请写一个程序,我输入K,和一个商品名,系统告诉我应该订多少价?(商家的所有商品的报价在一数组中)”——业务分析,整体性能,算法,数据结构,增加需求让应聘者重构,这一个问题就全考了。你是不是在说算法不重要,不用学?千万别这样理解我,搞得好像如果面试不面,我就可以不学。算法很重要,算法题能锻炼我们的思维,而且也有很多实际用处。我这篇文章不是让大家不要去学算法,这是完全错误的,我是让大家带着业务问题去使用算法。问你业务问题,一样会问到算法题上来。小结看过这上面的分析,我相信你明白我为什么反对纯算法面试题了。原因就是纯算法的面试题根本不能反应一个程序的综合素质!那么,在面试中,我们应该要考量程序员的那些综合素质呢?我以为有下面这些东西:会不会做需求分析?怎么理解问题的?解决问题的思路是什么?想法如何?会不会对基础的算法和数据结构灵活运用?另外,我们知道,对于软件开发来说,在工程上,难是的下面是这些挑战:软件的维护成本远远大于软件的开发成本。软件的质量变得越来越重要,所以,测试工作也变得越来越重要。软件的需求总是在变的,软件的需求总是一点一点往上加的。程序中大量的代码都是在处理一些错误的或是不正常的流程。所以,对于编程能力上,我们应该主要考量程序员的如下能力:设计是否满足对需求的理解,并可以应对可能出现的需求变化。
⑧ 诺瓦星云算法图像工程师面试好过没
好过。
1、诺瓦星云算法图像工程师的面试首先是电话面试,回答一些基本问题。
2、然后是自我介绍和最后的反问,真正的面试时间就十几分钟,侧重点在项目上,没有关于通用能力的问题,所以好过。
⑨ AI面试题第二弹(神经网络基础)
提取主要特征,减小网络参数量,减小计算量
层层传递的梯度>1 梯度爆炸
层层传递的梯度<1 梯度消失
与权重有很大关系,激活函数的影响较小。
每次训练一层隐节点,训练时将上一层隐节点的输出作为输入,而本层隐节点的输出作为下一层隐节点的输入,此过程就是逐层“预训练”(pre-training);在预训练完成后,再对整个网络进行“微调”(fine-tunning)。Hinton在训练深度信念网络(Deep Belief Networks中,使用了这个方法,在各层预训练完成后,再利用BP算法对整个网络进行训练。
这个方案主要是针对梯度爆炸提出的,其思想是设置一个梯度剪切阈值,然后更新梯度的时候,如果梯度超过这个阈值,那么就将其强制限制在这个范围之内。这可以防止梯度爆炸。
比较常见的是l1l1l1正则,和l2l2l2正则,在各个深度框架中都有相应的API可以使用正则化
反向传播中,经过每一层的梯度会乘以该层的权重。
举个简单例子:
为了得到一致假设而使假设变得过度复杂称为过拟合(overfitting), 过拟合表现在训练好的模型在训练集上效果很好,但是在测试集上效果差 。也就是说模型的泛化能力弱。
过拟合主要由两个原因造成,数据集太小或模型太复杂
(1). 数据集扩增(Data Augmentation)
(2). 改进模型
·Early Stopping。在模型效果比较好的时候便提前停止训练
·正则化(regularization)
L1:稀疏参数
L2:更小参数
·Dropout
·多任务学习
深度学习中两种多任务学习模式:隐层参数的硬共享和软共享
硬共享机制是指在所有任务中共享隐藏层,同时保留几个特定任务的输出层来实现。硬共享机制降低了过拟合的风险。多个任务同时学习,模型就越能捕捉到多个任务的同一表示,从而导致模型在原始任务上的过拟合风险越小。
软共享机制是指每个任务有自己的模型,自己的参数。模型参数之间的距离是正则化的,以便保障参数相似性。
见后文
leaky relu
输入是x输出是y,正常的流程是:我们首先把x通过网络前向传播,然后把误差反向传播以决定如何更新参数让网络进行学习。使用Dropout之后,过程变成如下:
(1)首先随机(临时)删掉网络中一半的隐藏神经元,输入输出神经元保持不变(图中虚线为部分临时被删除的神经元)
(2) 然后把输入x通过修改后的网络前向传播,然后把得到的损失结果通过修改的网络反向传播。一小批训练样本执行完这个过程后,在没有被删除的神经元上按照随机梯度下降法更新对应的参数(w,b)。
(3)然后继续重复这一过程:
恢复被删掉的神经元(此时被删除的神经元保持原样,而没有被删除的神经元已经有所更新)
从隐藏层神经元中随机选择一个一半大小的子集临时删除掉(备份被删除神经元的参数)。
对一小批训练样本,先前向传播然后反向传播损失并根据随机梯度下降法更新参数(w,b) (没有被删除的那一部分参数得到更新,删除的神经元参数保持被删除前的结果)。
不断重复这一过程。
没有对数据进行归一化
忘记检查输入和输出
没有对数据进行预处理
没有对数据正则化
使用过大的样本
使用不正确的学习率
在输出层使用错误的激活函数
网络中包含坏梯度
初始化权重错误
过深的网络
隐藏单元数量错误
网络设计不合理(任务-网络不匹配)
机器学习有个很重要的假设:就是假设训练数据和测试数据是满足独立同分布的,这保障了通过训练数据获得的优秀模型也能够在测试集获得好的效果。但是在机器学习训练中输入层的每个批量(X,Y)中X的分布是不一致的,并且神经网络的隐藏层的输入分布在每次训练迭代中发生变化。 BatchNorm就是在深度神经网络训练过程中使得每一层神经网络的输入保持相同分布的。
BN的基本思想其实相当直观:因为深层神经网络在做非线性变换前(激活前)的 输入值 (就是那个x=WU+B,U是输入) 随着网络深度加深或者在训练过程中,其分布逐渐发生偏移或者变动,之所以训练收敛慢,一般是整体分布逐渐往非线性函数的取值区间的上下限两端靠近 (对于Sigmoid函数来说,意味着激活输入值WU+B是大的负值或正值),所以这 导致反向传播时低层神经网络的梯度消失 ,这是训练深层神经网络收敛越来越慢的 本质原因 , 而BN就是通过一定的规范化手段,把每层神经网络任意神经元这个输入值的分布强行拉回到均值为0方差为1的标准正态分布 ,其实就是把越来越偏的分布强制拉回比较标准的分布,这样使得激活输入值落在非线性函数对输入比较敏感的区域,这样输入的小变化就会导致损失函数较大的变化,意思是 这样让梯度变大,避免梯度消失问题产生,而且梯度变大意味着学习收敛速度快,能大大加快训练速度。
但是接下来的问题是:如果都通过BN,那么不就跟把非线性函数替换成线性函数效果相同了,意味着网络的非线性表达能力下降了, 所以BN为了保证非线性的获得,对变换后的满足均值为0方差为1的x又进行了scale加上shift操作(y=scale*x+shift), 每个神经元增加了两个参数scale和shift参数,这两个参数是通过训练学习到的,意思是通过scale和shift把这个值从标准正态分布左移或者右移一点并长胖一点或者变瘦一点,每个实例挪动的程度不一样,这样等价于激活前的值经过标准正太分布归一化后再从正中心周围的线性区往非线性区动了动。核心思想应该是想找到一个线性和非线性的较好平衡点,既能享受非线性的较强表达能力的好处,又避免太靠非线性区两头使得网络收敛速度太慢
Batch Normalization 好处:(1)提高了训练速度,收敛速度也大大加快(2)另外调参过程也简单多了,对于初始化要求没那么高,而且可以使用大的学习率等 (3)可以防止梯度消失(4)BN类似于Dropout的一种防止过拟合的正则化表达方式,可以有效防止过拟合,不用太依赖dropou和正则化
以下情况最好不要使用BN:(1)数据不平衡(2)batch_size太小
batch_size是机器学习中的一个重要参数,决定了梯度下降的方向,如果数据集比较小,完全可以采用全数据集的形式计算梯度,由全数据集确定的梯度方向能够更好地代表样本总体,从而更准确地朝向极值所在的方向。对于大型数据集则需要使用mini-batch_size,因为随着数据集的海量增长和内存限制,一次性载入所有的数据进来变得越来越不可行。
当batch_size=1,即在线学习,模型难以达到收敛 。
合理增加batch_size好处 :
(1)内存利用率提高了,大矩阵乘法的并行化效率提高
(2)跑完一次 epoch(全数据集)所需的迭代次数减少,对于相同数据量的处理速度进一步加快。
(3)在一定范围内,一般来说 Batch_Size 越大,其确定的下降方向越准,引起训练震荡越小
盲目增大 Batch_Size 坏处 :
(1)内存利用率提高了,但是内存容量可能撑不住了
(2)跑完一次 epoch(全数据集)所需的迭代次数减少,要想达到相同精度所需要的 epoch 数量越来越多,花费的时间越长
(3)大的batchsize收敛到sharp minimum,而小的batchsize收敛到flat minimum,后者具有更好的泛化能力。
总之batchsize在变得很大(超过一个临界点)时,会降低模型的泛化能力。在这个临界点之下,模型的性能变换随batch size通常没有学习率敏感
目标所在的真实框(ground truth) 与算法预测的目标所在的框(bounding box)的交集与并集的比值,我们会用IOU阈值来判定预测的bounding box是否有效。一般阈值会设定在0.5,当IOU的值大于等于0.5时,我们会把这个预测的bounding box 归为正类,而小于0.5的归为负类。
牛顿法使用的是目标函数的二阶导数,在高维情况下这个Hessian(n*n维度)矩阵非常大,计算复杂度是n*n,计算和存储都是问题
(1) 通过控制卷积核个数实现升维或者降维,从而减少模型参数和计算量
(2) 用于不同channel上特征的融合
(3)1x1的卷积相当于全连接层的计算过程,并且加入了非线性激活函数,从而增加了网络的非线性,使得网络可以表达更加复杂的特征。
它能够把输入的连续实值变换为0和1之间的输出,如果是非常大的负数,那么输出就是0;如果是非常大的正数,输出就是1
缺点:
(1)函数的饱和区,导致梯度几乎为0,造成梯度消失问题
(2)Sigmoid 的 output 不是0均值,具体解释见 https://blog.csdn.net/tyhj_sf/article/details/79932893
(3)其解析式中含有幂运算,计算机求解时相对来讲比较耗时。对于规模比较大的深度网络,这会较大地增加训练时间。
它解决了Sigmoid函数的不是零均值输出问题,然而,梯度消失(gradient vanishing)的问题和幂运算的问题仍然存在。
(1)在正区间解决了梯度消失的问题
(2)函数简单,计算速度快,收敛速度远快于sigmoid和tanh
缺点:
(1)Relu函数输出不是0均值
(2)神经元坏死问题:指的是某些神经元可能永远不会被激活,导致相应的参数永远不能被更新,有两个主要原因导致这种状况发生
(1) 非常不幸的参数初始化,这种情况比较少见
(2) learning rate太高导致在训练过程中参数更新太大,不幸使网络进入这种状态。解决方法是可以采用Xavier初始化方法,以及避免将learning rate设置太大或使用adagrad等自动调节learning rate的算法
为了解决ReLU函数带来的神经元坏死问题 , 提出了将ReLU的前半段设为αx,α通常设为0.01,,另外一种直观的想法是基于参数的方法PReLU函数, α可由方向传播算法学习出来。
ELU也是为解决ReLU存在的问题而提出,显然,ELU有ReLU的基本所有优点,以及:(1)不会有神经元坏死现象(2)函数输出均值接近于0
但是ELU的小问题就是计算量稍微有点大。
1、使用不同的激活函数,比如Relu,Leak-Relu,PRelu,elu等激活函数代替sigmoid函数
2、使用Batch Normalizaion(批量归一化)
3、使用残差网络
4、预训练加微调
1、梯度裁剪
2、权重正则化
两个3x3的卷积核的感受野比5x5的卷积核的感受野大,在保持相同感受野的同时,用3x3的卷积核可以提升网络的深度,可以很明显的减少计算量。
1、局部连接
2、权值共享:减小参数量
3、池化操作:增大感受野
4、多层次结构:可以提取low-level以及high-level的信息
1、数据集太小,数据样本不足时,深度学习相对其它机器学习算法,没有明显优势。
2、数据集没有局部相关特性,目前深度学习表现比较好的领域主要是图像/语音/自然语言处理等领域,这些领域的一个共性是局部相关性。图像中像素组成物体,语音信号中音位组合成单词,文本数据中单词组合成句子,这些特征元素的组合一旦被打乱,表示的含义同时也被改变。对于没有这样的局部相关性的数据集,不适于使用深度学习算法进行处理。举个例子:预测一个人的健康状况,相关的参数会有年龄、职业、收入、家庭状况等各种元素,将这些元素打乱,并不会影响相关的结果。
作用 :对输入的特征图进行压缩,
一方面使特征图变小,简化网络计算复杂度;
一方面进行特征压缩,提取主要特征。
通常来讲,max-pooling的效果更好,虽然max-pooling和average-pooling都对数据做了下采样,但是 max-pooling感觉更像是做了特征选择,选出了分类辨识度更好的特征,提供了非线性 。 pooling的主要作用一方面是去掉冗余信息,一方面要保留feature map的特征信息,在分类问题中,我们需要知道的是这张图像有什么object,而不大关心这个object位置在哪,在这种情况下显然max pooling比average pooling更合适。在 网络比较深的地方,特征已经稀疏了,从一块区域里选出最大的,比起这片区域的平均值来,更能把稀疏的特征传递下去 。
average-pooling更强调对整体特征信息进行一层下采样,在减少参数维度的贡献上更大一点,更多的体现在 信息的完整传递这个维度 上,在一个很大很有代表性的模型中,比如说DenseNet中的模块之间的连接大多采用average-pooling,在减少维度的同时,更有利信息传递到下一个模块进行特征提取。
average-pooling在 全局平均池化操作 中应用也比较广,在ResNet和Inception结构中最后一层都使用了平均池化。有的时候在模型接近 分类器的末端使用全局平均池化还可以代替Flatten操作 ,使输入数据变成一位向量。
CNN网络中另外一个不可导的环节就是Pooling池化操作,因为Pooling操作使得feature map的尺寸变化,假如做2×2的池化(步长也为2),假设那么第l+1层的feature map有16个梯度,那么第l层就会有64个梯度,这使得梯度无法对位的进行传播下去。其实解决这个问题的思想也很简单,就是把1个像素的梯度传递给4个像素,但是需要保证传递的loss(或者梯度)总和不变。根据这条原则,mean pooling和max pooling的反向传播也是不同的
mean pooling的前向传播就是把一个patch中的值求取平均来做pooling,那么反向传播的过程也就是把 某个元素的梯度等分为n份分配给前一层,这样就保证池化前后的梯度(残差)之和保持不变 ,图示如下 :
(2) max pooling
max pooling也要满足梯度之和不变的原则 ,max pooling的前向传播是把patch中最大的值传递给后一层,而其他像素的值直接被舍弃掉。那么 反向传播也就是把梯度直接传给前一层某一个像素,而其他像素不接受梯度,也就是为0。 所以max pooling操作和mean pooling操作不同点在于需要记录下池化操作时到底哪个像素的值是最大,也就是max id,这个变量就是记录最大值所在位置的,因为在反向传播中要用到,那么假设前向传播和反向传播的过程就如下图所示 :
28、细粒度分类
29、LSTM&RNN
30、解释LSTM结构(相对于RNN)的好处
31、RNN的梯度消失原因和解决办法
32、Object Detection
33、Unet的介绍
34、FCN和Unet的区别
35、RCNN系列的算法流程和区别
36、Fast RCNN中 bbox 回归的损失函数什么
37、解释 ROI Pooling 和 ROI Align
38、Mask RCNN中 mask branch 如何接入 Faster RCNN中
39、解释 FPN
40、解释 ROI Align
41、简述 YOLO 和 SSD
42、简述 Hough 直线检测、Sobel 边缘检测算法流程
43、Mask RCNN中的anchors如何判定为正负样本
44、简述 NMS 算法流程
45、attention起源是用在哪里?pixel还是frame,是soft还是hard
46、anchor的正负样本比是多少
47、算法和激活函数等
48、BN的原理和作用
49、BN层反向传播,怎么求导
50、BN 的作用和缺陷,以及针对batch_size小的情况的改进(GN)
51、BN层,先加BN还是激活,有什么区别
52、手推BP
53、优化算法举例和他们的区别(SGD、SGDM、RMSprop、Adam)
54、随机梯度下降和梯度下降
55、训练不收敛的原因有哪些
56、简述 SVM 流程、核函数寻参及常见的核函数举例
57、batch_size 和 learning rate 的关系(怎么平衡和调整二者)
58、解释过拟合和欠拟合,以及解决方法
59、激活函数有哪些,各自区别
60、损失函数有哪些
61、Sigmoid 和 ReLu 对比(各自优缺点)
62、为什么不用sigmoid而用relu?做出了哪些改进?
63、梯度消失和梯度爆炸的原因和解决方法
64、Precision 和 Recall 的定义
65、精确率高、召回率低是为什么
66、SVM,线性回归和逻辑回归的原理及区别
67、PCA原理,PCA和SVD的区别和联系
68、正则化怎么选择,有哪些方式
69、L1、L2范数,区别
70、boost、Adaboost
71、dropout和batch normalization
72、讲一下决策树和随机森林
73、讲一下GBDT的细节,写出GBDT的目标函数。 GBDT和Adaboost的区别与联系
74、偏差、方差
75、距离度量公式哪些,区别
76、多标签识别怎么做
77、data argumentation怎么处理的
78、数据不均衡怎么处理、只有少量带标签怎么处理
79、权重初始化方法都有哪些
80、权值衰减这个参数怎么设置
81、分类问题有哪些评价指标?每种的适用场景。
82、无监督学习了解哪些
83、图像处理Opencv
84、边缘检测算子有哪些
85、霍夫变换
86、直方图是什么
87、canny算子是怎么做的
88、图像的特征提取有哪些算法,适用范围、优缺点
参考:
https://blog.csdn.net/bluesliuf/article/details/89389117
https://zhuanlan.hu.com/p/107279000
https://zhuanlan.hu.com/p/56475281
⑩ android 面试,算法题。
final int size = data.length;
for(int i = 0; i< size; i++){
if(data[i] == 0xffffffff)
data[i] = 0x80ffffff;
}
不知道你是不是这个意思。