隐马尔可夫模型(Hidden Markov Model,HMM)

HMM和CRF

HMM使用隐含变量生成可观测状态,其生成概率由标注集统计得到,是一个生成模型。其它常见的生成式模型有:Gaussian、Naive Bayes、Mixtures of multinomials等。

CRF就像一个反向的隐马尔可夫模型(HMM),通过可观测状态判别隐含变量,其概率亦通过标注集统计得来,是一个判别模型。其它常见的判别式模型有:K近邻法、感知机、决策树、逻辑斯蒂回归模型、最大熵模型、支持向量机、提升方法等。

隐马尔可夫模型(Hidden Markov Model,HMM)_第1张图片
隐马尔可夫模型(Hidden Markov Model,HMM)_第2张图片
隐马尔可夫模型(Hidden Markov Model,HMM)_第3张图片
隐马尔可夫模型(Hidden Markov Model,HMM)_第4张图片
隐马尔可夫模型(Hidden Markov Model,HMM)_第5张图片
隐马尔可夫模型(Hidden Markov Model,HMM)_第6张图片

举个例子:

隐马尔可夫模型(Hidden Markov Model,HMM)_第7张图片

解题过程:

隐马尔可夫模型(Hidden Markov Model,HMM)_第8张图片
隐马尔可夫模型(Hidden Markov Model,HMM)_第9张图片

Viterbi算法:求解最可能的天气

states = ('Rainy', 'Sunny')

observations = ('walk', 'shop', 'clean')

start_probability = {'Rainy': 0.6, 'Sunny': 0.4}

transition_probability = {
    'Rainy': {'Rainy': 0.7, 'Sunny': 0.3},
    'Sunny': {'Rainy': 0.4, 'Sunny': 0.6},
}

emission_probability = {
    'Rainy': {'walk': 0.1, 'shop': 0.4, 'clean': 0.5},
    'Sunny': {'walk': 0.6, 'shop': 0.3, 'clean': 0.1},
}


# 打印路径概率表
def print_dptable(V):
    print("    ",)
    for i in range(len(V)):
        print("%10d" % i,"\t",end="")
    print()

    for y in V[0].keys():
        print("%.4s: " % y,"\t",end="")
        for t in range(len(V)):
            print("%.7s" % ("%f" % V[t][y]),"\t",end="")
        print()


def viterbi(obs, states, start_p, trans_p, emit_p):
    """

    :param obs:观测序列
    :param states:隐状态
    :param start_p:初始概率(隐状态)
    :param trans_p:转移概率(隐状态)
    :param emit_p: 发射概率 (隐状态表现为显状态的概率)
    :return:
    """
    # 路径概率表 V[时间][隐状态] = 概率
    V = [{}]
    # 一个中间变量,代表当前状态是哪个隐状态
    path = {}

    # 初始化初始状态 (t == 0)
    for y in states:
        V[0][y] = start_p[y] * emit_p[y][obs[0]]
        path[y] = [y]

    # 对 t > 0 跑一遍维特比算法
    for t in range(1, len(obs)):
        V.append({})
        newpath = {}

        for y in states:
            # 概率 隐状态 =    前状态是y0的概率 * y0转移到y的概率 * y表现为当前状态的概率
            (prob, state) = max([(V[t - 1][y0] * trans_p[y0][y] * emit_p[y][obs[t]], y0) for y0 in states])
            # 记录最大概率
            V[t][y] = prob
            # 记录路径
            newpath[y] = path[state] + [y]

        # 不需要保留旧路径
        path = newpath

    print_dptable(V)
    (prob, state) = max([(V[len(obs) - 1][y], y) for y in states])
    return (prob, path[state])


def example():
    return viterbi(observations,
                   states,
                   start_probability,
                   transition_probability,
                   emission_probability)


print(example())

输出显示:
隐马尔可夫模型(Hidden Markov Model,HMM)_第10张图片

你可能感兴趣的:(TensorFlow)