云计算百科
云计算领域专业知识百科平台

怎么用马尔可夫模型预测天气?

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.总结:

    马尔可夫模型用于“下一步只与当前有关”的场景,如天气预报、股票预测、自然语言处理。优点是模型简单、易于理解,局限性是仅依赖当前状态,可能无法捕捉更长期的历史规律。

    该天气预报例子,状态空间情况少、历史数据有限,相对简单,对于大数据集,需要更多的处理。

     

     

     

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » 怎么用马尔可夫模型预测天气?
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!