在全栈的重要性毋庸置疑,但如何让数据产生价值呢?对于一个全栈老手coder来说,经常会遇到各种预测、决策、推理、分类、检测、排名等诸多问题。面对“你的代码还有bug吗?”的挑战,一个理性的回答是,我们已经执行了几个测试用例,当前代码出现bug的可能性是零点几。换句话说,我们对当前程序没有错误的信心是99.9%。这其实就是贝叶斯思维,或者说是使用了贝叶斯方法。不管我们是否看到,贝叶斯方法就在那里,闪耀着光芒。如何预测当前软件是否存在bug?我们还是要从贝叶斯定理来看。贝叶斯定理简单解释对于老码友来说,贝叶斯定理的概率表达比较清楚,也比较容易理解。回忆一下我们学过的概率论,联合概率满足交换律,即:P(AandB)=P(BandA)用条件概率展开联合概率:P(AandB)=P(A)P(B|A)P(BandA)=P(B)P(A|B)得到:P(A)P(B|A)=P(B)P(A|B)简单变换,得到:P(B|A)=P(A|B)P(B)/P(A)大功告成,这就是神奇的贝叶斯定理。其中:P(B)为先验概率,即在得到新数据之前假设成立的概率;P(B|A)是后验概率,即假设的概率是在观察到新数据后计算出来的;P(A|B)为likelihood,即在假设下得到这个数据的概率;P(A)是一个标准化常数,即在任何假设下得到这个数据的概率。您还可以添加一些材料。在计算P(A)时,可以用加法定理表示:P(A)=P(AandB)+P(AandB_)=P(A|B)P(B)+P(A|B_)P(B_)因而有:其中B_是B的相反事件。就测试和bug之间的估计而言,文章《贝叶斯推断的思想》(http://www.jianshu.com/p/0a038974d48c)给出了结果贝叶斯推理,即采用了这样一种方法。贝叶斯方法贝叶斯方法是一个非常通用的推理框架,其中用客观的新信息更新我们对某事的初始信念,从而产生新的和改进的信念。通过引入先验不确定性,允许初始推理的错误。在获得更新后的证据后,并没有放弃最初的推论,而是进行了调整,使其更符合当前的证据。然而,P(A|B)和P(B|A)常常令人困惑。@待字闺中的陈老师给出了一个重点理解,把规律和现象区分开来,就是把A看成是“规律”,B看成是“现象”,那么贝叶斯公式就看成:先生。Chen在《这的理解贝叶斯公式吗》和?中举了几个通俗易懂的例子,这里不再赘述。回到码农的生活,我们在提升系统功能的时候,常用的方法之一就是AB测试。AB测试是一种统计设计模式,用于检测两种不同处理方式之间的差异程度,例如,两个网站中哪一个会带来更高的转化率,其中转化可以是用户购买、注册或其他行为。AB测试的关键点是组之间只允许有一个差异。实验后分析通常通过假设检验来完成,例如均值差检验或比例差检验,通常涉及Z分数或令人困惑的p值,这对于贝叶斯方法来说更为自然。对两个网站A和B的转化概率建模,转化率介于0和1之间,可以使用Beta分布。如果先验为Beta(a1,b1),在N次访问中观察到X次转化,则此时的后验分布为Beta(a1+X,b1+N-X)。假设先验为Beta(1,1),相当于在[0,1]上均匀分布,示例代码如下:fromspicy.statsimportbetaa1_prior=1b1_prior=1visitors_A=12345//网站A的访问量visitors_B=1616//网站B的访问量conversions_from_A=1200//网站A的转化量conversions_from_B=150//网站B的转化量posterior_A=beta(a1_prior+conversions_from_A,b1_prior+visitors_A-conversions_from_A)posterior_B=Beta(a1_prior+converions_from_B,b1_prior+visitors_B-conversions_from_B)//后验概率采样,使用rvs方法生成样本samples=20000samples_posterior_A=posterior_A.rvs(samples)samples_posterior_B=posterior_B.rvs(samples)//比较后验概率print(samples_posterior_A>samples_posterior_B).mean()使用贝叶斯方法,从思考数据是如何产生的开始。1)什么随机变量可以描述这些统计数据2)精确概率分布需要的参数3)参数对应早期行为,或者后期行为,定义各种变化点4)定义参数的概率分布5)参数概率分布的变量选择直到可以假设的均匀分布先验概率和后验概率的选择取决于应用场景。就先验分布而言,除了常见的分布外,还有:*Gamma分布,指数随机变量的扩展*Wishart分布,它是所有半正定矩阵的分布,是一个合适的先验协方差矩阵。*Beta分布,定义在0和1之间的随机变量,使其成为概率和比例的流行选择。*幂律分布,满足公司规模与公司数量的关系。Beta分布用于AB测试,Beta先验分布与二项式生成的观察数据一起应用以形成Beta后验分布。当面对多个对象之间的因果关系时,贝叶斯方法演变为贝叶斯网络。贝叶斯网络贝叶斯网络是为解决不确定性和不完备性问题而提出的,在很多领域得到了广泛的应用。贝叶斯网络是一种基于概率推理的图形网络,贝叶斯公式是这种概率网络的基础。贝叶斯网络中的每个点代表一个随机变量,具有实际意义,需要人为设计。点之间的边缘代表不确定的因果关系。例如节点E直接影响节点H,即E→H,用E指向H的箭头建立节点E到节点H的有向弧(E,H),权重(即连接强度)由条件概率P(H|E)表示。事实上,如果事物之间的关系可以用链条连接起来,就形成了贝叶斯网络的一个特例——马尔可夫链。从另一个角度看,贝叶斯网络是马尔可夫链的非线性扩展。在贝叶斯网络中,当某一点的一条证据出现时,整个网络中事件发生的概率就会发生变化。简单来说,贝叶斯网络考虑了联合条件概率分布,其中多个变量之间可能存在依赖关系,从而允许在变量子集之间定义条件独立性。使用贝叶斯网络的过程类似于使用贝叶斯方法的过程:通过多个离散变量构建网络,就是设置或学习一个有向无环图参数,即遍历DAG,计算概率表网络推理,以获得因果关系的可信概率推理结果。例如,检测社交网络中的虚假账户。首先确定网络中的随机变量:*账号的真实性A*头像的真实性H*帖子或日志的密度L*好友的密度F使用观察来实例化H、L、F,并将随机值赋给A,得到P(A|H,L,F)=P(H|A)P(L|A)P(F|A,H)然后可以尝试在社交网络中使用推理结果。在文章《算法杂货铺——分类算法之贝叶斯网络》中给出了这个例子的比较详细的描述。可以说,贝叶斯方法席卷了整个概率论,并将其应用扩展到各个问题领域。凡是需要做概率预测的地方,都能看到贝叶斯方法的影子。特别是贝叶斯方法对机器学习的影响很大。它有什么帮助?贝叶斯与机器学习机器学习在业界很火,但是我们在机器学习中也会遇到预测、决策、分类、检测等问题,而贝叶斯方法也很有用。机器学习中有大量的模型,例如线性模型和非线性模型,可以使用贝叶斯方法进行模型预测。也就是说,某个场景存在最多可能的模型,可以用一个概率分布来描述。对于假设的先验,预测新样本就像计算它的似然,然后用前面介绍的后验分布做积分。样本在这个给定模型下的似然是所有可能模型的分布。机器学习中模型的选择和比较也是一个常见的问题。例如,在分类问题中,我们使用线性模型还是非线性模型进行深度学习?贝叶斯方法认为:让A代表一个模型类,可能是线性模型,B代表另一个模型类,可能是非线性模型。线性模型。在同一个数据集X下,计算训练集在A和B情况下观察到的似然Ma和Mb,然后比较Ma和Mb。这是用于模型选择的贝叶斯方法的基本规则。其实贝叶斯定理是信息处理的准则,输入是先验分布和似然函数,输出是后验分布。对于机器学习中的模型本身,也可以尝试通过贝叶斯方法对其进行改进,比如贝叶斯SVM、高斯过程的贝叶斯等。另外,贝叶斯方法对于深度学习非常有用,至少在这部分参数调整。在神经网络中,每一层的参数,如卷积核的大小、数量等,在深度学习中不会被模型自动优化,需要人工指定。这可能是贝叶斯优化。【本文来自专栏作家“老曹”原创文章,作者微信公众号:哦家ArchiSelf,id:wrieless-com】点此阅读更多本作者好文
