1. 写在之前的话

0x1:贝叶斯推断的思想

我们从一个例子开始我们本文的讨论。小明是一个编程老手,但是依然坚信bug仍有可能在代码中存在。于是,在实现了一段特别难的算法之后,他开始决定先来一个简单的测试用例,这个用例通过了。接着,他用了一个稍微复杂的测试用例,再次通过了。接下来更难的测试用例也通过了,这时,小明开始觉得这段代码出现bug的可能性大大大大降低了....

上面这段白话文中,已经包含了最质朴的贝叶斯思想了!简单来说,贝叶斯推断是通过新得到的证据不断地更新我们的信念。

贝叶斯推断很少会做出绝对的判断,但可以做出非常可信的判断。在上面的例子中,小明永远无法100%肯定代码是无缺陷的,除非他穷举测试了每一种可能出现的情形,这在实践中几乎是不可能的。但是,我们可以对代码进行大量的测试,如果每一次测试都通过了,我们“更”有把握觉得这段代码是没问题的。

贝叶斯推断的工作方式就在这里:我们会随着新的证据不断更新之前的信念,但很少做出绝对的判断,除非所有其他的可能都被一一排除。

0x2:贝叶斯思维和频率派思维的区别

1. 频率派关于概率的解释 - 统计

频率派是更古典的统计学派,它们认为概率是事件在长时间内发生的概率。例如,在频率派的哲学语境里,飞机事故的概率指的是长期来看,飞机事故的概率值。

对许多事件来说,这样解释是有逻辑的。但是对某些没有长期频率的事件来说,这样的解释是难以理解的。例如,在总统选举时,某个候选人的获选的概率是难以用统计的方式来回答的,因为这个候选人的选举可能只发生一次。频率论为了解决这个问题,提出了“替代现实”的说法,从而用在所有这些替代的“现实”中发生的概率定义了这个概率。

2. 贝叶斯派关于概率的解释 - 信息

贝叶斯派对概率有更直观的解释。它把概率解释成是对事件发生的信心。简单地说,概率是观点的概述。

如果某人把概率 0 赋给某个事件的发生,表明他完全确定此事不会发生;相反,如果某人赋的概率值是 1,则表明他十分肯定此事一定会发生。

0 和 1 之间的概率值可以表明此事可能发生的权重。

这个概率定义可以和飞机事故概率一致,如果除去所有外部信息,一个人对飞机事故发生的信心应该等同于他了解到的飞机事故的频率。同样,贝叶斯概率定义也能适用于总统选举,并且使得概率(信心)更加有意义:即你对候选人 A 获胜的信息有多少?

对我们而言,将对一个事件发生的信息等同于概率是十分自然的,这正是我们长期以来同世界打交道的方式。我们只能了解到部分的真相,但可以通过不断收集证据来完善我们对事物的观念。

3. 贝叶斯推断的先验概率和后验概率

1)先验概率

对于统计学派来说,在进行统计之前,我们对概率是一无所知的。对于统计学派和统计方法来说,所有的概率都必须在完成统计之后(包括最大似然估计)才能得到一个统计概率。

但是对于贝叶斯推断来说,在进行统计之前,我们对事物已经拥有了一个先验的判断,即先验概率,记为 P(A)

例如:P(A):硬币有50%的概率是正面;P(A):一段很长的很复杂的代码可能含有bug

2)后验概率

我们用 P(A|X) 表示更新后的信念,其含义为在得到证据 X 后,A 事件的概率。考虑下面的例子:

P(A|X):我们观察到硬币落地后是正面,那么硬币是正面的后验概率会比50%大;

P(A|X):代码通过了所有的 X 个测试,现在代码可能仍然有bug,但是现在这个概率变得非常小了。

3)贝叶斯推断柔和地融合了我们对事物的先验领域知识以及实际的观察样本的统计结果

在上述的例子中,即便获得了新的证据,我们也并没有完全地放弃初始的信念,但是我们重新调整了信念使之符合目前的证据(训练样本),也就是说,证据让我们对某些结果更有信息。

