条件随机场
概率无向图模型是由无向图表示的联合概率分布
无向图上的结点之间的连接关系表示了联合分布的随机变量集合之间的条件独立性,即马尔可夫性
因此,概率无向图模型也称为马尔可夫随机场。
概率无向图模型或马尔可夫随机场的联合概率分布可以分解为无向图最大团上的正值函数的乘积的形式。
条件随机场是给定输入随机变量 X X X条件下,输出随机变量 Y Y Y的条件概率分布模型, 其形式为参数化的对数线性模型
条件随机场的最大特点是假设输出变量之间的联合概率分布构成概率无向图模型,即马尔可夫随机场
条件随机场是判别模型
线性链条件随机场是定义在观测序列与标记序列上的条件随机场
线性链条件随机场一般表示为给定观测序列条件下的标记序列的条件概率分布,由参数化的对数线性模型表示
模型包含特征及相应的权值,特征是定义在线性链的边与结点上的。线性链条件随机场的数学表达式是
P
(
y
∣
x
)
=
1
Z
(
x
)
exp
(
∑
i
,
k
λ
k
t
k
(
y
i
−
1
,
y
i
,
x
,
i
)
+
∑
i
,
l
μ
l
s
l
(
y
i
,
x
,
i
)
)
P(y | x)=\frac{1}{Z(x)} \exp \left(\sum_{i, k} \lambda_{k} t_{k}\left(y_{i-1}, y_{i}, x, i\right)+\sum_{i, l} \mu_{l} s_{l}\left(y_{i}, x, i\right)\right)
P(y∣x)=Z(x)1exp⎝⎛i,k∑λktk(yi−1,yi,x,i)+i,l∑μlsl(yi,x,i)⎠⎞
其中,
Z
(
x
)
=
∑
y
exp
(
∑
i
,
k
λ
k
t
k
(
y
i
−
1
,
y
i
,
x
,
i
)
+
∑
i
,
l
μ
l
s
l
(
y
i
,
x
,
i
)
)
Z(x)=\sum_{y} \exp \left(\sum_{i, k} \lambda_{k} t_{k}\left(y_{i-1}, y_{i}, x, i\right)+\sum_{i, l} \mu_{l} s_{l}\left(y_{i}, x, i\right)\right)
Z(x)=y∑exp⎝⎛i,k∑λktk(yi−1,yi,x,i)+i,l∑μlsl(yi,x,i)⎠⎞
线性链条件随机场的概率计算通常利用前向-后向算法。
条件随机场的学习方法通常是极大似然估计方法或正则化的极大似然估计
即在给定训练数据下,通过极大化训练数据的对数似然函数以估计模型参数
具体的算法有改进的迭代尺度算法、梯度下降法、拟牛顿法等
线性链条件随机场的一个重要应用是标注
维特比算法是给定观测序列求条件概率最大的标记序列的方法
实践
假设随机矩阵
M
1
(
x
)
,
M
2
(
x
)
,
M
3
(
x
)
,
M
4
(
x
)
M_1(x),M_2(x),M_3(x),M_4(x)
M1(x),M2(x),M3(x),M4(x)分别是
M
1
(
x
)
=
[
0
0
0.5
0.5
]
,
M
2
(
x
)
=
[
0.3
0.7
0.7
0.3
]
M_1(x)=
M
3
(
x
)
=
[
0.5
0.5
0.6
0.4
]
,
M
4
(
x
)
=
[
0
1
0
1
]
M_3(x)=
求以
s
t
a
r
t
=
2
start=2
start=2为起点
s
t
o
p
=
2
stop=2
stop=2为终点的所有路径的状态序列
y
y
y的概率及概率最大的状态序列。
import numpy as np
# 创建随机矩阵
M1 = [[0, 0], [0.5, 0.5]]
M2 = [[0.3, 0.7], [0.7, 0.3]]
M3 = [[0.5, 0.5], [0.6, 0.4]]
M4 = [[0, 1], [0, 1]]
M = [M1, M2, M3, M4]
# 生成路径
path = [2]
for i in range(1, 4):
paths = []
for _, r in enumerate(path):
temp = np.transpose(r)
paths.append(np.append(temp, 1))
paths.append(np.append(temp, 2))
path = paths.copy()
path = [np.append(r, 2) for _, r in enumerate(path)]
# 计算概率
pr = []
for _, row in enumerate(path):
p = 1
for i in range(len(row) - 1):
a = row[i]
b = row[i + 1]
p *= M[i][a - 1][b - 1]
pr.append((row.tolist(), p))
pr = sorted(pr, key=lambda x: x[1], reverse=True)
# 打印结果
print("以start=2为起点stop=2为终点的所有路径的状态序列y的概率为:")
for path, p in pr:
print(" 路径为:" + "->".join([str(x) for x in path]), end=" ")
print("概率为:" + str(p))
print("概率[" + str(pr[0][1]) + "]最大的状态序列为:",
"->".join([str(x) for x in pr[0][0]]))
运行结果
以start=2为起点stop=2为终点的所有路径的状态序列y的概率为:
路径为:2->1->2->1->2 概率为:0.21
路径为:2->2->1->1->2 概率为:0.175
路径为:2->2->1->2->2 概率为:0.175
路径为:2->1->2->2->2 概率为:0.13999999999999999
路径为:2->2->2->1->2 概率为:0.09
路径为:2->1->1->1->2 概率为:0.075
路径为:2->1->1->2->2 概率为:0.075
路径为:2->2->2->2->2 概率为:0.06
概率[0.21]最大的状态序列为: 2->1->2->1->2