1.马尔可夫模型是什么?
马尔可夫模型是一种用于描述系统状态随时间变化的数学模型,它的核心是,未来只与现在有关,与过去无关。
2.马尔可夫模型的特征?
- 无记忆性:下一步的状态只依赖当前状态,与更早状态无关。
- 状态空间:系统所有可能的状态构成的集合。
- 转移概率:从一个状态转移到另一个状态的概率,所有从一个状态出发的转移概率之和为1.
3.马尔可夫模型建模步骤:(以天气预报为例)
- 定义状态空间:列出所有可能的状态,比如S1=【‘晴’,‘雨’】
- 准备历史数据:准备一串已知的天气序列,比如 ['晴','晴','雨','雨','晴','雨']
- 统计转移次数:遍历整个序列,统计从一种状态转移到另一种状态的次数,构造转移频数矩阵
- 计算转移概率:把转移频数矩阵的每一行除以每一行的总和,得到转移概率矩阵
- 预测未来:用当前的状态作为初始矩阵,用转移概率矩阵预测明天可能的天气,若要预测多次,需要用矩阵乘法循环迭代
4.天气预报的例子:
S1 = ['晴','雨']
possibility = ['晴','晴','雨','雨','晴','雨']
def calculate(lst):
p11 = 0
p12 = 0
p21 = 0
p22 = 0
for i in range(len(lst)-1):
if lst[i] == '晴':
if lst[i+1] == '晴':
p11 += 1
else:
p12 += 1
else:
if lst[i+1] == '晴':
p21 += 1
else:
p22 += 1
return p11,p12,p21,p22
p11,p12,p21,p22 = calculate(possibility)
P11,P12,P21,P22 = p11 / (p11+p12),p12/(p11+p12),p21/(p21+p22),p22/(p21+p22)
P11,P12,P21,P22
2.构造转移概率矩阵、预测未来一天的天气情况
import numpy as np
matrix = np.array([[P11,P12],[P21,P22]])
ini = [1,0] #初始状态
result = np.dot(ini,matrix)
print('明天有{:.2f}概率晴天,有{:.2f}概率雨天'.format(result[0],result[1]))
明天有0.33概率晴天,有0.67概率雨天
3.预测未来五天的天气情况
def pre(days,matrix):
current = ini #当前状态
result1 = []
for i in range(days):
current = np.dot(current,matrix)
result1.append(current.copy())
return result1
predictions = pre(5,matrix)
print('未来五天天气预报')
for i in range(5):
print('第{}天{:.2f}概率晴天,有{:.2f}概率雨天'.format(i+1,predictions[i][0],predictions[i][1]))
未来五天天气预报
第1天0.33概率晴天,有0.67概率雨天
第2天0.44概率晴天,有0.56概率雨天
第3天0.43概率晴天,有0.57概率雨天
第4天0.43概率晴天,有0.57概率雨天
第5天0.43概率晴天,有0.57概率雨天
4.将结果可视化,直观分析
import matplotlib.pyplot as plt
import matplotlib.pyplot as plt
import numpy as np
import warnings
warnings.filterwarnings('ignore') #忽略运行时警告信息
plt.rcParams['axes.unicode_minus'] = False #修复负号显示
plt.rcParams['font.sans-serif'] = ['SimHei']
# 原始数据
days_orig = np.arange(1, len(possibility) + 1)
y_orig = [0 if w == '晴' else 1 for w in possibility] # 晴=0, 雨=1
# 预测数据
predictions = pre(5, matrix)
pred_晴天 = [p[0] for p in predictions] # 每天晴天的概率
pred_雨天 = [p[1] for p in predictions] # 每天雨天的概率
days_pred = np.arange(len(possibility) + 1, len(possibility) + 6)
plt.figure(figsize=(10, 5))
plt.scatter(days_orig, y_orig, color='blue', label='原始天气(0=晴,1=雨)', s=50, zorder=5) #zorder图层显示
plt.plot(days_pred, pred_晴天, 'o–', color='orange', label='预测概率(晴天)', alpha=0.8)
plt.plot(days_pred, pred_雨天, 's–', color='green', label='预测概率(雨天)', alpha=0.8)
plt.title('马尔可夫模型天气预测')
plt.xlabel('天数')
plt.ylabel('概率 / 天气状态')
plt.xticks(range(1, len(possibility) + 6))
plt.legend()
plt.grid(True, alpha=0.3)
plt.show()

