06 隐马尔可夫模型 - 案例二 - GMHMM应用

05 隐马尔可夫模型 - 案例一 - hmmlearn框架说明

常规操作

import numpy as np
from hmmlearn import hmm
import matplotlib.pyplot as plt
import matplotlib as mpl
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
from sklearn.metrics.pairwise import pairwise_distances_argmin
import warnings

# 设置在jupyter中matplotlib的显示情况(默认inline是内嵌显示,通过设置为tk表示不内嵌显示)
%matplotlib tk

def expand(a, b):
    return 1.05*a-0.05*b, 1.05*b-0.05*a

warnings.filterwarnings("ignore")   # hmmlearn(0.2.0) < sklearn(0.18)
np.random.seed(28)
n = 5   # 隐状态数目
n_samples = 500 # 样本数量

pi = np.random.rand(n)
pi /= pi.sum()
print('初始概率:')
print(pi)

初始概率:
[ 0.28102534 0.21635059 0.04817319 0.1532667 0.30118418]

A = np.random.rand(n, n)
mask = np.zeros((n, n), dtype=np.bool)
mask[0][1] = mask[0][4] = True
mask[1][0] = mask[1][2] = True
mask[2][1] = mask[2][3] = True
mask[3][2] = mask[3][4] = True
mask[4][0] = mask[4][3] = True
A[mask] = 0
for i in range(n):
    A[i] /= A[i].sum()
print('转移概率:')
print(A)

转移概率:
[[ 0.2202672 0. 0.36791287 0.41181993 0. ]
[ 0. 0.4995834 0. 0.01356202 0.48685458]
[ 0.57655791 0. 0.10400763 0. 0.31943446]
[ 0.23695178 0.33043766 0. 0.43261056 0. ]
[ 0. 0.58044648 0.15883558 0. 0.26071794]]

# 给定均值
means = np.array(((30, 30, 30), (0, 50, 20), (-25, 30, 10),
   (-15, 0, 25), (15, 0, 40)), dtype=np.float)
for i in range(n):
    means[i,:] /= np.sqrt(np.sum(means ** 2, axis=1))[i]
print('均值:')
print(means)

均值:
[[ 0.57735027 0.57735027 0.57735027]
[ 0. 0.92847669 0.37139068]
[-0.62017367 0.74420841 0.24806947]
[-0.51449576 0. 0.85749293]
[ 0.35112344 0. 0.93632918]]

# 给定方差
covars = np.empty((n, 3, 3))
for i in range(n):
    covars[i] = np.diag(np.random.rand(3)*0.02+0.001)    # np.random.rand ∈[0,1)
print('方差:\n')
print(covars)

方差:
[[[ 0.0155071 0. 0. ]
[ 0. 0.02010293 0. ]
[ 0. 0. 0.00246192]]

[[ 0.00994326 0. 0. ]
[ 0. 0.01782236 0. ]
[ 0. 0. 0.00391079]]

[[ 0.01630543 0. 0. ]
[ 0. 0.0166357 0. ]
[ 0. 0. 0.01450157]]

[[ 0.00363404 0. 0. ]
[ 0. 0.00178606 0. ]
[ 0. 0. 0.01412046]]

[[ 0.00602365 0. 0. ]
[ 0. 0.02076837 0. ]
[ 0. 0. 0.01166766]]]


产生对应的模拟数据

model = hmm.GaussianHMM(n_components=n, covariance_type='full')
model.startprob_ = pi
model.transmat_ = A
model.means_ = means
model.covars_ = covars
sample, labels = model.sample(n_samples=n_samples, random_state=0)
模型构建及估计参数
model = hmm.GaussianHMM(n_components=n, n_iter=10)
model.fit(sample)
y = model.predict(sample)
np.set_printoptions(suppress=True)
print('##估计初始概率:')
print(model.startprob_)
print('##估计转移概率:')
print(model.transmat_)
print('##估计均值:\n')
print(model.means_)
print('##估计方差:\n')
print(model.covars_)

估计初始概率:
[ 0. 0. 1. 0. 0.]

估计转移概率:
[[ 0.53070513 0.4517509 0.01754397 0. 0. ]
[ 0.61038015 0.22727271 0. 0.16234714 0. ]
[ 0.31707317 0. 0.48780488 0. 0.19512195]
[ 0. 0.39536948 0. 0.11627515 0.48835537]
[ 0. 0. 0.48484864 0.39393919 0.12121216]]

估计均值:
[[-0.00362689 0.92283254 0.37226357]
[ 0.34487731 -0.0019567 0.93881756]
[-0.5168573 0.00094903 0.85695108]
[-0.66622524 0.72555611 0.24211216]
[ 0.5569746 0.62964009 0.56671171]]

估计方差:
[[[ 0.00893011 0. 0. ]
[ 0. 0.01465261 0. ]
[ 0. 0. 0.00340065]]

[[ 0.00580409 0. 0. ]
[ 0. 0.0202683 0. ]
[ 0. 0. 0.01309222]]

[[ 0.00341816 0. 0. ]
[ 0. 0.00196013 0. ]
[ 0. 0. 0.01525896]]

[[ 0.0167428 0. 0. ]
[ 0. 0.01308771 0. ]
[ 0. 0. 0.01618956]]

[[ 0.01625934 0. 0. ]
[ 0. 0.01590626 0. ]
[ 0. 0. 0.00207361]]]


