习题2.25:某城市天气情况与气象预报分别看成包含{雨,无雨}的随机变量集合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-11 07:49:15 浏览: 32
(1) 天气预报准确率为预报正确的概率,即 P(X=Y),根据题目中的联合概率:
P(X=Y) = P(x=雨,y=雨) + P(x=无雨,y=无雨) = 1/8 + 10/16 = 9/16
因此,天气预报准确率为 9/16。
(2) 气象预报提供的关于天气情况的信息量可以用互信息来表示:
I(X;Y) = H(X) - H(X|Y)
其中 H(X) 表示 X 的熵,H(X|Y) 表示已知 Y 的条件下 X 的条件熵。由于 X 和 Y 只有两个取值,因此熵可以用二元函数来计算:
H(X) = -[P(x=雨)log2P(x=雨) + P(x=无雨)log2P(x=无雨)] ≈ 0.8113
H(X|Y) = Σ P(y)H(X|Y=y) = P(y=雨)H(X|Y=雨) + P(y=无雨)H(X|Y=无雨)
= (1/4) * (-[P(x=雨|y=雨)log2P(x=雨|y=雨) + P(x=无雨|y=雨)log2P(x=无雨|y=雨)])
+ (3/4) * (-[P(x=雨|y=无雨)log2P(x=雨|y=无雨) + P(x=无雨|y=无雨)log2P(x=无雨|y=无雨)])
≈ 0.5612
因此,气象预报所提供的关于天气情况的信息量为:
I(X;Y) ≈ 0.8113 - 0.5612 ≈ 0.2501
(3) 如果天气预报总预报无雨,则有:
P(x=雨) = 0
P(x=无雨) = 1
此时,气象预报准确率为:
P(Y=无雨|X=无雨) = P(x=无雨,y=无雨) / P(x=无雨) = 10/16 / 1 = 10/16
同时,气象预报所提供的关于天气情况的信息量为:
I(X;Y) = H(X) - H(X|Y) = -[0log20 + 1log21] - [(10/16)log2(10/16) + (6/16)log2(6/16)] ≈ 0.6840
(4) 在第三种情况下,天气预报准确率为 0,而在第一种情况下天气预报准确率为 9/16,因此第一种情况天气预报准确率较高。从信息论的观点看,当气象预报提供的关于天气情况的信息量 I(X;Y) 较大时,天气预报才有意义,因此第一种情况下天气预报有意义。
下面是 Python 代码实现:
```python
import math
# 联合概率
p_rain_rain = 1 / 8
p_rain_no_rain = 1 / 16
p_no_rain_rain = 3 / 16
p_no_rain_no_rain = 10 / 16
# (1) 天气预报准确率
p_correct = p_rain_rain + p_no_rain_no_rain
print("天气预报准确率:", p_correct)
# (2) 气象预报提供的关于天气情况的信息量
h_x = -(p_rain_rain + p_no_rain_no_rain) * math.log2(p_rain_rain + p_no_rain_no_rain) \
- (p_rain_no_rain + p_no_rain_rain) * math.log2(p_rain_no_rain + p_no_rain_rain)
h_x_given_y = (1/4) * (-p_rain_rain*math.log2(p_rain_rain) - p_no_rain_rain*math.log2(p_no_rain_rain)
- p_rain_no_rain*math.log2(p_rain_no_rain) - p_no_rain_no_rain*math.log2(p_no_rain_no_rain)) \
+ (3/4) * (-p_rain_no_rain*math.log2(p_rain_no_rain) - p_no_rain_no_rain*math.log2(p_no_rain_no_rain)
- p_rain_rain*math.log2(p_rain_rain) - p_no_rain_rain*math.log2(p_no_rain_rain))
i_xy = h_x - h_x_given_y
print("气象预报提供的关于天气情况的信息量:", i_xy)
# (3) 如果天气预报总预报无雨
p_rain = 0
p_no_rain = 1
p_no_rain_given_no_rain = p_no_rain_no_rain / p_no_rain
i_xy_given_no_rain = -(0*math.log2(0) + 1*math.log2(1)) \
- (p_no_rain_given_no_rain*math.log2(p_no_rain_given_no_rain) + (1-p_no_rain_given_no_rain)*math.log2(1-p_no_rain_given_no_rain))
print("天气预报总预报无雨时,气象预报准确率:", p_no_rain_given_no_rain)
print("天气预报总预报无雨时,气象预报提供的关于天气情况的信息量:", i_xy_given_no_rain)
```