我有一個經驗分佈,我試圖用numpy
來擬合T
分佈,並用matplotlib
作圖。T分佈的奇怪行爲
這裏是我無法理解:
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
分配適用於相同的數據時,我會與綠線和分佈的峯值完美匹配。現在
t分佈是對稱的,鐘形,就像普通的 分佈,但有較重的尾巴......
因爲它說它是symmetric我期望我的意思和峯值完美匹配,但事實並非如此。
我的問題是:我的Python代碼有什麼問題嗎?或者它是T
分配的預期行爲?如果是,爲什麼?如果不是,我在做什麼錯我的代碼?
快速回答:重點是在報價中**重尾巴**。擬合t分佈比正常分佈對尾巴的重量更輕。將前三個觀察值修剪爲「異常值」使得正常估計值更接近於t stats.norm.fit(np.sort(arr)[: - 3]) - >(27.882352941176471,22.712738983018465)''。另一個跡象表明:中位數遠低於數據中的平均值。 – user333700
是的,請注意你有'arr.mean()== 45.6','np.median(arr)== 27.0'。所以。 。 。這不是一個Python問題;這是一個數學問題。 – dbliss