根据类别信息更改顺序

order = pairwise_distances_argmin(means, model.means_, metric='euclidean')
print(order)
pi_hat = model.startprob_[order]
A_hat = model.transmat_[order]
A_hat = A_hat[:, order]
means_hat = model.means_[order]
covars_hat = model.covars_[order]
change = np.empty((n, n_samples), dtype=np.bool)
for i in range(n):
    change[i] = y == order[i]
for i in range(n):
    y[change[i]] = i
print('估计初始概率:')
print(pi_hat)
print('估计转移概率:')
print(A_hat)
print('估计均值:')
print(means_hat)
print('估计方差:')
print(covars_hat)
print(labels)
print(y)
acc = np.mean(labels == y) * 100
print('准确率:%.2f%%' % acc)

[4 0 3 2 1]
估计初始概率:
[ 0. 0. 0. 1. 0.]
估计转移概率:
[[ 0.12121216 0. 0.39393919 0.48484864 0. ]
[ 0. 0.53070513 0. 0.01754397 0.4517509 ]
[ 0.48835537 0. 0.11627515 0. 0.39536948]
[ 0.19512195 0.31707317 0. 0.48780488 0. ]
[ 0. 0.61038015 0.16234714 0. 0.22727271]]
估计均值:
[[ 0.5569746 0.62964009 0.56671171]
[-0.00362689 0.92283254 0.37226357]
[-0.66622524 0.72555611 0.24211216]
[-0.5168573 0.00094903 0.85695108]
[ 0.34487731 -0.0019567 0.93881756]]
估计方差:
[[[ 0.01625934 0. 0. ]
[ 0. 0.01590626 0. ]
[ 0. 0. 0.00207361]]

[[ 0.00893011 0. 0. ]
[ 0. 0.01465261 0. ]
[ 0. 0. 0.00340065]]

[[ 0.0167428 0. 0. ]
[ 0. 0.01308771 0. ]
[ 0. 0. 0.01618956]]

[[ 0.00341816 0. 0. ]
[ 0. 0.00196013 0. ]
[ 0. 0. 0.01525896]]

[[ 0.00580409 0. 0. ]
[ 0. 0.0202683 0. ]
[ 0. 0. 0.01309222]]]
[3 3 3 3 3 3 1 4 4 1 1 1 4 1 1 4 1 4 1 4 1 4 2 4 4 2 4 1 4 2 2 4 1 4 1 4 1
1 4 1 1 4 1 4 1 4 1 1 4 2 4 1 4 2 0 2 4 4 2 0 2 0 0 2 0 3 0 2 0 2 2 4 1 1
4 2 4 1 4 1 1 4 1 1 1 1 4 2 0 3 3 0 2 0 3 3 0 3 3 1 1 1 1 4 1 1 1 1 4 2 0
2 0 0 2 4 1 1 4 4 2 0 2 2 2 0 3 3 1 1 1 1 1 1 1 4 1 4 1 4 1 1 4 1 4 4 1 4
1 4 1 1 4 1 4 4 4 1 4 1 1 4 1 4 1 1 4 2 0 2 4 1 4 4 4 1 1 1 4 4 1 4 4 1 1
4 1 1 1 4 1 1 1 4 1 4 4 1 4 1 1 1 1 4 1 1 1 4 4 1 1 1 1 4 4 1 1 1 1 4 1 1
1 4 4 1 1 1 4 2 2 4 1 3 0 3 0 3 3 3 3 1 4 4 1 4 1 3 3 3 0 0 3 1 4 1 4 1 4
4 4 4 1 4 4 4 4 1 4 1 4 1 4 1 1 1 4 1 4 4 1 1 3 1 1 1 4 1 1 1 1 4 4 2 4 1
4 4 1 4 1 4 1 4 1 1 4 1 4 4 1 4 2 0 3 3 0 3 1 1 1 4 2 0 2 4 2 0 3 3 3 3 3
1 4 1 4 1 1 1 1 1 1 1 1 4 1 1 1 4 4 1 1 4 1 1 4 1 1 1 1 1 4 1 1 4 1 4 4 4
1 1 1 1 4 1 1 4 1 4 1 1 1 4 2 0 3 1 1 1 1 1 1 4 2 4 1 4 1 1 1 1 1 1 1 1 4
1 1 1 1 1 4 4 4 2 4 1 4 1 1 1 1 1 1 1 1 4 1 4 1 1 1 4 2 0 3 1 1 1 4 1 1 1
4 2 4 4 1 4 2 0 3 3 1 1 4 4 4 4 2 0 2 0 2 4 1 1 1 4 2 0 3 1 4 1 3 0 0 3 1
1 1 4 1 1 4 1 1 1 1 4 2 4 1 4 1 4 1 4]
[3 3 3 3 3 3 1 4 4 1 1 1 4 1 1 4 1 4 1 4 1 4 2 4 4 2 4 1 4 2 2 4 1 4 1 4 1
1 4 1 1 4 1 4 1 4 1 1 4 2 4 1 4 2 0 2 4 4 2 0 2 0 0 2 0 3 0 2 0 2 2 4 1 1
4 2 4 1 4 1 1 4 1 1 1 1 4 2 0 3 3 0 2 0 3 3 0 3 3 1 1 1 1 4 1 1 1 1 4 2 0
2 0 0 2 4 1 1 4 4 2 0 2 2 2 0 3 3 1 1 1 1 1 1 1 4 1 4 1 4 1 1 4 1 4 4 1 4
1 4 1 1 4 1 4 4 4 1 4 1 1 4 1 4 1 1 4 2 0 2 4 1 4 4 4 1 1 1 4 4 1 4 4 1 1
4 1 1 1 4 1 1 1 4 1 4 4 1 4 1 1 1 1 4 1 1 1 4 4 1 1 1 1 4 4 1 1 1 1 4 1 1
1 4 4 1 1 1 4 2 2 4 1 3 0 3 0 3 3 3 3 1 4 4 1 4 1 3 3 3 0 0 3 1 4 1 4 1 4
4 4 4 1 4 4 4 4 1 4 1 4 1 4 1 1 1 4 1 4 4 1 1 3 1 1 1 4 1 1 1 1 4 4 2 4 1
4 4 1 4 1 4 1 4 1 1 4 1 4 4 1 4 2 0 3 3 0 3 1 1 1 4 2 0 2 4 2 0 3 3 3 3 3
1 4 1 4 1 1 1 1 1 1 1 1 4 1 1 1 4 4 1 1 4 1 1 4 1 1 1 1 1 4 1 1 4 1 4 4 4
1 1 1 1 4 1 1 4 1 4 1 1 1 4 2 0 3 1 1 1 1 1 1 4 2 4 1 4 1 1 1 1 1 1 1 1 4
1 1 1 1 1 4 4 4 2 4 1 4 1 1 1 1 1 1 1 1 4 1 4 1 1 1 4 2 0 3 1 1 1 4 1 1 1
4 2 4 4 1 4 2 0 3 3 1 1 4 4 4 4 2 0 2 0 2 4 1 1 1 4 2 0 3 1 4 1 3 0 0 3 1
1 1 4 1 1 4 1 1 1 1 4 2 4 1 4 1 4 1 4]
准确率:100.00%


