问题:
开发一个新的油藏,普遍的方法是分析一个与之相似的油藏来得到我们想要的数据。但是不容易找到一个合适的、相似的样本进行分析,所以这种方法预估的储量不准确。
普通的解决方案:
- 使用MCMC算法进行建模:缺点是,对于高维问题需要大量内存和时间,并且它没有找到参数之间的关系。
- 使用CIPF:需要对依赖结构有一定的理解,并且收敛的速度慢。
- 使用copula:专家要对copula族进行抉择。
作者提出的方案:
使用机器学习技术对油藏储层特点进行自动化分析和建模。我们该选择哪种机器学习方法呢?作者选择使用贝叶斯学习。(至于为什么,文中描述的原因我理解的不是很清楚,所以这里暂时不记录缘由)。
下面我们介绍一下贝叶斯网络结构的定义:贝叶斯网络从图形上看就是个DAG图,每个顶点都表示一个随机变量。对于每个顶点
X
i
X_i
Xi都满足:
(
X
i
⊥
NonDescendants
X
i
∣
P
a
X
i
G
)
\left(X_i \perp \text { NonDescendants } X_i \mid P a_{X_i}^G\right)
(Xi⊥ NonDescendants Xi∣PaXiG)
其中
P
a
X
i
G
P a_{X_i}^G
PaXiG代表图G中
X
i
X_i
Xi的父节点,
NonDescendants
X
i
\text { NonDescendants } X_i
NonDescendants Xi代表图中不是
X
i
X_i
Xi的子节点的节点。
整个表达式的意思就是:顶点
X
i
X_i
Xi它独立于除了它自己的父节点之外的所有不是它子节点的顶点(也可以理解成除了父节点和子节点,与其他节点都是独立的)
factorization定义:假如
G
G
G是随机变量
X
1
、
X
2
、
.
.
.
X
n
X_1、X_2、...X_n
X1、X2、...Xn的贝叶斯网络,如果P满足
P
(
X
1
,
…
,
X
n
)
=
∏
i
=
1
n
P
(
X
i
∣
P
a
X
i
G
)
P\left(X_1, \ldots, X_n\right)=\prod_{i=1}^n P\left(X_i \mid P a_{X_i}^G\right)
P(X1,…,Xn)=i=1∏nP(Xi∣PaXiG)我们就说P是根据图G分解在相同空间上的分布(这里的理解有点生硬),但是上面这个式子不难,它所表达的意思就是
P
a
X
i
G
P a_{X_i}^G
PaXiG这个事件发生的条件下,
X
i
X_i
Xi发生的概率,然后求他们的乘积。例如:
P
(
X
1
∣
P
a
X
1
G
)
P
(
X
2
∣
P
a
X
2
G
)
…
…
P
(
X
n
∣
P
a
X
n
G
)
P\left(X_1 \mid P a_{X_1}^G\right)P\left(X_2 \mid P a_{X_2}^G\right)……P\left(X_n \mid P a_{X_n}^G\right)
P(X1∣PaX1G)P(X2∣PaX2G)……P(Xn∣PaXnG)
算法和方法
既然要使用贝叶斯网络模型,那对算法的学习是少不了的。
MixLearn@BN: Algorithm for mixed learning of Bayesian networks的伪代码如下图所示
首先来看看第一个程序片段(1-11行):该函数传入三个参数——1.顶点集D={x_1,……x_n} 2.边(专家想添加的边) 3.要移除的边(前提是允许移除)。该函数的输出就是贝叶斯网络。在函数体内,先对顶点集进行离散化操作得到集合
d
i
s
c
r
e
t
e
_
D
discrete\_D
discrete_D,然后使用HillClimbingSearch算法找到一个评分最高的模型,然后查看第三个参数的布尔值是什么,如果是ture,就可以将这条边移除,如果是false,就要将这条边加进模型当中。最后再通过参数学习
P
a
r
a
m
e
t
e
r
s
l
e
a
r
n
i
n
g
(
D
,
V
,
E
)
Parameters learning(D, {V, E} )
Parameterslearning(D,V,E)函数就可以得到我们想要的参数了。
接下来是函数
P
a
r
a
m
e
t
e
r
s
l
e
a
r
n
i
n
g
Parameters learning
Parameterslearning:
参数有两个,一个是顶点集D、一个是贝叶斯模型。输出是BN模型中每个节点的分布参数。
首先,我们遍历模型中的节点,如果该节点的值是离散的,且其父节点具有离散分布,那么我们就使用
C
P
T
(
n
o
d
e
,
p
a
r
e
n
t
s
(
n
o
d
e
)
,
D
)
CPT(node, parents(node), D)
CPT(node,parents(node),D)得到该节点的参数值。如果节点上的值是连续的,并且其父节点具有连续分布,则使用
G
a
u
s
s
i
a
n
(
n
o
d
e
,
D
)
Gaussian(node,D)
Gaussian(node,D),如果节点值是连续的,并且其父节点具有离散分布和连续分布,那么就是用…(后面就有点看不懂了)
总结:
首先我们要清楚贝叶斯建模方法有三种:依靠专家建模、从数据中学习、从知识库中创建。在一般情况下,我们都会综合使用三种方法,但如果我们不具备专家建模的条件,这个时候就会选择从数据中学习贝叶斯网络模型结构了。常用的学习方法有两个:基于依赖性测试的学习和基于搜索评分的学习。但是本文结合了上面两种方法,采用了一种混合的方法——首先对模型学习,作者使用相似性检测减少了训练样本,降低了搜索空间的复杂度,然后使用爬山算法(基于评分搜索)找到最佳网络。再对参数学习,使用了混合方法,它定义节点的分布有三种类型:(Conditional probabilities tables)CPT分布、高斯(Gaussian distribution)分布和条件高斯分布(Conditional Gaussian distribution)。