Numpy學習打卡task02

2020-12-05 學習其實很有趣

今天帶來的是Datawhale零基礎入門Numpy的學習打卡筆記第二部分—隨機抽樣。

本文大致介紹了隨機數的相關背景知識。

本文素材來自網絡及datawhale。

隨機數生成

隨機數生成(RNG)是指通過一個設備,生成一個比隨機事件更好的無法合理預測的數字或符號序列的過程。隨機數生成器可以是真正的硬體隨機數生成器(HRNGS),它生成的隨機數是某種物理環境屬性的當前值的函數,這種物理環境屬性是以實際上不可能建模的方式不斷變化的;

也可以是偽隨機數生成器(PRNGS),它生成的數看起來是隨機的,但實際上是確定的,如果PRNG的狀態是已知的,就可以重現。

本文中的numpy.random就是偽隨機數生成器。

對隨機性的各種應用導致了幾種不同的隨機數據生成方法的發展,其中有些方法自古以來就存在,在其行列中,有眾所周知的 "經典 "例子,包括擲骰子、擲硬幣、撲克牌的洗牌、《易經》中木籤的使用(用於佔卜),以及其他無數的技術。由於這些技術的機械性質,產生大量足夠隨機的數字(在統計學中很重要)需要大量的工作和時間。因此,結果有時會被收集起來,並以隨機數表的形式分發。

存在著幾種偽隨機數生成的計算方法。所有的方法都達不到真正隨機性的目標,儘管它們可能以不同的成功滿足一些隨機性的統計測試,這些測試的目的是為了衡量它們的結果有多不可預測(也就是說,它們的模式在多大程度上是可辨別的)。這通常使它們無法用於密碼學等應用。然而,也存在著精心設計的密碼學上安全的偽隨機數發生器(CSPRNGS),它們具有專門設計用於密碼學的特殊功能。

隨機數生成器在賭博、統計抽樣、計算機模擬、密碼學、完全隨機化設計以及其他需要產生不可預測結果的領域都有應用。一般來說,在以不可預測性為首要特徵的應用中,例如在安全應用中,在可行的情況下,硬體發生器通常優於偽隨機算法。

隨機數發生器在開發蒙特卡洛方法模擬時非常有用,因為可以從同一個隨機種子開始再次運行相同的隨機數序列,從而方便調試。它們也被用於密碼學中,只要種子是秘密的,發送方和接收方可以自動生成同一組數字作為密鑰使用。

偽隨機數的生成是計算機編程中一項重要而常見的任務。雖然密碼學和某些數字算法需要非常高的表觀隨機性,但許多其他操作只需要適度的不可預知性。一些簡單的例子可能是向用戶提供 "每日隨機報價",或決定計算機控制的對手在計算機遊戲中的移動方式。較弱形式的隨機性被用於哈希算法和創建攤牌搜索和排序算法。

一些乍看起來適合隨機化的應用,其實並不那麼簡單。例如,一個為背景音樂系統 "隨機 "選擇音樂曲目的系統,必須只出現隨機的音樂,甚至可能有控制音樂選擇的方法:一個真正的隨機系統不會限制同一項目連續出現兩三次。

有兩種主要方法用於生成隨機數。第一種方法是測量一些預期是隨機的物理現象,然後對測量過程中可能出現的偏差進行補償。示例來源包括測量大氣噪聲、熱噪聲和其他外部電磁和量子現象。例如,在短時間內測量的宇宙背景輻射或放射性衰變代表了自然熵的來源。

從自然源中獲取熵的速度取決於被測量的基本物理現象。因此,自然產生的 "真 "熵源被稱為阻塞--它們受到速率限制,直到收穫足夠的熵來滿足需求。在一些類似Unix的系統上,包括大多數Linux發行版,偽設備文件/dev/random會阻塞,直到從環境中收穫足夠的熵為止。 由於這種阻塞行為,從/dev/random進行大量的批量讀取,例如用隨機位填充硬碟驅動器,在使用這種類型的熵源的系統上往往會很慢。

第二種方法使用的計算算法可以產生長序列的明顯隨機結果,實際上這些結果完全由一個較短的初始值決定,即所謂的種子值或密鑰。因此,如果種子值已知,整個看似隨機的序列都可以重現。這種類型的隨機數發生器通常被稱為偽隨機數發生器。這種類型的生成器通常不依賴於自然產生的熵的來源,儘管它可能會周期性地被自然來源的種子。這種生成器類型是非阻塞的,因此它們不受外部事件的速率限制,使得大批量讀取成為可能。

一些系統採用混合方法,在可用時提供從自然源收穫的隨機性,並回落到周期性重新播種的基於軟體的加密安全偽隨機數發生器(CSPRNGs)。當所需的隨機性讀取速率超過自然採集方法跟上需求的能力時,回落就會發生。這種方法避免了基於慢速和純環境方法的隨機數發生器的限速阻塞行為。