通过引入先验的不确定性,我们事实上允许了我们的初始信念可能是错误的。在观察数据、证据或其他信息之后,我们不断更新我们的信念使得它错得不那么离谱

0x3:在大数据情况下统计思想和贝叶斯推断思想是相等的?

频率推断和贝叶斯推断都是一种编程函数,输入的是各种统计问题。频率推断返回的是一个统计值(通常是统计量,平均值是一个典型的例子),而贝叶斯推断则会返回一个概率值。

这个小节我们来讨论下,当样本数量 N 不断增大时,频率推断和贝叶斯推断会发生什么。

1. 频率推断:N越大,频率统计越接近真实概率

频率统计学派假设世界上存在一个真理,即概率。统计做的事只是通过大量的实验来揭示这个真理本身而已。当 N 趋于无穷时,频率统计得到的统计值会无限接近于概率本身,即规律本身。

2. 贝叶斯推断:N越大,先验的离谱程度会不断降低,即越靠近真实的规律本身

当我们增加 N 时,即增加更多的证据时,初始的信念会不断地被“洗刷”。这是符合期望的。例如如果你的先验是非常荒谬的信念类似“太阳今天会爆炸”,那么每一天的结果都会不断“洗刷”这个荒谬的先验,使得后验概率不断下降。

3. N趋于无穷大时,频率推断和贝叶斯推断趋近相等

让 N 表示我们拥有的证据的数量。如果 N 趋于无穷大,那么贝叶斯的结果通常和频率派的结果一致。

因此,对于足够大的 N,统计推断多多少少还是比较客观的。

另一方面,对于较小的 N,统计推断相对而言不太稳定,频率统计的结果有更大的方差和置信区间。所以才会有相关性检验、卡方检验、皮森相关系数这些评价算法。

贝叶斯推断在小数据这方面效果要更好,通过引入先验概率和返回概率结果(而不是某个固定的值),贝叶斯推断保留了不确定性,这种不确定性正式小数据集的不稳定性的反映。

4. 频率统计仍然是十分有用的!

虽然频率统计的有更大的方差和置信区间,在小数据集下表现也不一定稳定。但是频率统计仍然非常有用,在很多领域可能都是最好的办法。例如最小方差线性回归、LASSO回归、EM算法,这些都是非常有效和快速的方法。

贝叶斯方法能够在这些方法失效的场景发挥作用,或者是作为更有弹性的模型而补充。

0x4:贝叶斯推断和极大似然估计、SGD随机梯度下降是什么关系?

贝叶斯推断和极大似然估计、SGD随机梯度下降一样,都是一种求解算法模型超参数(模型分布)的方法。

贝叶斯推断更侧重于先验和证据的动态融合,得到极大后验概率估计;

极大似然估计更侧重于对训练样本的频率统计;

而SGD在各种场景下都能表现出较好的性能,通过反向梯度的思想,不断进行局部最优的求解,从而获取近似的全局最优解。

2. 贝叶斯框架

我们知道,对于我们感兴趣的估计,可以通过贝叶斯思想被解释为概率。在频率统计中,这个估计时通过统计得到的,而在贝叶斯估计中,估计时通过后验概率得到的。

我们已经从抽象概念上了解了何谓后验概率,后验概率即为:新证据对初始信念洗刷后的结果,即修正后的信念。这个概念怎么落实到数学计算上呢?

0x1:贝叶斯定理

我们需要一个方法能够将几个因素连接起来,即先验概率、我们的证据、后验概率。这个方法就是贝叶斯定理,得名于它的创立者托马斯.贝叶斯。

上面的公式并不等同于贝叶斯推断,它是一个存在于贝叶斯推断之外的数学真理。或者应该说贝叶斯推断是在贝叶斯定理的基石上建立起来的。

在贝叶斯推断里,贝叶斯定理公式仅仅被用来连接先验概率 P(A) 和更新后的后验概率 P(A|B)

0x2:一个贝叶斯推断的例子 - 图书管理员还是农民

