0

我在 xlsx 中有一个数据集,其中包含一些离散值(名称:saoi),我想看看哪种离散分布更适合它们。

我做了一些直方图:

[完整直方图]

1

[值直到 5000 的历史记录]

2

[值直到 10000 的历史记录]

3

代码是这样的:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
df = pd.read_excel('dataset.xlsx', sheet_name=0)
   
aoi = df ["social AoI"]
saoi = pd.Series(aoi).array
saoi = np.around(saoi)
saoi = saoi.astype(int)

h = plt.hist(saoi)
plt.title('Hist of Social AoI')
plt.xlabel('Values')
plt.ylabel('Freq')
plt.axis([0,20000, 0, 200])
plt.show()

这些值是:

在[21]中:saoi

出[21]: 数组([ 0, 13, 101, 106, 10, 22, 73, 30, 1, 54, 44, 2, 4, 52, 106, 70, 1, 11, 3, 50, 2, 9, 2, 28, 32, 15, 2, 42, 53, 16, 13, 70, 12, 91, 11, 43, 18, 53, 91, 9, 52, 9, 19, 27, 18, 53, 19, 242, 19, 22, 24, 53, 90, 82, 100, 62, 111, 20, 22, 8, 41, 134, 51, 72, 10, 1, 23, 3, 32, 1, 30, 18, 164, 10, 32, 35, 65, 79, 19, 21, 37, 20, 55, 32, 75, 489, 61, 111, 54, 46, 68, 53, 12, 7, 95, 43, 48、11、241、7、295、284、55、69、223、4、66、278、33、22、26、197、117、242、252、29、325、289、76、28、84、 21、204、74、189、11、162, 85, 35, 510, 4, 135, 299, 211, 406, 149, 99, 2, 10, 1150, 427, 337, 16, 157, 620, 95, 257, 45, 368, 428, 108, 1041、189、32、246、38、351、578、151、240、905、309、7、8、25、226、22、50、637、74、825、152、543、1484、893、524、 866、5、236、1608、387、1038、83、147、2871、6669、2058、577、1634、2522、4915、9、298、3074、856、29、7164、1641、1270、143、 476、2145、1678、2135、86、1085、4106、967、266、1302、11875、6011、63、1470、2321、9080、19216])309、7、8、25、226、22、50、637、74、825、152、543、1484、893、524、866、5、236、1608、387、1038、83、147、2871、6669、 2058、577、1634、2522、4915、9、298、3074、856、29、7164、1641、1270、143、508、476、2145、1678、2135、86、1085、4106、967、26 11875、6011、63、1470、2321、9080、19216])309、7、8、25、226、22、50、637、74、825、152、543、1484、893、524、866、5、236、1608、387、1038、83、147、2871、6669、 2058、577、1634、2522、4915、9、298、3074、856、29、7164、1641、1270、143、508、476、2145、1678、2135、86、1085、4106、967、26 11875、6011、63、1470、2321、9080、19216])

我试图用这段代码拟合一些离散分布(使用可能性):

import pandas as pd
from scipy.stats import nbinom, poisson, geom, dlaplace, randint, yulesimon
import math
import numpy as np

x = pd.Series(saoi)
mean = x.mean()
var = x.var()
likelihoods = {}  

#nbinom
p = mean / var
r = p * mean / (1-p)
likelihoods['nbinom'] = x.map(lambda val: nbinom.pmf(val, r, p)).prod()

#poisson
lambda_ = mean
likelihoods['poisson'] = x.map(lambda val: poisson.pmf(val, lambda_)).prod()

#geometric
p = 1 / mean
likelihoods['geometric'] = x.map(lambda val: geom.pmf(val, p)).prod()

#dlaplace
a = math.sqrt(var/2)
likelihoods['dlaplace'] = x.map(lambda val: dlaplace.pmf(val, a)).prod()

#randint
low = 0
high = 242
likelihoods['randint'] = x.map(lambda val: randint.pmf(val, low, high)).prod()

#yulesimon
p = mean / (mean-1)
likelihoods['yulesimon'] = x.map(lambda val: yulesimon.pmf(val, p)).prod()

best_fit = max(likelihoods, key=lambda x: likelihoods[x])
print("Best fit:", best_fit)
print("Likelihood:", likelihoods[best_fit])

但结果很糟糕,因为可能性为 0。

我怎样才能找到更好的拟合离散分布?连续的方法有很多,但离散的方法呢?

4

0 回答 0