雖然完全基於確定性邏輯的偽隨機數發生器永遠不能被視為最純粹意義上的 "真正 "隨機數源,但在實踐中,即使對於要求苛刻的安全關鍵型應用,它們通常也是足夠的。事實上,精心設計和實現的偽隨機數生成器可以被認證為安全關鍵型密碼學目的,yarrow算法和fortuna就是如此。前者是FreeBSD、AIX、OS X、NetBSD等系統上/dev/random熵源的基礎。OpenBSD使用了一種稱為arc4random的偽隨機數算法。

2019年10月,有學者指出,與經典的偽隨機數發生器(PRNGs)方法相比,將量子隨機數發生器(QRNGs)引入到包括神經網絡和卷積神經網絡在內的機器學習模型中,用於隨機初始權重分布和隨機森林的拆分過程,對其能力產生了深遠的影響。

均勻分布在0和1之間的隨機數可以通過所需分布的逆累積分布函數(CDF)來產生任何所需分布的隨機數(見逆變換抽樣)。逆CDF也被稱為分位函數。要生成一對統計上獨立的標準正態分布隨機數(x,y),可以先生成極坐標(r,θ),其中r2~χ22和θ~UNIFORM(0,2π)(見Box-Muller變換)。

一些0~1的RNG包括0但不包括1,而另一些RNG則包括或不包括兩者。

多個獨立RNG的輸出可以結合起來(例如,使用位寬XOR操作),以提供一個組合的RNG,至少與使用的最佳RNG一樣好。這被稱為軟體白化。

計算型隨機數發生器和硬體型隨機數發生器有時會結合起來,以體現兩種隨機數發生器的優點。計算型隨機數發生器通常可以比物理發生器更快地生成偽隨機數,而物理發生器可以生成 "真正的隨機性"。

以下站點提供了隨機數樣本

SOCR資源網頁包含一些使用Java小程序生成隨機數的實踐互動活動和演示。ANU的量子光學小組從量子真空中生成隨機數。隨機數的樣本可以在他們的量子隨機數生成器研究頁面上獲得。Random.org提供的隨機數來源於大氣噪聲的隨機性。Ruer Bokovi研究所的量子隨機比特生成器服務從半導體中光子發射的量子過程中收穫隨機性。他們供給了多種獲取數據的方式,包括幾種程式語言的庫。太原理工大學的小組從混沌雷射中生成隨機數。在他們的物理隨機數生成器服務中可以獲得隨機數的樣本。

後門

也有理論認為,硬體RNG可以被秘密修改,使其熵比所述的要小,這將使使用硬體RNG的加密容易受到攻擊。例如,對於Linux中的隨機數生成,人們認為使用英特爾的RDRAND硬體RNG而不在RDRAND輸出中混入其他熵源以抵消硬體RNG中的任何後門是不可接受的,尤其是在NSA Bullrun程序被揭露之後。

2010年,美國的一次抽獎活動被多州彩票協會的信息安全主管操縱,他在日常維護時偷偷在多州彩票協會的安全RNG計算機上安裝了後門惡意軟體,在黑客攻擊過程中,該男子通過一年中幾次預測正確的號碼,共贏得了1650萬美元的獎金。

地址空間布局隨機化(ASLR)是針對排錘漏洞和相關攻擊內存晶片物理硬體的緩解措施,截至2017年初,VUSec發現其不足之處。隨機數算法如果基於硬體中實現的移位寄存器,在足夠大的p值下是可以預測的,並且可以通過足夠的處理能力進行反向工程(Brute Force Hack)。這也間接意味著,使用這種方法的惡意軟體如果經過編碼,既可以在GPU上運行,也可以在CPU上運行,甚至可以利用GPU破解CPU本身的ASLR。【1】

Numpy.random()

參考地址:

https://numpy.org/doc/stable/reference/random/index.html?highlight=numpy%20random#module-numpy.random

不同數據類別

rand(d0, d1, ..., dn) 給定形狀的隨機值。

randn(d0, d1, ..., dn) 從 "標準正態分布 "中返回一個(或多個)樣本。

randint(low[, high, size, dtype]) 返回從低(含)到高(不含)的隨機整數。

random_integers(low[, high, size]) 在low和high之間的np.int類型的隨機整數,包括邊界。

random_sample([size]) 返回半開區間[0.0,1.0]內的隨機浮點數。

random([size]) 返回半開區間[0.0, 1.0]中的隨機浮點數。

ranf([size]) 返回半開區間[0.0, 1.0]中的隨機浮點數。

sample([size]) 返回半開區間[0.0, 1.0]中的隨機浮點數。

choice(a[, size, replace, p]) 從給定的一維數組中產生一個隨機樣本。

bytes(length) 返回隨機字節。

不同分布

beta(a, b[, size]) 從 Beta 分布中抽取樣本。

