乐趣区

关于人工智能:蒙特卡罗计算积分

作者 |Cory Maklin
编译 |VK
起源 |Towards Datas Science

通常状况下,咱们不能解析地求解积分,必须借助其余办法,其中就包含蒙特卡罗积分。你可能还记得,函数的积分能够解释为函数曲线下的面积。

蒙特卡罗积分的工作原理是在 a 和 b 之间的不同随机点计算一个函数,将矩形的面积相加,取和的平均值。随着点数的减少,所得后果靠近于积分的理论解。

蒙特卡罗积分用代数示意:

与其余数值办法相比,蒙特卡罗积分特地适宜于计算奇数形态的面积。

在上一节中,咱们看到如何应用蒙特卡罗积分来确定后验概率,当咱们晓得先验和似然,但短少规范化常数。

贝叶斯统计

后验概率是指贝叶斯公式中的一个特定项。

贝叶斯定理能够用来计算一个人在某一特定疾病的筛查测试中呈阳性的人实际上患有该病的概率。

如果咱们曾经晓得 P(A),P(B)和 P(B | A),但想晓得 P(A | B),咱们就用这个公式。例如,假如咱们正在检测一种感化 1% 人口的常见疾病。医学专业人员曾经开发出一种高度敏感和特异的检测办法,但还不够欠缺。

  • 99% 的病人检测呈阳性
  • 99% 的衰弱患者检测为阴性

贝叶斯定理通知咱们:

假如咱们有 10000 人,100 人生病,9900 人衰弱。此外,在给他们所有的测试后,咱们会让 99 个生病的人测试生病,然而 99 个衰弱的人也测试生病。因而,咱们将失去以下概率。

p(sick) = 0.01

p(not sick) = 1–0.01 = 0.99

p(+|sick) = 0.99

p(+|not sick) = 0.01

Bayes 定理在概率分布中的利用

在后面的例子中,咱们假如一个人患病的先验概率是一个已知的量,准确到 0.001。

然而,在事实世界中,认为 0.001 的概率事实上如此准确是不合理的。一个给定的人患病的概率会因其年龄、性别、体重等而有很大差别。一般来说,咱们对给定先验概率的意识还远远不够欠缺,因为它是从以前的样本中得出的(这意味着不同的人群可能会对先验概率给出不同的预计)。

在贝叶斯统计中,咱们能够用先验概率的散布来代替这个 0.001 的值,这个散布捕获了咱们对于其实在值的先验不确定性。蕴含先验概率散布最终产生的后验概率也不再是繁多数量;相同,后验概率也变成了概率分布。这与传统的观点相同,后者假如参数是固定的量。

归一化常数

正如咱们在 Gibbs 抽样和 Metropolis-Hasting 的文章中看到的,蒙特卡洛办法能够用来计算归一化常数未知时的后验概率分布。

让咱们来探索一下为什么咱们首先须要一个标准化常数。在概率论中,规范化常数是一个函数必须乘以的常数,因而它的图下面积为 1。还是不分明?让咱们看一个例子。

回忆一下正态分布的函数能够写成:

2*pi 的平方根是归一化常数。

让咱们来看看咱们是如何确定它的。咱们从以下函数开始(假如均值为 0,方差为 1):

如果咱们能画出一个曲线的话。

问题在于,如果咱们取曲线下的面积,它不等于 1,这要求它是一个概率密度函数。因而,咱们将函数除以积分的后果(归一化常数)。

回到手头的问题,即如何在没有归一化常数的状况下计算后验概率……事实证明,对于间断样本空间,规范化常数能够重写为:

在这一点上,你应该思考蒙特卡罗积分!

Python 代码

让咱们看看如何通过在 Python 中执行蒙特卡洛积分来确定后验概率。咱们从导入所需的库开始,并设置随机种子以确保后果是可反复的。

import os
import sys
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import scipy.stats as st

np.random.seed(42)

而后咱们设置 β 散布和二项分布的参数值。

a, b = 10, 10
n = 100
h = 59
thetas = np.linspace(0, 1, 200)

概率密度函数的范畴从 0 到 1。因而,咱们能够简化方程。

在代码中,后面的等式写如下:

prior = st.beta(a, b).pdf(thetas)
likelihood = st.binom(n, thetas).pmf(h)
post = prior * likelihood
post /= (post.sum() / len(thetas))

最初,咱们将先验、后验和似然的概率密度函数可视化。

plt.figure(figsize=(12, 9))
plt.plot(thetas, prior, label='Prior', c='blue')
plt.plot(thetas, n*likelihood, label='Likelihood', c='green')
plt.plot(thetas, post, label='Posterior', c='red')
plt.xlim([0, 1])
plt.xlabel(r'$\theta$', fontsize=14)
plt.ylabel('PDF', fontsize=16)
plt.legend();

论断

蒙特卡罗积分是求解积分的一种数值办法。它的工作原理是在随机点对函数求值,求和所述值,而后计算它们的平均值。

原文链接:https://towardsdatascience.co…

欢送关注磐创 AI 博客站:
http://panchuang.net/

sklearn 机器学习中文官网文档:
http://sklearn123.com/

欢送关注磐创博客资源汇总站:
http://docs.panchuang.net/

退出移动版