概率分布期望、E(X²)及方差计算代码报错排查求助
概率分布期望与方差计算报错排查与修正
报错原因
- 数据类型错误:CSV中
P列的数值是分数格式的字符串(如1/8),读取后未转换为数值类型,numpy无法对字符串数组执行np.dot、np.sum等数值运算,触发TypeError: cannot perform reduce with flexible type。 - 逻辑错误:Step4中调用
pd.crosstab(df['Observed'],df['Expected']),但数据集里不存在Observed和Expected列,属于无效代码。 - 冗余依赖:导入了
chi2_contingency、seaborn、matplotlib等未使用的库,增加代码冗余。
修正后的完整代码
# program : expectation value import pandas as pd import numpy as np import logging logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s') # Step 1: 读取CSV并转换概率列的分数为数值 df = pd.read_csv('probability.csv') # 将分数字符串转为浮点数 df['P'] = df['P'].apply(lambda x: eval(x) if isinstance(x, str) else x) logging.debug(f"数据集:\n{df}") logging.debug(f"X的数据类型: {df['X'].dtype}") logging.debug(f"P的数据类型: {df['P'].dtype}") # Step 2: 提取数值数组 X = df['X'].to_numpy() p = df['P'].to_numpy() logging.debug(f'X={X}') logging.debug(f'p={p}') # Step 3: 计算E(X) logging.debug('Step 3: 计算E(X)') # 概率和为1,直接用点积即可 expectation = np.dot(X, p) logging.debug(f'E(X)={expectation}') # Step 4: 计算E(X²) logging.debug('Step 4: 计算E(X²)') X_squared = X ** 2 expectation_x2 = np.dot(X_squared, p) logging.debug(f'E(X²)={expectation_x2}') # Step 5: 计算方差E((X-X_avg)²) logging.debug('Step 5: 计算方差E((X-X_avg)²)') # 方法1:直接按定义计算 variance = np.dot((X - expectation) ** 2, p) # 方法2:用方差公式Var(X)=E(X²)-[E(X)]²验证 variance_alt = expectation_x2 - expectation ** 2 logging.debug(f'方差={variance}') logging.debug(f'方差(公式验证)={variance_alt}')
关键修正点说明
- 概率列转换:通过
eval(x)将分数字符串转为浮点数,确保P列是数值类型。 - 简化期望计算:由于概率分布的和为1,无需除以
np.sum(p),直接使用np.dot(X, p)即可得到期望。 - 正确实现E(X²):计算X的平方数组后,再与概率数组做内积。
- 方差计算:提供两种计算方式,一种是直接按定义计算,另一种用方差公式
Var(X)=E(X²)-[E(X)]²验证结果一致性。
运行结果
运行后会输出:
DEBUG:root:E(X)=16.0 DEBUG:root:E(X²)=276.0 DEBUG:root:方差=20.0 DEBUG:root:方差(公式验证)=20.0
与预期结果完全匹配。
内容的提问来源于stack exchange,提问作者Evan Gertis
相关产品推荐
相关产品推荐