binomial(n, p[, size]) 從二項分布中抽取樣本。

chisquare(df[, size]) 從一個齊次方分布中抽取樣本。

dirichlet(alpha[, size]) 從Dirichlet分布中抽取樣本。

exponential([scale, size]) 從指數分布中抽取樣本。

f(dfnum, dfden[, size]) 從 F 分布中抽取樣本。

gamma(shape[, scale, size]) 從Gamma分布中抽取樣本。

geometric(p[, size]) 從幾何分布中抽取樣本。

gumbel([loc, scale, size]) 從Gumbel分布中抽取樣本。

hypergeometric(ngood, nbad, nsample[, size]) 從一個超幾何分布中抽取樣本。

laplace([loc, scale, size]) 以指定的位置(或平均值)和比例(衰減)從Laplace或雙指數分布中抽取樣本。

logistic([loc, scale, size]) 從logistic分布中抽取樣本。

lognormal([mean, sigma, size]) 從對數正態分布中抽取樣本。

logseries(p[, size]) 從對數序列分布中抽取樣本。

multinomial(n, pvals[, size]) 從一個多項式分布中抽取樣本。

多變量正態分布(mean, cov[, size, ...) 從多變量正態分布中隨機抽取樣本。

negative_binomial(n, p[, size]) 從一個負二項分布中抽取樣本。

noncentral_chisquare(df, nonc[, size]) 從一個非中心齊次分布中抽取樣本。

noncentral_f(dfnum, dfden, nonc[, size]) 從非中心F分布中抽取樣本。

normal([loc, scale, size]) 從正態分布(高斯分布)中隨機抽取樣本。

pareto(a[, size]) 從指定形狀的 Pareto II 或 Lomax 分布中抽取樣本。

poisson([lam, size]) 從泊松分布中抽取樣本。

power(a[, size]) 在 [0, 1] 中從正指數 a - 1 的冪分布中抽取樣本。

rayleigh([scale, size]) 從一個Rayleigh分布中抽取樣本。

standard_cauchy([size]) 從標準Cauchy分布中抽取樣本,模數為0。

standard_exponential([size]) 從標準指數分布中抽取樣本。

standard_gamma(shape[, size]) 從標準Gamma分布中抽取樣本.

standard_normal([size]) 從標準的正態分布中抽取樣本 (mean=0, stdev=1)。

standard_t(df[, size]) 從標準的學生t分布中抽取樣本,自由度為df。

triangular(left, mode, right[, size]) 從區間[left, right]的三角分布中抽取樣本。

uniform([low, high, size]) 從均勻分布中抽取樣本。

vonmises(μ, kappa[, size]) 從馮米塞斯分布中抽取樣本。

wald(mean, scale[, size]) 從 Wald, 或逆高斯分布中抽取樣本。

weibull(a[, size]) 從 Weibull 分布中抽取樣本。

zipf(a[, size]) 從 Zipf 分布中抽取樣本。

隨機生成器

RandomState([seed]) Mersenne Twister 偽隨機數發生器的容器。

seed([seed]) 給生成器播種(設定生成器隨機屬性)。

get_state() 返回一個元組,表示生成器的內部狀態。

set_state(state) 從元組中設置發生器的內部狀態。

datawhale講義

講義連結:

http://datawhale.club/t/topic/184

隨機抽樣

numpy.random 模塊對 Python 內置的 random 進行了補充,增加了一些用於高效生成多種概率分布的樣本值的函數,如正態分布、泊松分布等。

numpy.random.seed(seed=None) Seed the generator.seed()用於指定隨機數生成時所用算法開始的整數值,如果使用相同的seed()值,則每次生成的隨機數都相同,如果不設置這個值,則系統根據時間來自己選擇這個值,此時每次生成的隨機數因時間差異而不同。

在對數據進行預處理時,經常加入新的操作或改變處理策略,此時如果伴隨著隨機操作,最好還是指定唯一的隨機種子,避免由於隨機的差異對結果產生影響。

離散型隨機變量

二項分布

二項分布可以用於只有一次實驗只有兩種結果,各結果對應的概率相等的多次實驗的概率問題。比如處理猜10次拳贏6次的概率等類似的問題。

二項分布概率函數的代碼表示:binom.pmf(k) = choose(n, k) p**k (1-p)**(n-k)

二項分布概率函數的數學表示:

numpy.random.binomial(n, p, size=None) Draw samples from a binomial distribution.表示對一個二項分布進行採樣,size表示採樣的次數,n表示做了n重伯努利試驗,p表示成功的概率,函數的返回值表示n中成功的次數。

【例】野外正在進行9(n=9)口石油勘探井的發掘工作,每一口井能夠開發出油的概率是0.1(p=0.1)。請問,最終所有的勘探井都勘探失敗的概率?

import numpy as npimport matplotlib.pyplot as pltfrom scipy import statsnp.random.seed(20200605)n = 9# 做某件事情的次數p = 0.1# 做某件事情成功的概率size = 50000x = np.random.binomial(n, p, size)'''或者使用binom.rvs#使用binom.rvs(n, p, size=1)函數模擬一個二項隨機變量,可視化地表現概率y = stats.binom.rvs(n, p, size=size)#返回一個numpy.ndarray'''print(np.sum(x == 0) / size) # 0.3897plt.hist(x)plt.xlabel('隨機變量:成功次數')plt.ylabel('樣本中出現的次數')plt.show()#它返回一個列表,列表中每個元素表示隨機變量中對應值的概率s = stats.binom.pmf(range(10), n, p)print(np.around(s, 3))# [0.387 0.387 0.172 0.045 0.007 0.001 0. 0. 0. 0. ]

【例】模擬投硬幣,投2次,請問兩次都為正面的概率?

import numpy as npfrom scipy import statsimport matplotlib.pyplot as pltnp.random.seed(20200605)n = 2# 做某件事情的次數,這裡是投兩次硬幣p = 0.5#做某件事情成功的概率,在這裡即投硬幣為正面的概率size = 50000x = np.random.binomial(n, p, size)'''或者使用binom.rvs#使用binom.rvs(n, p, size=1)函數模擬一個二項隨機變量,可視化地表現概率y = stats.binom.rvs(n, p, size=size)#返回一個numpy.ndarray'''print(np.sum(x == 0) / size) # 0.25154print(np.sum(x == 1) / size) # 0.49874print(np.sum(x == 2) / size) # 0.24972plt.hist(x)plt.xlabel('隨機變量:硬幣為正面次數')plt.ylabel('50000個樣本中出現的次數')plt.show()#它返回一個列表,列表中每個元素表示隨機變量中對應值的概率s = stats.binom.pmf(range(n + 1), n, p)print(np.around(s, 3))# [0.25 0.5 0.25]

#計算期望和方差'''期望:E(x) = np方差:Var(x) = np(1-p)利用stats.binom.stats(n, p, loc=0, moments='mv')計算期望和方差moments參數中:m為期望,v為方差'''

泊松分布

泊松分布主要用於估計某個時間段某事件發生的概率。

泊松概率函數的代碼表示:poisson.pmf(k) = exp(-lam) lam*k / k!

泊松概率函數的數學表示:

numpy.random.poisson(lam=1.0, size=None) Draw samples from a Poisson distribution.表示對一個泊松分布進行採樣,size表示採樣的次數,lam表示一個單位內發生事件的平均值,函數的返回值表示一個單位內事件發生的次數。

【例】假定某航空公司預定票處平均每小時接到42次訂票電話,那麼10分鐘內恰好接到6次電話的概率是多少?

import numpy as npfrom scipy import statsimport matplotlib.pyplot as pltnp.random.seed(20200605)lam = 42 / 6# 平均值:平均每十分鐘接到42/6次訂票電話size = 50000x = np.random.poisson(lam, size)'''或者#模擬服從泊松分布的50000個隨機變量x = stats.poisson.rvs(lam,size=size)'''print(np.sum(x == 6) / size) # 0.14988plt.hist(x)plt.xlabel('隨機變量:每十分鐘接到訂票電話的次數')plt.ylabel('50000個樣本中出現的次數')plt.show()#用poisson.pmf(k, mu)求對應分布的概率:概率質量函數 (PMF)x = stats.poisson.pmf(6, lam)print(x) # 0.14900277967433773

超幾何分布

在超幾何分布中,各次實驗不是獨立的,各次實驗成功的概率也不等。超幾何分布概率函數的數學表示:

numpy.random.hypergeometric(ngood, nbad, nsample, size=None) Draw samples from a Hypergeometric distribution.表示對一個超幾何分布進行採樣,size表示採樣的次數,ngood表示總體中具有成功標誌的元素個數,nbad表示總體中不具有成功標誌的元素個數,ngood+nbad表示總體樣本容量,nsample表示抽取元素的次數(小於或等於總體樣本容量),函數的返回值表示抽取nsample個元素中具有成功標識的元素個數。

【例】一共20隻動物裡有7隻是狗,抽取12隻有3隻狗的概率(無放回抽樣)。

import numpy as npfrom scipy import statsimport matplotlib.pyplot as pltnp.random.seed(20200605)size = 500000x = np.random.hypergeometric(ngood=7, nbad=13, nsample=12, size=size)'''或者#用rvs(M, n, N, loc=0, size=1, random_state=None)模擬x = stats.hypergeom.rvs(M=20,n=7,N=12,size=size)'''print(np.sum(x == 3) / size) # 0.198664plt.hist(x, bins=8)plt.xlabel('狗的數量')plt.ylabel('50000個樣本中出現的次數')plt.title('超幾何分布',fontsize=20)plt.show()"""M 為總體容量n 為總體中具有成功標誌的元素的個數N,k 表示抽取N個元素有k個是成功元素"""x = range(8)#用hypergeom.pmf(k, M, n, N, loc)來計算k次成功的概率s = stats.hypergeom.pmf(k=x, M=20, n=7, N=12)print(np.round(s, 3))# [0. 0.004 0.048 0.199 0.358 0.286 0.095 0.01 ]

超幾何分布的均值與方差均值E(x) = N(n/M)方差Var(x) = N(n/M)(1-n/M)((M-N)/(M-1))注釋:考慮n次實驗的超幾何分布,令p=n/M,當總體容量足夠大時((M-N)/(M-1))近似於1,此時數學期望為Np,方差為Np(1-p).#用stats(M, n, N, loc=0, moments='mv')計算均值和方差stats.hypergeom.stats(20,7,12,moments='mv')'''

連續型隨機變量

均勻分布

numpy.random.uniform(low=0.0, high=1.0, size=None) Draw samples from a uniform distribution.Samples are uniformly distributed over the half-open interval [low, high) (includes low, but excludes high). In other words, any value within the given interval is equally likely to be drawn by uniform.

【例】在low到high範圍內,創建大小為size的均勻分布的隨機數。

import numpy as npimport matplotlib.pyplot as pltfrom scipy import statsnp.random.seed(20200614)a = 0b = 100size = 50000x = np.random.uniform(a, b, size=size)print(np.all(x >= 0)) # Trueprint(np.all(x < 100)) # Truey = (np.sum(x < 50) - np.sum(x < 10)) / sizeprint(y) # 0.40144plt.hist(x, bins=20)plt.show()a = stats.uniform.cdf(10, 0, 100)b = stats.uniform.cdf(50, 0, 100)print(b - a) # 0.4

作為uniform()的特列,可以得到[0,1)之間的均勻分布的隨機數。

numpy.random.rand(d0, d1, ..., dn) Random values in a given shape.Create an array of the given shape and populate it with random samples from a uniform distribution over [0, 1).

【例】根據指定大小產生[0,1)之間均勻分布的隨機數。

import numpy as npnp.random.seed(20200614)print(np.random.rand())# 0.7594819171852776print(np.random.rand(5))# [0.75165827 0.16552651 0.0538581 0.46671446 0.89076925]print(np.random.rand(4, 3))# [[0.10073292 0.14624784 0.40273923]# [0.21844459 0.22226682 0.37246217]# [0.50334257 0.01714939 0.47780388]# [0.08755349 0.86500477 0.70566398]]np.random.seed(20200614)print(np.random.uniform()) # 0.7594819171852776print(np.random.uniform(size=5))# [0.75165827 0.16552651 0.0538581 0.46671446 0.89076925]print(np.random.uniform(size=(4, 3)))# [[0.10073292 0.14624784 0.40273923]# [0.21844459 0.22226682 0.37246217]# [0.50334257 0.01714939 0.47780388]# [0.08755349 0.86500477 0.70566398]]

作為uniform的另一特例,可以得到[low,high)之間均勻分布的隨機整數。

numpy.random.randint(low, high=None, size=None, dtype='l') Return random integers from low (inclusive) to high (exclusive).Return random integers from the 「discrete uniform」 distribution of the specified dtype in the 「half-open」 interval [low, high). If high is None (the default), then results are from [0, low).

【例】若high不為None時,取[low,high)之間隨機整數,否則取值[0,low)之間隨機整數。

import numpy as npnp.random.seed(20200614)x = np.random.randint(2, size=10)print(x)# [0 0 0 1 0 1 0 0 0 0]x = np.random.randint(1, size=10)print(x)# [0 0 0 0 0 0 0 0 0 0]x = np.random.randint(5, size=(2, 4))print(x)# [[3 3 0 1]# [1 1 0 1]]x = np.random.randint(1, 10, [3, 4])print(x)# [[2 1 7 7]# [7 2 4 6]# [8 7 2 8]]

正態分布

標準正態分布數學表示:

numpy.random.randn(d0, d1, ..., dn) Return a sample (or samples) from the 「standard normal」 distribution.【例】根據指定大小產生滿足標準正態分布的數組(均值為0,標準差為1)。

import numpy as npimport matplotlib.pyplot as pltfrom scipy import statsnp.random.seed(20200614)size = 50000x = np.random.randn(size)y1 = (np.sum(x < 1) - np.sum(x < -1)) / sizey2 = (np.sum(x < 2) - np.sum(x < -2)) / sizey3 = (np.sum(x < 3) - np.sum(x < -3)) / sizeprint(y1) # 0.68596print(y2) # 0.95456print(y3) # 0.99744plt.hist(x, bins=20)plt.show()y1 = stats.norm.cdf(1) - stats.norm.cdf(-1)y2 = stats.norm.cdf(2) - stats.norm.cdf(-2)y3 = stats.norm.cdf(3) - stats.norm.cdf(-3)print(y1) # 0.6826894921370859print(y2) # 0.9544997361036416print(y3) # 0.9973002039367398

還可以指定分布以及所需參數來進行隨機,例如高斯分布中的mu和sigma。

numpy.random.normal(loc=0.0, scale=1.0, size=None) Draw random samples from a normal (Gaussian) distribution.normal()為創建均值為 loc(mu),標準差為 scale(sigma),大小為 size 的數組。

sigma * np.random.randn(...) + mu

【例】

import numpy as npimport matplotlib.pyplot as pltnp.random.seed(20200614)x = 0.5 * np.random.randn(2, 4) + 5'''或者#模擬10000個隨機變量x = 0.5*stats.norm.rvs(size=(2,4))+5'''print(x)# [[5.39654234 5.4088702 5.49104652 4.95817289]# [4.31977933 4.76502391 4.70720327 4.36239023]]np.random.seed(20200614)mu = 5#平均值sigma = 0.5#標準差x = np.random.normal(mu, sigma, (2, 4))print(x)# [[5.39654234 5.4088702 5.49104652 4.95817289]# [4.31977933 4.76502391 4.70720327 4.36239023]]size = 50000x = np.random.normal(mu, sigma, size)print(np.mean(x)) # 4.996403463175092print(np.std(x, ddof=1)) # 0.4986846716715106(#樣本標準差)'''ddof:int, optionalMeans Delta Degrees of Freedom. The divisor used in calculations is N - ddof, where N represents the number of elements. By default ddof is zero.'''

plt.hist(x, bins=20)plt.show()

指數分布

指數分布描述時間發生的時間長度間隔。

指數分布的數學表示:

numpy.random.exponential(scale=1.0, size=None) Draw samples from an exponential distribution.【例】scale = 1/lambda

import numpy as npimport matplotlib.pyplot as pltfrom scipy import statsnp.random.seed(20200614)lam = 7size = 50000x = np.random.exponential(1 / lam, size)'''或者#rvs(loc=0, scale=1/lam, size=size, random_state=None)模擬'''y1 = (np.sum(x < 1 / 7)) / sizey2 = (np.sum(x < 2 / 7)) / sizey3 = (np.sum(x < 3 / 7)) / sizeprint(y1) # 0.63218print(y2) # 0.86518print(y3) # 0.95056plt.hist(x, bins=20)plt.show()y1 = stats.expon.cdf(1 / 7, scale=1 / lam)y2 = stats.expon.cdf(2 / 7, scale=1 / lam)y3 = stats.expon.cdf(3 / 7, scale=1 / lam)print(y1) # 0.6321205588285577print(y2) # 0.8646647167633873print(y3) # 0.950212931632136

其它隨機函數

隨機從序列中獲取元素

numpy.random.choice(a, size=None, replace=True, p=None) Generates a random sample from a given 1-D array.從序列中獲取元素,若a為整數,元素取值從np.range(a)中隨機獲取;若a為數組,取值從a數組元素中隨機獲取。該函數還可以控制生成數組中的元素是否重複replace,以及選取元素的概率p。

【例】

import numpy as npnp.random.seed(20200614)x = np.random.choice(10, 3)print(x) # [2 0 1]x = np.random.choice(10, 3, p=[0.05, 0, 0.05, 0.9, 0, 0, 0, 0, 0, 0])print(x) # [3 2 3]x = np.random.choice(10, 3, replace=False, p=[0.05, 0, 0.05, 0.9, 0, 0, 0, 0, 0, 0])print(x) # [3 0 2]aa_milne_arr = ['pooh', 'rabbit', 'piglet', 'Christopher']x = np.random.choice(aa_milne_arr, 5, p=[0.5, 0.1, 0.1, 0.3])print(x) # ['pooh' 'rabbit' 'pooh' 'pooh' 'pooh']np.random.seed(20200614)x = np.random.randint(0, 10, 3)print(x) # [2 0 1]

對數據集進行洗牌操作

數據一般都是按照採集順序排列的,但是在機器學習中很多算法都要求數據之間相互獨立,所以需要先對數據集進行洗牌操作。

numpy.random.shuffle(x) Modify a sequence in-place by shuffling its contents.This function only shuffles the array along the first axis of a multi-dimensional array. The order of sub-arrays is changed but their contents remains the same.

對x進行重排序,如果x為多維數組,只沿第 0 軸洗牌,改變原來的數組,輸出為None。

【例】洗牌,改變自身內容,打亂順序。

import numpy as npnp.random.seed(20200614)x = np.arange(10)np.random.shuffle(x)print(x)# [6 8 7 5 3 9 1 4 0 2]print(np.random.shuffle([1, 4, 9, 12, 15]))# Nonex = np.arange(20).reshape((5, 4))print(x)# [[ 0 1 2 3]# [ 4 5 6 7]# [ 8 9 10 11]# [12 13 14 15]# [16 17 18 19]]np.random.shuffle(x)print(x)# [[ 4 5 6 7]# [ 0 1 2 3]# [ 8 9 10 11]# [16 17 18 19]# [12 13 14 15]]

numpy.random.permutation(x) Randomly permute a sequence, or return a permuted range.If x is a multi-dimensional array, it is only shuffled along its first index.

permutation()函數的作用與shuffle()函數相同,可以打亂第0軸的數據,但是它不會改變原來的數組。

【例】

import numpy as npnp.random.seed(20200614)x = np.arange(10)y = np.random.permutation(x)print(y)# [6 8 7 5 3 9 1 4 0 2]print(np.random.permutation([1, 4, 9, 12, 15]))# [ 4 1 9 15 12]x = np.arange(20).reshape((5, 4))print(x)# [[ 0 1 2 3]# [ 4 5 6 7]# [ 8 9 10 11]# [12 13 14 15]# [16 17 18 19]]y = np.random.permutation(x)print(y)# [[ 8 9 10 11]# [ 0 1 2 3]# [12 13 14 15]# [16 17 18 19]# [ 4 5 6 7]]

參考文獻

https://www.jianshu.com/p/63434ad5ea64

【1】WIKI百科

https://en.wikipedia.org/wiki/Random_number_generation

相關焦點

  • Numpy學習打卡task03
    今天帶來的是Datawhal自主學習Numpy下學習打卡筆記第三部分—統計相關。本文大致介紹了數理統計的相關背景知識,以及神奇的本福特定律。本文素材來自網絡及Datawhale。統計學統計學是一門與數據的收集、組織、分析、解釋和呈現有關的學科。
  • Python學習第117課——numpy中dot的運用舉例
    上節我們學習了最基礎的matrix的運算,可能有小夥伴覺得這都要涉及高等數學知識了,確實如果你想做數據科學、做人工智慧,統計學、概率論等數學知識,尤其是算法是繞不過去的坎,但是不要怕!!!我們現在入門階段知道有這個概念就行,能解決實際問題就行,後面遇到了問題再去深入。現在我們是為了入門,入門之後,你可以根據自身的底子去選擇發展方向。
  • Python學習第116課——numpy.dot和矩陣相乘的數學運算
    關於numpy中數組的相乘,我們學習了對位相乘(用numpy.multiply、或*直接相乘,比如數組a和b的對位相乘就是numpy.multiply(a,b)或a*b)和一維數組的點乘(dot product,也有人叫inner product,比如一維數組a和b的點乘就是a.b)。numpy中的點乘就是numpy.dot。對於二維以上的數組的點乘,就會用到矩陣相乘。
  • 用純NumPy碼一個RNN、LSTM:這是最好的入門方式了
    此外,作者還寫了 Gradient check 以確定實現的正確性,是不是感覺自深度學習框架流行以來,梯度檢驗這個詞就漸漸消失了~具體而言,這個項目是 DeepMind 於 2016 年發表在 Nature 的論文《Hybrid computing using a neural network with dynamic external memory》的實現,即可微神經計算機
  • 邊看圖,變學習,NumPy可視化初學教程
    Python數據科學 NumPy是基礎,不管pandas還是tensorflow, NumPy都是基礎庫,學習NumPy基礎類型和操作必不可少。本文我們就介紹NumPy基礎,並以圖形方式展現,以方便初學者理解。概述NumPy中最基本數據類型是數組,所有數據組織都是n維數組形式組織的。其中一維和二維數組是基礎,其他多維數組的操作和其類似。
  • 教程| Numpy的線性代數運算
    因此,NumPy提供了一個用於矩陣乘法的dot函數(既是一個數組方法也是numpy命名空間中的一個函數):.dot(y)等價於np.dot(x, y):一個二維數組跟一個大小合適的一維數組的矩陣點積運算之後將會得到一個一維數組numpy.linalg中有一組標準的矩陣分解運算以及諸如求逆和行列式之類的東西
  • 33rd Chinese naval escort taskforce returns from Gulf of Aden
    By Li YinchuanQINGDAO, Mar. 26 --On the afternoon of March 25, the 33rd escort taskforce of the Chinese People's Liberation Army (PLA) Navy, consisting of the guided-missile destroyer
  • 一文包會,教你如何熟練運用Python數值計算Numpy包
    ,給numpy起了個別名哦,所以在程序中直接寫np就是指的numpy哦!好啦,下面就說一下numpy包常用到的一些基本方法吧!首先,Numpy可將列錶轉換為數組哦上面咱們所寫的程序就是調用numpy包將列錶轉換為數組哦,好啦,咱們運行一下看看結果如何吧:下面呢,咱們再看一下numpy包中幾個基礎函數的使用方法哦!
  • 數據科學中100個Numpy代碼技巧
    下面的100個練習都是從numpy郵件列表、stack overflow和numpy文檔中收集的。1.以np的名稱導入numpy包(★☆☆)import numpy as np2.列印numpy版本和配置(★☆☆)print(np.
  • 一鍵獲取新技能,玩轉NumPy數據操作
    除了數據切片和數據切塊的功能之外,掌握numpy也使得開發者在使用各數據處理庫調試和處理複雜用例時更具優勢。在本文中,將介紹NumPy的主要用法,以及它如何呈現不同類型的數據(表格,圖像,文本等),這些經Numpy處理後的數據將成為機器學習模型的輸入。
  • 「學習強國」深圳學習平臺新朋老友來打卡
    「學習強國」(深圳)在讀特粉絲節上進行推介。 深圳特區報訊(記者 焦子宇 通訊員 尹傳剛/文 記者 李偉文/圖)「我平時都會用『學習強國』APP看新聞、看視頻,這次答題還能領到禮品,真的很開心。」市民張女士對記者說。昨日,走進位於卓悅中心北廣場的第二屆讀特粉絲節現場,映入眼帘便是「學習強國」深圳學習平臺開設的線下推廣展位。
  • 「原創」Java並發編程系列36|FutureTask
    public <T> Future<T> submit(Callable<T> task) {if (task == null) throw new NullPointerException();// 調用newTaskFor()將Callable
  • 家長分享 | 英語閱讀打卡,是我和孩子起床後的一個學習任務!
    2017年成為北外壹佳英語的學員以來,各種活動我都樂於參加,當然21天閱讀打卡活動也不例外。給孩子報名21天閱讀打卡計劃就是想通過這樣的方式培養孩子閱讀的興趣,學習的毅力,同時每天接收純正的英語音頻去磨耳朵,去模仿,也是讓孩子更有自信地朗讀,從而培養孩子閱讀的意識。希望在老師的鼓勵及點評下,孩子參與度越來越高,希望在同學間爭相打卡中,感受到濃鬱的學習氛圍。
  • 學習打卡挑戰:aspect,assess,assessment,assist,assistant
    高考英語學習中,詞彙總是不能完全記住,跟著小王老師每日打卡記憶高考詞彙,一個不漏!#學習打卡挑戰賽#歡迎轉載
  • 關於兒童英語打卡0元學的進一步思考,家長應理性選擇學習課程
    這裡寫一下打卡學習了兩個月後的一些新的思考。從近2個月堅持打卡學習的過程來看,其間的痛苦真的不足為外人道也。每天我能支配的時間總量基本是差不多的,堅持了打卡學習,意味著需要壓縮其他事情的時間。而當需要處理的事情較多的時候,打卡學習任務就變得比較痛苦。近兩個月來,我因為各種事情需要處理,每天都不得不晚睡。
  • 華涇「四史」學習教育硬核升級!玩轉時代劇本,打卡網紅地標!
    華涇「四史」學習教育硬核升級!玩轉時代劇本,打卡網紅地標!該情景黨課將情景劇與紀念館講解相結合,突破了以往紀念館較為單一的線性參觀模式,使觀眾更快速地沉浸到歷史情境中,對紀念館開展「四史」學習教育是一次極具意義的嘗試。
  • Reddit年度盤點:2019年最佳機器學習項目
    然後,用一個可以學習的神經描述符來擴充每個點。神經描述符對局部幾何和外觀進行編碼。新的場景視圖是通過一個深度渲染網絡從新的視點通過點雲的光柵化來獲得的。它通過自己和自己遊戲來教自己如何取勝,沒有任何戰略方面的學習例子或指導。
  • 那個堅持打卡學習384天的同學,校長親自給你寫了一封信!
    上志睿源的小學英語組在2019年暑假之前就開始落實「21天」培養好習慣的學習打卡活動,有的同學堅持了21天、有的同學堅持了60天,而他呢,距今已經堅持了整整384天。這個學員就是上志睿源教育通達校區的趙廉榮同學:早在今年的2月份疫情期間,我們就為這個學員寫了專題訪問,距今已經有半年的時間了,而他依然在堅持打卡學習,他拼搏進取,堅持不懈的學習精神值得我們學習。
  • 打卡文化|叮咚,準備打卡啦
    微信朋友圈、QQ空間等社交平臺上,處處可見打卡的動態,打卡已經成為了一道獨特的「風景」。 那麼,該怎麼進行打卡呢?首先,選擇要進行打卡的內容,打卡並不只限於學習方面,在運動、生活等方面通通可以選擇進行打卡。
  • 「四史」學習教育‖這條實地學習線路上,每一個展館都值得去打卡
    「四史」學習教育‖這條實地學習線路上,每一個展館都值得去打卡 2020-12-03 08:30 來源:澎湃新聞·澎湃號·政務