numpy.random.Generator.zipf#

方法

random.Generator.zipf(a, size=None)#

從 Zipf 分佈中抽取樣本。

樣本是從指定參數 a > 1 的 Zipf 分佈中抽取的。

Zipf 分佈(也稱為 zeta 分佈)是一種離散機率分佈,它滿足 Zipf 定律:一個項目的頻率與其在頻率表中的排名成反比。

參數:
afloat 或 float 的 array_like

分佈參數。必須大於 1。

sizeint 或 int 元組,選用

輸出形狀。如果給定的形狀是,例如,(m, n, k),則會抽取 m * n * k 個樣本。如果 size 是 None(預設),如果 a 是純量,則會傳回單一值。否則,會抽取 np.array(a).size 個樣本。

傳回:
outndarray 或 純量

從參數化的 Zipf 分佈中抽取的樣本。

另請參閱

scipy.stats.zipf

機率密度函數、分佈或累積密度函數等。

註解

Zipf 分佈的機率質量函數 (PMF) 為

\[p(k) = \frac{k^{-a}}{\zeta(a)},\]

對於整數 \(k \geq 1\),其中 \(\zeta\) 是黎曼 Zeta 函數。

它以美國語言學家喬治·金斯利·齊夫 (George Kingsley Zipf) 的名字命名,他注意到一種語言樣本中任何單字的頻率與其在頻率表中的排名成反比。

參考文獻

[1]

Zipf, G. K., “語言中相對頻率原則的選定研究”,劍橋,麻州:哈佛大學出版社,1932 年。

範例

從分佈中抽取樣本

>>> a = 4.0
>>> n = 20000
>>> rng = np.random.default_rng()
>>> s = rng.zipf(a, size=n)

顯示樣本的直方圖,以及基於機率密度函數的預期直方圖

>>> import matplotlib.pyplot as plt
>>> from scipy.special import zeta  

bincount 為小整數提供快速直方圖。

>>> count = np.bincount(s)
>>> k = np.arange(1, s.max() + 1)
>>> plt.bar(k, count[1:], alpha=0.5, label='sample count')
>>> plt.plot(k, n*(k**-a)/zeta(a), 'k.-', alpha=0.5,
...          label='expected count')   
>>> plt.semilogy()
>>> plt.grid(alpha=0.4)
>>> plt.legend()
>>> plt.title(f'Zipf sample, a={a}, size={n}')
>>> plt.show()
../../../_images/numpy-random-Generator-zipf-1.png