贝叶斯系列——贝叶斯与其他统计流派的区别和联系

作者:沈伟臣

编辑:张 欢

前言

了解概率统计的同学都知道有频率学派和贝叶斯学派两种统计流派,那么频率学派和贝叶斯学派到底有什么区别呢?本篇文章分为三部分,首先介绍几种基本概率模型,然后介绍贝叶斯平滑在广告点击率(CTR)预估中的应用。首先介绍概率统计上的三种基本概率模型。

古典模型

这个模型下,随机实验所有可能的结果是有限的,并且每个基本结果发生的概率是相同的。举例:投掷一枚均匀硬币,结果只有两种(假设硬币没有立起来),正面朝上和反面朝上,那么正面朝上的的概率就是0.5。这是基于古典概率模型的计算。

频率学派

认为待估计参数是某个未知的常量,通过多次试验,统计事件发生的次数占总试验的比值,得到待估计参数的值。举例:估算投掷一枚均匀硬币获得正面的概率。我们进行1000次试验,有498次朝上,所以得到正面的概率是0.498。

贝叶斯学派

认为待估计参数不是某个固定的常量,而是一种随机变量(服从某种分布)。关于这个随机变量,我们可以根据常识或其他客观事实对其有一个先验的分布估计(信念),之后根据试验来调整这个分布,最后求得该随机变量的后验分布。 这种思想解决了频率学派试验中当试验次数过少而导致的试验偏差的问题,比如,投掷一枚匀质硬币5次,这5次都是正面朝上,根据频率学派观点,认为硬币投掷正面朝上的概率是P(正面朝上)=5/5=1,这显然是不符合常理的。 举例: 现在定义事件A=(投掷一次硬币正面朝上),B=(投掷5次硬币,5次朝上)。在贝叶斯的框架下,我们根据常识认为投掷硬币正面朝上的概率是0.5,所以我们可以假设这个先验服从参数为Beta(10,10)的分布,然后根据贝叶斯定理可计算出在事件B发生的条件下的A的概率分布为分布Beta(15,10),这个分布的期望值是0.6。通过贝叶斯框架,我们计算出硬币正面朝上的概率仍然是一个接近0.5的值,更加符合我们的常识。(关于Beta分布和后验概率的具体计算会在以后的文章具体介绍) 下图是分别绘制的先验分布Beta(10,10)(蓝色)和后验分布Beta(15,10)(绿色) 。

从哲学的角度讲,频率学派认为概率是客观的,贝叶斯学派则在概率中加入了主观的因素。

在广告转化率预估的预测中,广告对应的历史转化率经常是一个重要的特征。一般而言,某个广告的转化率会围绕一个值上下波动,在使用历史转化率做特征时,如果简单的使用频率学派的转化量除以点击量计算转化率,会发现转化率随着天数的不同会产生巨大的波动,这并不利于模型的训练。如果我们使用贝叶斯平滑,一种简单的做法是使用广告的历史转化率作为先验,并假设其服从Beta分布,假设广告的转化行为服从伯努利分布(事实上这个假设是有偏差的,伯努利分布假设每次事件发生是相互独立,而广告的的转化行为是存在上下文关系的)。那么我们可以根据每天的点击量和转化量来计算转化率的后验分布,并且使用后验分布的均值作为平滑的的转化率。一个简单的平滑函数如下。factor因子为控制平滑程度的参数,其本质是通过改变分布的有效样本量来控制先验和后验的权重的。

/*clicks  点击量list  conversions 转化量list  factor 平滑因子,
该因子越小,结果越平滑*/     

   def gen_smooth_cvr(clicks,conversions,factor=1): 
   smooth_cvr = []   

   sum_a = 0    

   sum_b = 0  

  /*计算先验*/  
   a = conversions.mean()    

   c = clicks.mean()    

   b = c-a       

 /*遍历日志*/

    for conv,clk in zip(conversions,clicks):   

 /*添加后验分布均值到结果列表*/  
    smooth_cvr.append(beta.mean(a+conv,b+(clk-conv)))       
     a += conv        

     b += (clk-conv)        

     a /=factor        

     b/=factor    

     return smooth_cvr 

当使用factor默认参数即factor=1的时,平滑后的结果如下图蓝色折线。可以看到有一点过度平滑了。下面调整factor,令其为1.5。

factor=1时的平滑结果

factor=1.5时的平滑结果。

我们再尝试一下factor=1.25时的平滑结果。

factor =1.25时的平滑结果。

这时可以使用其作为平滑后的转化率特征进行训练。

理解了贝叶斯系列了吗?

原文发布于微信公众号 - 机器学习算法全栈工程师(Jeemy110)

原文发表时间:2017-08-26

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏互联网开发者交流社区

WinForm之窗体应用程序

1843
来自专栏c#开发者

C# : row-clickable GridView and get and set gridview rows using JavaScript

Complete C# code: ---------------- using System; using System.ComponentModel; ...

2996
来自专栏菩提树下的杨过

SqlTransaction事务使用示例

using System; using System.Data; using System.Data.SqlClient; using System.Co...

1848
来自专栏谈补锅

记录C#常用的代码片段

using Newtonsoft.Json; using Newtonsoft.Json.Linq;

922
来自专栏葡萄城控件技术团队

Table-values parameter(TVP)系列之二: 利用DataTable将其作为参数传给SP

一,回顾         上一部分讲述了“在T-SQL中创建和使用TVP”,通过T-SQL建立如下的对象:         1)Tables ...

2069
来自专栏积累沉淀

Hive2.0.0操作HBase 1.2.1报错解决

首先看错  org.apache.hive.service.cli.HiveSQLException: Failed to open new session: ...

2339
来自专栏xingoo, 一个梦想做发明家的程序员

windows程序设计-第四章 system1.c

/*---------------------------------------------------- SYSMETS1.C -- System M...

23610
来自专栏张善友的专栏

Using sqlite with .NET

The other day I found that there is a .NET wrapper for sqlite. sqlite is a very ...

2278
来自专栏c#开发者

jquery easyui datagrid mvc server端分页排序筛选的实现

1自定义一个ModelBinder public class filterRule { public string field { g...

4179
来自专栏CreateAMind

文字描述生成视频的开源项目

Tensorflow implementation for the paper Attentive Semantic Video Generation usin...

1112

扫码关注云+社区