斯蒂文是一个害羞的人,他乐于助人,但是他对其他人不太关注。他非常乐见事情处于合理的顺序,并对他的工作非常细心。从特征工程的角度来看,似乎我们更应该判定史蒂文为已个图书管理员。

但是这里忽略了一个非常重要的先验知识,即男性图书管理员的人数只有男性农民的 1/20,这个先验知识将极大改变史蒂文是否是图书管理员这个事件的后验概率。

1. 形式化定义这个问题

把问题简化,假设世上只有两种职业,图书管理员和农民,并且农民的数量确实是图书管理员的20倍。

设事件 A 为史蒂文是一个图书管理员。如果我们没有史蒂文的任何信息,那么 P(A) = 1/21。这是我们的先验。

我们假设从史蒂文的邻居们那里我们获得了关于他的一些信息,我们称它们为 X,我们想知道的就是 P(A|X)。由贝叶斯定理得:P(A|X) = P(X|A) * P(A) / P(X)。

P(X|A)被定义为在史蒂文真的是一个图书管理员的情况下,史蒂文的邻居们给出的某种描述的概率,即如果史蒂文真的是一个图书管理员,他的邻居们将他描述为一个图书管理员的概率。这个值很可能接近于1,假设它为 0.95。

P(X) 可以解释为:任何人史蒂文的描述和史蒂文邻居的描述一致的概率,我们将其做逻辑上的改造:

P(X) = P(X and A) + P(X and ~A) = P(X|A)P(A) + P(X|~A)P(~A)

P(X|A)P(A) 这两个值我们都已经知道了。另外,~A 表示史蒂文不是一个图书管理员的概率,那么他一定是一个农民。所以 P(~A) = 1 - P(A) = 20 / 21。

P(X|~A) 即在史蒂文是一个农名的情况下,史蒂文的邻居给出的某个描述的概率,我们假设其为 0.5。

综上,P(X) = 0.95 * 1/24 + 0.5 * 20/21 = 0.515773809524

带入贝叶斯定理公式,P(A|X) = 0.95 * 1/20 / 0.515773809524 = 0.0877091748413

可以看到,因为农民数量远大于图书管理员,所以后验概率并不算高,尽管我们看到 P(X|A)的概率要大于 P(X|~A),即我们得到的特征描述更倾向于表明史蒂文是一个图书管理员。

这个例子非常好的阐述了,先验概率以及证据时如何动态影响最终的后验概率结果的。

2. 通过可视化的代码呈现该问题

# -*- coding: utf- -*-
import numpy as np
from matplotlib import pyplot as plt plt.rcParams['savefig.dpi'] =
plt.rcParams['figure.dpi'] = colours = ["#348ABD", "#A60628"] prior = [/., /.] # 图书管理员和农民的先验概率分别是 / 和 /
posterior = [0.087, -0.087] # 后验概率
plt.bar([, .], prior, alpha=0.70, width=0.25,
color=colours[], label="prior distribution",
lw="", edgecolor=colours[]) plt.bar([ + 0.25, . + 0.25], posterior, alpha=0.7,
width=0.25, color=colours[],
label="posterior distribution",
lw="", edgecolor=colours[]) plt.ylim(, )
plt.xticks([0.20, 0.95], ['Librarian', 'Farmer'])
plt.title("Prior and Posterior probability of Steve's occupation")
plt.ylabel("Probability")
plt.legend(loc="upper left") plt.show()

可以看到,在得到 X 的观测值之后,史蒂文为图书管理员的后台概率增加了。同时,农民的后验概率降低了。

但同时也看到,史蒂文为图书管理员的后验概率增加的并不是很多,史蒂文是农民的可能性依旧很大。

这表明,先验概率对贝叶斯推断影响是很大的,例如我们假设一台服务器平时不会被黑客攻陷(IOC),但是如果观测到一系列的异常事件,被攻陷的后验概率就会不断增大,但这取决于观测到的现象的数量和强度。

3. 一个从短信数据推断行为模式的例子 - 使用计算机执行贝叶斯推断

0x1:场景描述 - 我们的数据是什么样的?

下面的直方图显示了一段时间内的短信数量的统计。