从图片可以看出,未来几天是雨天的概率较大。同时,可以看到,从第8天开始,预测概率趋于稳定。
5.完整代码:
S1 = ['晴','雨']
possibility = ['晴','晴','雨','雨','晴','雨']
def calculate(lst):
p11 = 0
p12 = 0
p21 = 0
p22 = 0
for i in range(len(lst)-1):
if lst[i] == '晴':
if lst[i+1] == '晴':
p11 += 1
else:
p12 += 1
else:
if lst[i+1] == '晴':
p21 += 1
else:
p22 += 1
return p11,p12,p21,p22
p11,p12,p21,p22 = calculate(possibility)
P11,P12,P21,P22 = p11 / (p11+p12),p12/(p11+p12),p21/(p21+p22),p22/(p21+p22)
import numpy as np
matrix = np.array([[P11,P12],[P21,P22]])
ini = [1,0] #初始状态
result = np.dot(ini,matrix)
print('明天有{:.2f}概率晴天,有{:.2f}概率雨天'.format(result[0],result[1]))
def pre(days,matrix):
current = ini #当前状态
result1 = []
for i in range(days):
current = np.dot(current,matrix)
result1.append(current.copy())
return result1
predictions = pre(5,matrix)
print('未来五天天气预报')
for i in range(5):
print('第{}天{:.2f}概率晴天,有{:.2f}概率雨天'.format(i+1,predictions[i][0],predictions[i][1]))
import matplotlib.pyplot as plt
import matplotlib.pyplot as plt
import numpy as np
import warnings
warnings.filterwarnings('ignore') #忽略运行时警告信息
plt.rcParams['axes.unicode_minus'] = False #修复负号显示
plt.rcParams['font.sans-serif'] = ['SimHei']
# 原始数据
days_orig = np.arange(1, len(possibility) + 1)
y_orig = [0 if w == '晴' else 1 for w in possibility] # 晴=0, 雨=1
# 预测数据
predictions = pre(5, matrix)
pred_晴天 = [p[0] for p in predictions] # 每天晴天的概率
pred_雨天 = [p[1] for p in predictions] # 每天雨天的概率
days_pred = np.arange(len(possibility) + 1, len(possibility) + 6)
# 画图
plt.figure(figsize=(10, 5))
# 原始天气用散点
plt.scatter(days_orig, y_orig, color='blue', label='原始天气(0=晴,1=雨)', s=50, zorder=5) #zorder图层显示
# 预测概率用两条折线
plt.plot(days_pred, pred_晴天, 'o–', color='orange', label='预测概率(晴天)', alpha=0.8)
plt.plot(days_pred, pred_雨天, 's–', color='green', label='预测概率(雨天)', alpha=0.8)
plt.title('马尔可夫模型天气预测')
plt.xlabel('天数')
plt.ylabel('概率 / 天气状态')
plt.xticks(range(1, len(possibility) + 6))
plt.legend()
plt.grid(True, alpha=0.3)
plt.show()
6.总结:
马尔可夫模型用于“下一步只与当前有关”的场景,如天气预报、股票预测、自然语言处理。优点是模型简单、易于理解,局限性是仅依赖当前状态,可能无法捕捉更长期的历史规律。
该天气预报例子,状态空间情况少、历史数据有限,相对简单,对于大数据集,需要更多的处理。
网硕互联帮助中心

评论前必须登录!
注册