参考:https://blog.csdn.net/wxw_csdn/article/details/99632282
一 基础概念:
隐马尔可夫模型是关于时序的概率模型,描述由一个隐藏的马尔可夫链随机生成不可观测的状态随机序列,再由各个状态生成一个观测从而产生观测随机序列的过程。
HMM 的两个基本假设如下:
1 马尔科夫性,当前状态只与前一个时刻的状态有关而与其他时刻无关。
2 观测(变量分布)独立假设性,即任意时刻的观测到的变量的分布只依赖于该时刻的状态与其他时刻的状态和观测值无关。
状态序列:隐藏的马尔可夫链随机生成的状态序列;(不可见)
观测序列:每个状态生成一个观测,而由此产生的观测的随机序列。
时刻:序列的每一个位置。
维特比算法:已知的可以观察到的序列,和一些已知的状态转换之间的概率情况,通过综合状态之间的转移概率和前一个状态的情况计算出概率最大的状态转换路径,从而推断出隐含状态的序列的情况。
二 代码实现:
1.训练集和测试集数据Z-score标准化处理
s[0][c]=(s[0][c]-data_mean[c])/ data_std[c]
2.给六个类创建GaussianHMM(维度数量为2)
h=[hmm.GaussianHMM(n_components=NumHiddenStates,n_iter=100, tol=0.001) for x in range(6)]
3每个类别使用训练集进行训练
h[id].fit(observations, lengths)
4测试
for x in testDs:
inp=np.concatenate((np.reshape(x[0][0],(-1,1)),np.reshape(x[0][1],(-1,1))),axis=-1)
label=x[1][0][0]
scores=[]
for id in range(6):
try:
scores.append(h[id].score(inp))
except:
scores.append(-1e18)
# print(scores)
# print(label)
# print(np.argmax(scores))
cnt += (np.argmax(scores)+1 ==label)
print ("when NumHiddenStates is %d,the accuracy is %.6f"%(NumHiddenStates,(cnt / len(testDs))))
5结果
网友评论