# -*- coding: utf- -*-
import numpy as np
from matplotlib import pyplot as plt count_data = np.loadtxt("data/txtdata.csv")
n_count_data = len(count_data)
plt.bar(np.arange(n_count_data), count_data, color="#348ABD") plt.xlabel("Time (days)")
plt.ylabel("count of text-msgs received")
plt.title("Did the user's texting habits change over time?")
plt.xlim(, n_count_data) plt.show()

数据集下载链接

0x2:问题定义 - 我们要从数据中挖掘出什么东西?

我们的问题是:这段时间内用户的行为出现了什么变化吗?或者是说,这段时间内是否出现了异常的行为模式,又具体是几号发生的?

这特别像安全攻防领域经常面对的一个问题,即在一段日志中进行数据挖掘,从中找出是否存在异常行为模式(即入侵IOC)。

通常来说,一个直观的想法可能会是这样,我们通过ngram或者定长的时间窗口进行日志聚合,然后通过人工经验聚合中抽取一系列的特征,并希望借助有监督或者无监督的方法直接得到一个 0/1 判断,即这个窗口期间内是否存在异常点。这是一种典型的端到端判断场景。

但是其实我觉得应该更灵活地理解算法,不一定每一个场景都适合使用判别式模型进行二分或者多分判断,有时候,我们其实可以尝试使用生成式模型,基于训练数据,得到一个或多个概率分布生成式。而多个生成式模型之间的分界点,很可能就是代表了一种模式跃迁,即行为异常。

0x3:使用什么生成式模型进行数据拟合?

1. 二项分布?正态分布?泊松分布?

二项分布,正态分布,泊松分布这3个都是对自然界的事物在一定时间内的发生次数进行泛化模拟的分布模型。实际上,它们3个之间相差并不是很大。

如果忽略分布是离散还是连续的前提(二项分布和泊松分布一样都是离散型概率分布,正态分布是连续型概率分布),二项分布与泊松分布以及正态分布至少在形状上是十分接近的,也即两边低中部高。

当 n 足够大,p 足够小(事件间彼此独立,事件发生的概率不算太大,事件发生的概率是稳定的),二项分布逼近泊松分布,λ=np;

一个被广泛接受的经验法则是如果 n≥20,p≤0.05,可以用泊松分布来估计二项分布值。
至于正态分布是一个连续分布 当实验次数 n 再变大,几乎可以看成连续时二项分布和泊松分布都可以用正态分布来代替。

2. 单位时间内随机事件发生的次数趋近于一个相对固定值 - 选泊松分布

在日常生活中,大量事件我们可以预见其在时间窗口内的总数,但是无法准确知道具体某个时刻发生的次数。例如

. 某医院平均每小时出生3个婴儿;
. 某公司平均每10分钟接到1个电话;
. 某超市平均每天销售4包 xx 牌奶粉;
. 某网站平均每分钟有2次访问;

这些事件的特点就是,我们可以预估这些事件的总数,但是没法具体知道发生时间。例如医院具体下一小时的前10分钟出现几个婴儿,有可能前10分钟出现1个,也可能一下子出生3个。

泊松分布就是描述某段时间内,事件具体的发生概率

P 表示概率,N 表示某种函数关系,t 表示时间,n 表示数量,λ 表示事件的频率。

从公式上看,我们得到几个泊松分布的基本判断:

1. 单位时间内发生 n 次数的概率随着时间 t 变化;

2. 概率受发生次数 n 的影响;

3. λ 相当于这件事的先验属性,在整个时间周期内都影响了最终的概率,λ 被称为此分布的一个超参数,它决定了这个分布的形式。

λ 可以位任意正数,随着 λ 的增加,得到大值的概率会增大。相反地,当 λ 减小时,得到小值的概率会增大。λ 可以被称为 Poisson分布的强度。

接下来两个小时,一个婴儿都不出现的概率是(已知 λ = 3):

基本不可能发生。

接下来一个小时,至少出现两个婴儿的概率是:

即 80%。

泊松分布的图像大概是这样的:

可以看到,在频率附近,事件发生的概率最高,然后向两边对称下降。每小时出生 3 个婴儿,这是最可能的结果,出生得越多或越少,就越不可能。

Poisson分布的一个重要性质是:它的期望值等于它的参数。即:E[Z|λ] = λ。

下图展示了不同 λ 取值下的概率质量分布,可以看到,随着 λ 的增加,取到大值的概率会增加。

# -*- coding: utf- -*-
import numpy as np
from matplotlib import pyplot as plt import scipy.stats as stats
a = np.arange()
poi = stats.poisson
lambda_ = [1.5, 4.25]
colours = ["#348ABD", "#A60628"] plt.bar(a, poi.pmf(a, lambda_[]), color=colours[],
label="$\lambda = %.1f$" % lambda_[], alpha=0.60,
edgecolor=colours[], lw="") plt.bar(a, poi.pmf(a, lambda_[]), color=colours[],
label="$\lambda = %.1f$" % lambda_[], alpha=0.60,
edgecolor=colours[], lw="") plt.xticks(a + 0.4, a)
plt.legend()
plt.ylabel("probability of $k$")
plt.xlabel("$k$")
plt.title("Probability mass function of a Poisson random variable; differing \
$\lambda$ values") plt.show()

3. 用单个泊松分布就足够拟合数据集了吗?

好!我们现在已经确定要使用泊松分布来对数据集进行拟合。接下来的问题是,我们是不是只要用单个泊松分布就足够对这份数据集进行完美拟合了呢?

我们再来看看我们的问题场景。

我们这里通过观察数据,我们认为在某个时间段,发生了一个行为模式的突变,即在后期,收到短信的频率好像提高了。

实际上,这已经进入到异常检测的范畴内了,我们可以基于泊松分布混合模型对这个数据集进行拟合。

4. 怎么形式化描述泊松分布参数 λ 的阶跃情况?

我们不能确定参数 λ 的真实取值,但是可以猜测在某个时段 λ 增加了(λ取大值时,更容易得到较大的结果值),也即一天收到的短信条数比较多的概率增大了。

我们怎么形式化地描述这个现象呢?假设在某一个时间段内(用τ表示)(τ可能也无法准确定义到具体的某一天),参数