画图

mpl.rcParams['font.sans-serif'] = [u'SimHei']
mpl.rcParams['axes.unicode_minus'] = False
fig = plt.figure(figsize=(8, 8), facecolor='w')
ax = fig.add_subplot(111, projection='3d')
colors = plt.cm.Spectral(np.linspace(0,1,n))
ax.scatter(sample[:, 0], sample[:, 1], sample[:, 2], s=50, c=labels, 
      cmap=plt.cm.Spectral, marker='o', label=u'观测值', depthshade=True)
plt.plot(sample[:, 0], sample[:, 1], sample[:, 2], lw=0.1, color='#A07070')
colors = plt.cm.Spectral(np.linspace(0, 1, n))
ax.scatter(means[:, 0], means[:, 1], means[:, 2], s=300, c=colors, 
      edgecolor='r', linewidths=1, marker='*', label=u'中心')

x_min, y_min, z_min = sample.min(axis=0)
x_max, y_max, z_max = sample.max(axis=0)
x_min, x_max = expand(x_min, x_max)
y_min, y_max = expand(y_min, y_max)
z_min, z_max = expand(z_min, z_max)
ax.set_xlim((x_min, x_max))
ax.set_ylim((y_min, y_max))
ax.set_zlim((z_min, z_max))
plt.legend(loc='upper left')
plt.grid(True)
plt.tight_layout(1)
plt.title(u'GMHMM参数估计和类别判定', fontsize=18)
plt.show()

07 隐马尔可夫模型 - 案例三 - 股票数据维度信息提取

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,634评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,951评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,427评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,770评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,835评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,799评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,768评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,544评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,979评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,271评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,427评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,121评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,756评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,375评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,579评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,410评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,315评论 2 352

推荐阅读更多精彩内容

  • [{"reportDate": "2018-01-23 23:28:49","fluctuateCause": n...
    加勒比海带_4bbc阅读 767评论 1 2
  • 删掉重新来一次吧,记得改那个脚本修改 /home/ubuntu/eos/scripts/install_depen...
    卢衍泓阅读 1,131评论 0 1
  • 作者:莫言 这个世界,总有你不喜欢的人,也总有人不喜欢你。这都很正常。 而且,无论你有多好,也无论对方有多好,都苛...
    聚焦宛城阅读 665评论 0 0
  • 你想拥有傲娇的身材吗 你想拥有健康的肤色吗 你想拥有强健的体质吗 那么就来加工部移设吧,这里有专业的指导,丰富的课...
    极品不良人阅读 110评论 0 0