面试中算法总结,算法面试( 二 )


以场景描述中的图8.9 为例,先对Cloudy 变量进行采样,然后再对Sprinkler 和Rain 变量进行采样,最后对WetGrass 变量采样,如图8.10 所示(图中绿色表示变量取值为True,红色表示取值为False) 。根据贝叶斯网络的全概率公式可以看出祖先采样得到的样本服从贝叶斯网络的联合概率分布 。
如果只需要对贝叶斯网络中一部分随机变量的边缘分布进行采样, 可以用祖先采样先对全部随机变量进行采样,然后直接忽视那些不需要的变量的采样值即可 。由图可见,如果需要对边缘分布p(Rain) 进行采样,先用祖先采样得到全部变量的一个样本,如(Cloudy=T, Sprinkler=F,Rain=T,WetGrass=T),然后忽略掉无关变量,直接把这个样本看成是Cloudy=T 即可 。
接下来考虑含有观测变量的贝叶斯网络的采样,如图8.11 所示 。网络中有观测变量(Sprikler=T,WetGrass=T)(观测变量用斜线阴影表示),又该如何采样呢?最直接的方法是逻辑采样,还是利用祖先采样得到所有变量的取值 。如果这个样本在观测变量上的采样值与实际观测值相同,则接受,否则拒绝,重新采样 。
这种方法的缺点是采样效率可能会非常低,随着观测变量个数的增加、每个变量状态数目的上升,逻辑采样法的采样效率急剧下降,实际中基本不可用 。因此,在实际应用中,可以参考重要性采样的思想,不再对观测变量进行采样,只对非观测变量采样,但是最终得到的样本需要赋一个重要性权值:其中E 是观测变量集合 。这种采样方法称作似然加权采样(Likelihood Weighted Sampling),产生的样本权值可以用于后续的积分操作 。
面试算法发现面试官比你技术还次,最后面试没通过是什么心态?
大家好,我是韩都衣舍希哥,很高兴回答你得问题,下面将是我的回答{!-- PGC_VIDEO:{"thumb_height": 720, "vposter": "http://p1.toutiaoimg.com/origin/tos-cn-p-0000/567430c836094af5b139c22d2e010621 。
用Python刷面试算法题(如leetcode)是怎样的体验?
当然,Python是我推荐的刷算法题的最好语言,没有之一 。第一,Python的语法够简单,你不需要被语言细节弄得碍手碍脚 。假设你用C语言,那么内存、指针就得虐你一遍,还能剩下多少精力去研习算法?刷算法时,语言只是载体,是工具,绝不不能被语言所束缚,Python在这一点上占据绝对的优势 。第二,Python虽然简单,但语言特性应有尽有,一点不差 。
Python虽然简单,但特性是很丰富的,如面向对象、函数式编程等方面,一个不缺,简单好用,代码看上去也很简洁 。其他的语言,要不太过于基础(C/C等)而缺乏高级特性,要不就很fancy(例如JavaScript,搞个面向对象还要牵扯到原型链之类的对象),搞个并行化还要通过异步,不像Python,特性够多,且很简洁 。
第三,Python是动态语言,不需要编译,写完直接跑,又增加了方便性 。像C/C/Java这些语言,写完要编译或依赖虚拟机执行,多了这一步其实就多了些障碍,而我们刷算法题时,要的就是沉浸式的体验,不要被这些所妨碍 。Python拥有以上所提及的全部三项特性,肯定是首选 。另外,还有一项福利,Python是AI领域的官方语言,学完Python,刷完算法,你又迈入了另一扇人热门领域的大门 。

推荐阅读