如何在 Python 中使数据正确符合幂律?

2024-04-18

我正在考虑Moby Dick 小说中独特单词的出现次数 http://tuvalu.santafe.edu/%7Eaaronc/powerlaws/data.htm并使用powerlaw蟒蛇包 https://pythonhosted.org/powerlaw/让单词的频率符合幂律。

我不知道为什么我不能重述 Clauset 等人之前工作的结果。因为 p 值和 KS 分数都是“坏”。

这个想法是将独特单词的频率符合幂律。然而,Kolmogorov-Smirnov 拟合优度检验的计算公式为scipy.stats.kstest看起来很糟糕。

我有以下函数可以使数据符合幂律:

import numpy as np
import powerlaw
import scipy
from scipy import stats

def fit_x(x):
    fit = powerlaw.Fit(x, discrete=True)
    alpha = fit.power_law.alpha
    xmin  = fit.power_law.xmin
    print('powerlaw', scipy.stats.kstest(x, "powerlaw", args=(alpha, xmin), N=len(x)))
    print('lognorm', scipy.stats.kstest(x, "lognorm", args=(np.mean(x), np.std(x)), N=len(x)))

下载 Herman Melville 的小说 Moby Dick 中独特单词的频率(根据 Aaron Clauset 等人的说法,应该遵循幂律):

wget http://tuvalu.santafe.edu/~aaronc/powerlaws/data/words.txt

Python脚本:

x =  np.loadtxt('./words.txt')
fit_x(x)

results:

('powerlaw', KstestResult(statistic=0.862264651286131, pvalue=0.0))
('log norm', KstestResult(statistic=0.9910368602492707, pvalue=0.0))

当我比较预期结果并遵循此R教程 https://cran.r-project.org/web/packages/poweRlaw/vignettes/b_powerlaw_examples.pdf在同一个 Moby Dick 数据集上,我得到了不错的 p 值和 KS 测试值:

library("poweRlaw")
data("moby", package="poweRlaw")
m_pl = displ$new(moby)
est = estimate_xmin(m_pl)
m_pl$setXmin(est)
bs_p = bootstrap_p(m_pl)
bs_p$p
## [1] 0.6738

在计算 KS 测试值并通过后处理拟合时我缺少什么powerlaw https://github.com/jeffalstott/powerlawpython 库? PDF 和 CDF 对我来说看起来不错,但 KS 测试看起来有问题。


我觉得你应该注意数据是连续的还是离散的,然后选择合适的检验方法;另外,正如前面所说,数据的大小会对结果产生一定的影响,希望对你有帮助

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Python 中使数据正确符合幂律? 的相关文章

随机推荐