机器学习之隐马尔科夫模型完整Python代码实现

encoding=utf8

import numpy as np
import csv

class HMM(object):
def init(self,N,M):
self.A = np.zeros((N,N)) # 状态转移概率矩阵
self.B = np.zeros((N,M)) # 观测概率矩阵
self.Pi = np.array([1.0/N]*N) # 初始状态概率矩阵

    self.N = N                      # 可能的状态数
    self.M = M                      # 可能的观测数

def cal_probality(self, O):
    self.T = len(O)
    self.O = O

    self.forward()
    return sum(self.alpha[self.T-1])

def forward(self):
    """
    前向算法
    """
    self.alpha = np.zeros((self.T,self.N))

    # 公式 10.15
    for i in range(self.N):
        self.alpha[0][i] = self.Pi[i]*self.B[i][self.O[0]]

    # 公式10.16
    for t in range(1,self.T):
        for i in range(self.N):
            sum = 0
            for j in range(self.N):
                sum += self.alpha[t-1][j]*self.A[j][i]
            self.alpha[t][i] = sum * self.B[i][self.O[t]]

def backward(self):
    """
    后向算法
    """
    self.beta = np.zeros((self.T,self.N))

    # 公式10.19
    for i in range(self.N):
        self.beta[self.T-1][i] = 1

    # 公式10.20
    for t in range(self.T-2,-1,-1):
        for i in range(self.N):
            for j in range(self.N):
                self.beta[t][i] += self.A[i][j]*self.B[j][self.O[t+1]]*self.beta[t+1][j]

def cal_gamma(self, i, t):
    """
    公式 10.24
    """
    numerator = self.alpha[t][i]*self.beta[t][i]
    denominator = 0

    for j in range(self.N):
        denominator += self.alpha[t][j]*self.beta[t][j]

    return numerator/denominator

def cal_ksi(self, i, j, t):
    """
    公式 10.26
    """

    numerator = self.alpha[t][i]*self.A[i][j]*self.B[j][self.O[t+1]]*self.beta[t+1][j]
    denominator = 0

    for i in range(self.N):
        for j in range(self.N):
            denominator += self.alpha[t][i]*self.A[i][j]*self.B[j][self.O[t+1]]*self.beta[t+1][j]

    return numerator/denominator

def init(self):
    """
    随机生成 A,B,Pi
    并保证每行相加等于 1
    """
    import random
    for i in range(self.N):
        randomlist = [random.randint(0,100) for t in range(self.N)]
        Sum = sum(randomlist)
        for j in range(self.N):
            self.A[i][j] = randomlist[j]/Sum

    for i in range(self.N):
        randomlist = [random.randint(0,100) for t in range(self.M)]
        Sum = sum(randomlist)
        for j in range(self.M):
            self.B[i][j] = randomlist[j]/Sum

def train(self, O, MaxSteps = 100):
    self.T = len(O)
    self.O = O

    # 初始化
    self.init()

    step = 0
    # 递推
    while step

def triangle(length):
”’
三角波
”’
X = [i for i in range(length)]
Y = []

for x in X:
    x = x % 6
    if x <= 3:
        Y.append(x)
    else:
        Y.append(6-x)
return X,Y

def sin(length):
”’
三角波
”’
import math
X = [i for i in range(length)]
Y = []

for x in X:
    x = x % 20
    Y.append(int(math.sin((x*math.pi)/10)*50)+50)
return X,Y

def show_data(x,y):
import matplotlib.pyplot as plt
plt.plot(x, y, ‘g’)
plt.show()

return y

if name == ‘main‘:
hmm = HMM(10,4)
tri_x, tri_y = triangle(20)

hmm.train(tri_y)
y = hmm.generate(100)
x = [i for i in range(100)]
show_data(x,y)

# hmm = HMM(15,101)
# sin_x, sin_y = sin(40)
# show_data(sin_x, sin_y)
# hmm.train(sin_y)
# y = hmm.generate(100)
# x = [i for i in range(100)]
# show_data(x,y)

runfile(‘D:/tjxlx/xlx/hmm/hmm.py’, wdir=’D:/tjxlx/xlx/hmm’)
Reloaded modules: generate_dataset
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
DEBUG:matplotlib.font_manager:findfont: Matching :family=sans-serif:style=normal:variant=normal:weight=normal:stretch=normal:size=10.0 to DejaVu Sans (‘D:\li\anaconda\lib\site-packages\matplotlib\mpl-data\fonts\ttf\DejaVuSans.ttf’) with score of 0.050000
机器学习之隐马尔科夫模型完整Python代码实现_第1张图片

你可能感兴趣的:(深度学习)