我有一个经验分布,我正在尝试使用T
将numpy
分布拟合到它并使用matplotlib
进行绘制。
这是我无法理解的:
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import t
arr = np.array( [140, 36, 44, 24, 15, 48, 19, 2, 84, 6, 70, 3, 20, 6, 133, 23, 30, 7, 37, 165] )
params = t.fit( arr )
mean = arr.mean()
std = arr.std()
r = np.arange( mean - 3 * std, mean + 3 * std, 0.01 )
pdf_fitted = t.pdf(r, *params[0:-2], loc=params[-2], scale=params[-1])
plt.plot( r, pdf_fitted )
plt.plot( [mean, mean], [0, max(pdf_fitted)] )
plt.show()
这个情节:
绿线是经验数据的平均值,蓝线是相同数据的拟合T
分布。
问题是经验均值和分布的峰值不匹配。当我将normal
分布拟合到相同的数据时,我会按预期与绿线和分布的峰值完美匹配。
现在,关注Wikipedia T distribution:
t分布是对称的,钟形,与法线一样 分布,但尾巴较重...
因为它说对称我希望我的平均值和峰值匹配完美,但事实并非如此。
我的问题是:我的Python代码有什么问题,还是T
发布的预期行为?如果是,为什么?如果不是,我的代码出错了什么?
答案 0 :(得分:3)
就我所见,Python代码中没有错误;实际上,这是一个很好的例子来说明学生 t 分布与高斯分布相比的稳健性。指数族分布(高斯,指数,二项式,泊松等)的一个特征是它们具有非常薄的尾部,这意味着当您偏离平均值时,pdf会呈指数减小。这一特性为它们提供了很好的理论属性,但通常是将它们应用于模拟真实世界分布的瓶颈,其中数据集中存在异常值。因此, t 分布是一种流行的替代方案,因为观察到的数据集中的几个异常值不会对您的推论产生太大影响。在您的示例中,将原始数据集视为由除三个高异常值之外的所有点组成。然而,这些异常值在一些嘈杂的过程中被引入。统计推断旨在描述原始数据集的属性(例如,均值),因此假设您在这种情况下使用高斯,您将严重高估真实均值。如果您在这种情况下使用 t ,它将与您的嘈杂样本的平均值不匹配,但无论异常值如何,它都会更准确地估计原始真实均值。