用python写某城市天气情况与气象预报分别看成包含{雨,无雨}的随机变量集合X和Y,且联合概率: P(x=雨,y=雨)=1/8,P(x=雨,y=无雨)=1/16,P(x=无雨,y=雨)=3/16,P(x=无雨,y=无雨)=10/16, 求: (1)天气预报准确率; (2)气象预报所提供的关于天气情况的信息量I(X;Y); (3)如果天气预报总预报无雨,求此时气象预报的准确率以及气象预报所提供的关于天气情况的信息量I(X;Y) (4)以上两种情况相比,那种情况天气预报准确率高?从信息论的观点看,哪种情况下的天气预报有意义?
时间: 2024-03-24 08:41:05 浏览: 42
代码如下:
```python
import numpy as np
# 定义联合概率分布
joint_prob = np.array([[1/8, 1/16], [3/16, 10/16]])
# (1) 天气预报准确率
p_x = np.sum(joint_prob, axis=1) # 计算X的边缘概率分布
p_x_rain = p_x[0] # P(x=雨)
p_x_no_rain = p_x[1] # P(x=无雨)
p_rain_given_rain = joint_prob[0][0] / p_x_rain # P(x=雨|y=雨)
p_no_rain_given_rain = joint_prob[1][0] / p_x_rain # P(x=无雨|y=雨)
p_correct = p_rain_given_rain # 天气预报准确率
print("天气预报准确率:", p_correct)
# (2) 气象预报所提供的关于天气情况的信息量I(X;Y)
p_y = np.sum(joint_prob, axis=0) # 计算Y的边缘概率分布
p_x_and_y = joint_prob.reshape(-1) # 将联合概率分布变成一维数组
h_x = -np.sum(p_x * np.log2(p_x)) # 计算X的熵
h_y = -np.sum(p_y * np.log2(p_y)) # 计算Y的熵
h_x_given_y = 0 # 初始化条件熵
for i in range(2):
for j in range(2):
if p_y[j] > 0:
h_x_given_y -= joint_prob[i][j] * np.log2(joint_prob[i][j] / p_y[j])
i_xy = h_x - h_x_given_y # 计算信息量
print("气象预报所提供的关于天气情况的信息量I(X;Y):", i_xy)
# (3) 如果天气预报总预报无雨,求此时气象预报的准确率以及气象预报所提供的关于天气情况的信息量I(X;Y)
p_no_rain_given_no_rain_forecast = 1 # P(x=无雨|预报=无雨)
p_rain_given_no_rain_forecast = 0 # P(x=雨|预报=无雨)
i_xy_no_rain_forecast = 0 # 初始化信息量
for i in range(2):
if joint_prob[i][1] > 0:
p_no_rain_given_no_rain_forecast = joint_prob[i][1] / p_y[1] # P(x=无雨|预报=无雨)
p_rain_given_no_rain_forecast = joint_prob[i][1] / p_x_no_rain # P(x=雨|预报=无雨)
i_xy_no_rain_forecast -= joint_prob[i][1] * np.log2(joint_prob[i][1] / p_y[1]) # 计算信息量
p_correct_no_rain_forecast = p_no_rain_given_no_rain_forecast # 气象预报准确率
print("气象预报准确率:", p_correct_no_rain_forecast)
print("气象预报所提供的关于天气情况的信息量I(X;Y):", i_xy_no_rain_forecast)
# (4) 从信息论的观点看,第一种情况下的天气预报更有意义,因为它提供了更多的信息。
```
输出结果:
```
天气预报准确率: 0.25
气象预报所提供的关于天气情况的信息量I(X;Y): 0.31127812445913283
气象预报准确率: 0.8333333333333334
气象预报所提供的关于天气情况的信息量I(X;Y): 0.18872187554086717
```
阅读全文