贝叶斯推断 && 概率编程初探的更多相关文章

  1. 概率编程:《贝叶斯方法概率编程与贝叶斯推断》中文PDF+英文PDF+代码

    贝叶斯推理的方法非常自然和极其强大.然而,大多数图书讨论贝叶斯推理,依赖于非常复杂的数学分析和人工的例子,使没有强大数学背景的人无法接触.<贝叶斯方法概率编程与贝叶斯推断>从编程.计算的角 ...

  2. 贝叶斯推断之最大后验概率(MAP)

    贝叶斯推断之最大后验概率(MAP) 本文详细记录贝叶斯后验概率分布的数学原理,基于贝叶斯后验概率实现一个二分类问题,谈谈我对贝叶斯推断的理解. 1. 二分类问题 给定N个样本的数据集,用\(X\)来表 ...

  3. 如何通俗理解贝叶斯推断与beta分布?

    有一枚硬币(不知道它是否公平),假如抛了三次,三次都是“花”: 能够说明它两面都是“花”吗? 1 贝叶斯推断 按照传统的算法,抛了三次得到三次“花”,那么“花”的概率应该是: 但是抛三次实在太少了,完 ...

  4. (main)贝叶斯统计 | 贝叶斯定理 | 贝叶斯推断 | 贝叶斯线性回归 | Bayes' Theorem

    2019年08月31日更新 看了一篇发在NM上的文章才又明白了贝叶斯方法的重要性和普适性,结合目前最火的DL,会有意想不到的结果. 目前一些最直觉性的理解: 概率的核心就是可能性空间一定,三体世界不会 ...

  5. 朴素贝叶斯算法下的情感分析——C#编程实现

    这篇文章做了什么 朴素贝叶斯算法是机器学习中非常重要的分类算法,用途十分广泛,如垃圾邮件处理等.而情感分析(Sentiment Analysis)是自然语言处理(Natural Language Pr ...

  6. C#编程实现朴素贝叶斯算法下的情感分析

    C#编程实现 这篇文章做了什么 朴素贝叶斯算法是机器学习中非常重要的分类算法,用途十分广泛,如垃圾邮件处理等.而情感分析(Sentiment Analysis)是自然语言处理(Natural Lang ...

  7. 基于贝叶斯网(Bayes Netword)图模型的应用实践初探

    1. 贝叶斯网理论部分 笔者在另一篇文章中对贝叶斯网的理论部分进行了总结,在本文中,我们重点关注其在具体场景里的应用. 2. 从概率预测问题说起 0x1:条件概率预测模型之困 我们知道,朴素贝叶斯分类 ...

  8. python实现贝叶斯网络的概率推导(Probabilistic Inference)

    写在前面 这是HIT2019人工智能实验三,由于时间紧张,代码没有进行任何优化,实验算法仅供参考. 实验要求 实现贝叶斯网络的概率推导(Probabilistic Inference) 具体实验指导书 ...

  9. NeurIPS 2018 中的贝叶斯研究

    NeurIPS 2018 中的贝叶斯研究 WBLUE 2018年12月21日   雷锋网 AI 科技评论按:神经信息处理系统大会(NeurIPS)是人工智能领域最知名的学术会议之一,NeurIPS 2 ...

随机推荐

  1. 魅族5.0以上设备(亲测有效)激活Xposed框架的流程

    对于喜欢研究手机的哥们来说,大多时候会使用到Xposed框架及种种功能强大的模块,对于5.0以下的系统版本,只要手机能获得ROOT权限,安装和激活Xposed框架是比较简单的,但随着系统版本的持续更新 ...

  2. Eclipse导出包含第三方Jar的工程

    基于第三方开源的Jar包封装了一个工具类,在导出成Jar包后,引用新生成的Jar包,却报找不到类的错误.看了一下生成的Jar包,发现根本没有包含第三方Jar包的相关class.这是导出第三方Jar包时 ...

  3. typescript类的修饰符

    学习过java的小姐姐,小哥哥应该很好理解,但还是啰嗦的写出来! typescript里面定义属性的时候给我们提供了 三种修饰符 public :公有 在当前类里面. 子类 .类外面都可以访问 pro ...

  4. 关掉那些windows上因权限无法关闭的服务

    ProcessExplorer 下载地址 :https://docs.microsoft.com/en-us/sysinternals/downloads/process-explorer 以管理员身 ...

  5. Oracle中用序列和触发器实现ID自增

    在设计数据库的时候,Oracle中没有类似SQL Server中系统自动分配ID作为主键的功能,这时Oracle可以通过“序列”和“触发器”来实现ID自动增加的功能. 1.创建序列Sequence c ...

  6. web安全—sql注入漏洞

    SQL注入-mysql注入 一.普通的mysql注入 MySQL注入不像注入access数据库那样,不需要猜.从mysql5.0以上的版本,出现一个虚拟的数据库,即:information_schem ...

  7. hadoop wordcout测试

    hadoop wordcout测试 安装好hadoop 环境后,启动HDFS等服务:输密码 1004 start-all.sh 查看启动情况 1006 jps 1007 cd ~ 切换到用户默认目录 ...

  8. java学习入门之---使用idea创建第一个maven项目

    一.准备条件: 1.安装idea旗舰版 2.安装tomcat 二.打开idea开始创建 1.创建Project 2.选择项目类型为maven 3.输入组名和项目名 ---> 下一步 ----&g ...

  9. SQL FIRST() 函数

    FIRST() 函数 FIRST() 函数返回指定的字段中第一个记录的值. 提示:可使用 ORDER BY 语句对记录进行排序. SQL FIRST() 语法 SELECT FIRST(column_ ...

  10. Command "python setup.py egg_info" failed with error code 1 in C:\Users\w5659\AppData\Local\Temp\pip-install-t7uomu4r\xa dmin\

    Error msg: C:\Users\w5659>pip install xadmin Collecting xadmin Using cached https://files.pythonh ...