numpy下 随机抽样
隨機(jī)抽樣
- 離散型隨機(jī)變量
- 二項(xiàng)分布
- 泊松分布
- 超幾何分布
- 連續(xù)型隨機(jī)變量
- 均勻分布
- 正態(tài)分布
- 指數(shù)分布
- 其他隨機(jī)函數(shù)
- 隨機(jī)從序列中獲取元素
- 對(duì)數(shù)據(jù)集進(jìn)行洗牌操作
numpy.random模塊可以用來(lái)生成多種概率分布的樣本值的函數(shù),是對(duì)python內(nèi)置的random函數(shù)的補(bǔ)充。
numpy.ranom.seed(seed=None) 生成隨機(jī)數(shù)
使用相同的seed值,可以保證每次都生成相同的隨機(jī)數(shù)。
離散型隨機(jī)變量
二項(xiàng)分布
numpy.random.binomial(n, p, size=None)
表示對(duì)一個(gè)二項(xiàng)分布進(jìn)行采樣,n為n重伯努利實(shí)驗(yàn)次數(shù),p為成功的概率,size為采樣的次數(shù),函數(shù)返回n中成功的次數(shù)。
import numpy as np import matplotlib.pyplot as plt import matplotlib as mpl from scipy import stats# 野外正在進(jìn)行9(n=9)口石油勘探井的發(fā)掘工作,每一口井能夠開(kāi)發(fā)出油的概率是0.1(p=0.1)。 # 請(qǐng)問(wèn),最終所有的勘探井都勘探失敗的概率?# 生成一個(gè)隨機(jī)種子,固定時(shí)間使每次生成的隨機(jī)數(shù)相同 np.random.seed(20200605) n = 9 p = 0.1 size = 50000 # n:n重伯努利試驗(yàn),p:成功的概率,size:采樣的次數(shù)(每次采樣做n次試驗(yàn)) # 函數(shù)返回n次中成功的次數(shù) x = np.random.binomial(n, p, size)''' 或者使用binom.rvs(n, p, size=1)函數(shù)模擬一個(gè)二項(xiàng)隨機(jī)變量,可視化地表現(xiàn)概率 y = stats.binom.rvs(n, p, size=size)#返回一個(gè)numpy.ndarray ''' # mpl.rcParams['font.sans-serif'] = ['SimHei'] # 指定默認(rèn)字體:解決plot不能顯示中文問(wèn)題 # mpl.rcParams['axes.unicode_minus'] = False # 解決保存圖像是負(fù)號(hào)'-'顯示為方塊的問(wèn)題print(np.sum(x == 0) / size) # n次實(shí)驗(yàn)均失敗的概率plt.hist(x) # 繪制直方圖(histogram) plt.xlabel('隨機(jī)變量:成功次數(shù)') plt.ylabel('樣本中出現(xiàn)的次數(shù)') plt.show()# 它返回一個(gè)列表,列表中每個(gè)元素表示隨機(jī)變量中對(duì)應(yīng)值(n次中成功k次)的概率 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. ] import numpy as np from scipy import stats import matplotlib.pyplot as plt# 模擬投硬幣,投2次,兩次都為正面的概率?np.random.seed(20200605) n = 2 p = 0.5 # 投硬幣為正面的概率 size = 50000 x = np.random.binomial(n, p, size)print(np.sum(x == 0) / size) # 0.25154 print(np.sum(x == 1) / size) # 0.49874 print(np.sum(x == 2) / size) # 0.24972# density為true,則返回的元組的第一個(gè)參數(shù)frequency將為頻率而非默認(rèn)的頻數(shù)。 plt.hist(x, density=True) plt.xlabel('隨機(jī)變量:硬幣為正面次數(shù)') plt.ylabel('50000個(gè)樣本中出現(xiàn)的次數(shù)') plt.show()# 它返回一個(gè)列表,列表中每個(gè)元素表示隨機(jī)變量中對(duì)應(yīng)值的概率 s = stats.binom.pmf(range(n + 1), n, p) print(np.around(s, 3)) # [0.25 0.5 0.25]# 計(jì)算期望和方差 m為期望 n為方差 # 期望:E(x) = np # 方差:Var(x) = np(1‐p) m,v = stats.binom.stats(n, p, loc=0, moments='mv') print(m,v)泊松分布
numpy.random.poisson(lam=1.0, size=None)
表示對(duì)一個(gè)泊松分布進(jìn)行采樣,lam表示單位時(shí)間內(nèi)發(fā)生事件的平均值,函數(shù)返回單位時(shí)間內(nèi)事件發(fā)生次數(shù)。
import numpy as np from scipy import stats import matplotlib.pyplot as plt# 假定某航空公司預(yù)定票處平均每小時(shí)接到42次訂票電話,那么10分鐘內(nèi)恰好接到6次電話的概率是多少np.random.seed(20200605) lam = 42 / 6 # 平均值:平均每十分鐘接到42/6次訂票電話 size = 50000 # lam 表示一個(gè)單位內(nèi)發(fā)生事件的平均值,函數(shù)的返回值表示一個(gè)單位內(nèi)事件發(fā)生的次數(shù) x = np.random.poisson(lam, size) '''或者 # 模擬服從泊松分布的50000個(gè)隨機(jī)變量 x = stats.poisson.rvs(lam,size=size) ''' print(np.sum(x == 6) / size) # 0.14988plt.hist(x) plt.xlabel('隨機(jī)變量:每十分鐘接到訂票電話的次數(shù)') plt.ylabel('50000個(gè)樣本中出現(xiàn)的次數(shù)') plt.show()# 用poisson.pmf(k, mu)求對(duì)應(yīng)分布的概率:概率質(zhì)量函數(shù) (PMF) x = stats.poisson.pmf(6, lam) print(x) # 0.14900277967433773超幾何分布
numpy.random.hypergeometric(ngood, nbad, nsample, size=None)
表示對(duì)一個(gè)超幾何分布進(jìn)行采樣,ngood表示成功標(biāo)志元素個(gè)數(shù),nbad表示沒(méi)有成功標(biāo)志元素個(gè)數(shù),nsample表示抽樣次數(shù),函數(shù)返回抽取nsample個(gè)元素中具有成功標(biāo)志的元素個(gè)數(shù)。
import numpy as np from scipy import stats import matplotlib.pyplot as plt# 一共20只動(dòng)物里有7只是狗,抽取12只有3只狗的概率(無(wú)放回抽樣)。np.random.seed(20200605) size = 500000 # ngood 表示總體中具有成功標(biāo)志的元素個(gè)數(shù),nbad 表示總體中不具有成功標(biāo)志的元素個(gè)數(shù),ngood+nbad 表示總體樣本容量 # nsample 表示抽取元素的次數(shù)(小于或等于總體樣本容量),函數(shù)的返回值表示抽取nsample 個(gè)元素中具有成功標(biāo)識(shí)的元素個(gè)數(shù)。 x = np.random.hypergeometric(ngood=7, nbad=13, nsample=12, size=size) '''或者 # 用rvs(M, n, N, loc=0, size=1, random_state=None)模擬 # M 為總體容量,n 為總體中具有成功標(biāo)志的元素的個(gè)數(shù),N、k 表示抽取N個(gè)元素有k個(gè)是成功元素 x = stats.hypergeom.rvs(M=20,n=7,N=12,size=size) ''' print(np.sum(x == 3) / size) # 0.198664plt.hist(x, bins=8) # bins為柱子個(gè)數(shù) plt.xlabel('狗的數(shù)量') plt.ylabel('50000個(gè)樣本中出現(xiàn)的次數(shù)') plt.title('超幾何分布',fontsize=20) plt.show()x = range(8) #用hypergeom.pmf(k, M, n, N, loc)來(lái)計(jì)算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 ]# 用stats(M, n, N, loc=0, moments='mv')計(jì)算均值和方差 # 均值E(x) = N(n/M) # 方差Var(x) = N(n/M)(1‐n/M)((M‐N)/(M‐1)) m,v = stats.hypergeom.stats(20,7,12,moments='mv') print(m,v)連續(xù)型隨機(jī)變量
均勻分布
numpy.random.uniform(low=0.0, high=1.0, size=None)
表示在均勻分布[low,high)中抽取樣本
import numpy as np import matplotlib.pyplot as plt from scipy import stats# 在low到high范圍內(nèi),創(chuàng)建大小為size的均勻分布的隨機(jī)數(shù)。np.random.seed(20200614) a = 0 # low b = 100 # high size = 50000 x = np.random.uniform(a, b, size=size) # 返回值:ndarray類(lèi)型 print(x)print(np.all(x >= 0)) # True print(np.all(x < 100)) # True y = (np.sum(x < 50) - np.sum(x < 10)) / size print(y) # 0.40144plt.hist(x, bins=20) plt.title('均勻分布',fontsize=20) plt.show()a = stats.uniform.cdf(10, 0, 100) # 累計(jì)概率密度 b = stats.uniform.cdf(50, 0, 100) print(b - a) # 0.4numpy.random.rand(d0, d1, …, dn)
可以得到均勻分布在[0,1)之間的隨機(jī)數(shù)
import numpy as np# 根據(jù)指定大小產(chǎn)生[0,1)之間均勻分布的隨機(jī)數(shù)。np.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.7594819171852776 print(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]]numpy.random.randint(low, high=None, size=None, dtype=‘l’)
可以得到均勻分布在[low,high)之間的隨機(jī)整數(shù)
import numpy as np# 若high 不為None 時(shí),取[low,high)之間隨機(jī)整數(shù),否則取值[0,low)之間隨機(jī)整數(shù)。np.random.seed(20200614) x = np.random.randint(2, size=10) # 取[0,2)之間整數(shù) print(x) # [0 0 0 1 0 1 0 0 0 0]x = np.random.randint(1, size=10) # [0,1) print(x) # [0 0 0 0 0 0 0 0 0 0]x = np.random.randint(5, size=(2, 4)) # [0,5) print(x) # [[3 3 0 1] # [1 1 0 1]]x = np.random.randint(1, 10, [3, 4]) # [1,10) print(x) # [[2 1 7 7] # [7 2 4 6] # [8 7 2 8]]正態(tài)分布
numpy.random.randn(d0, d1, …, dn)
得到標(biāo)準(zhǔn)正態(tài)分布的樣本
import numpy as np import matplotlib.pyplot as plt from scipy import stats# 根據(jù)指定大小產(chǎn)生滿足標(biāo)準(zhǔn)正態(tài)分布的數(shù)組(均值為0,標(biāo)準(zhǔn)差為1)。np.random.seed(20200614) size = 50000 x = np.random.randn(size) print(x) y1 = (np.sum(x < 1) - np.sum(x < -1)) / size y2 = (np.sum(x < 2) - np.sum(x < -2)) / size y3 = (np.sum(x < 3) - np.sum(x < -3)) / size print(y1) # 0.68596 print(y2) # 0.95456 print(y3) # 0.99744plt.hist(x, bins=20) plt.title('正態(tài)分布',fontsize=20) plt.show()y1 = stats.norm.cdf(1) - stats.norm.cdf(-1) # cdf 累計(jì)概率密度 y2 = stats.norm.cdf(2) - stats.norm.cdf(-2) y3 = stats.norm.cdf(3) - stats.norm.cdf(-3) print(y1) # 0.6826894921370859 print(y2) # 0.9544997361036416 print(y3) # 0.9973002039367398numpy.random.normal(loc=0.0, scale=1.0, size=None)
得到給定均值和標(biāo)準(zhǔn)差的高斯分布(正態(tài)分布)樣本,其中l(wèi)oc為均值,scale為標(biāo)準(zhǔn)差。
# numpy.random.normal(loc=0.0, scale=1.0, size=None) import numpy as np import matplotlib.pyplot as plt# 生成均值為5,標(biāo)準(zhǔn)差為0.5的高斯分布(正態(tài)分布)np.random.seed(20200614) x = 0.5 * np.random.randn(2, 4) + 5 # 2×4維,使用標(biāo)準(zhǔn)正態(tài)分布生成高斯分布(×sigma+mu) '''或者 # 模擬10000個(gè)隨機(jī)變量 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 # 標(biāo)準(zhǔn)差 # normal()為創(chuàng)建均值為 loc(mu),標(biāo)準(zhǔn)差為 scale(sigma),大小為 size 的數(shù)組。 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 = 50000 x = np.random.normal(mu, sigma, size) print(np.mean(x)) # 4.996403463175092 print(np.std(x, ddof=1)) # 0.4986846716715106(樣本標(biāo)準(zhǔn)差) ddof=1使得正確調(diào)用stdplt.hist(x, bins=20) plt.title('高斯分布',fontsize=20) plt.show()指數(shù)分布
numpy.random.exponential(scale=1.0, size=None)
得到指數(shù)分布的樣本
import numpy as np import matplotlib.pyplot as plt from scipy import stats# 指數(shù)分布 scale = 1/lambda 標(biāo)準(zhǔn)差np.random.seed(20200614) lam = 7 size = 50000 x = np.random.exponential(1 / lam, size) # 或者rvs(loc=0, scale=1/lam, size=size, random_state=None)y1 = (np.sum(x < 1 / 7)) / size y2 = (np.sum(x < 2 / 7)) / size y3 = (np.sum(x < 3 / 7)) / size print(y1) # 0.63218 print(y2) # 0.86518 print(y3) # 0.95056plt.hist(x, bins=20) plt.title('指數(shù)分布',fontsize=20) plt.show()y1 = stats.expon.cdf(1 / 7, scale=1 / lam) # F(1/7) F(x)=1-e^(-lam*x) y2 = stats.expon.cdf(2 / 7, scale=1 / lam) y3 = stats.expon.cdf(3 / 7, scale=1 / lam) print(y1) # 0.6321205588285577 print(y2) # 0.8646647167633873 print(y3) # 0.950212931632136其他隨機(jī)函數(shù)
隨機(jī)從序列中獲取元素
numpy.random.choice(a, size=None, replace=True, p=None)
若a為一整數(shù),則從range(a)中獲取元素;若a為數(shù)組,則從數(shù)組元素中獲取。replace可指定獲取的元素是否重復(fù)。p可指定選取a中各元素的概率。
import numpy as np# 隨機(jī)從序列中獲取元素np.random.seed(20200614) x = np.random.choice(10, 3) # 從range(10)中隨機(jī)獲取 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]) # 以一定概率從range(10)中隨機(jī)獲取 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]) # 以一定概率不重復(fù)從range(10)中隨機(jī)獲取 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]) # 從數(shù)組中獲取 print(x) # ['pooh' 'rabbit' 'pooh' 'pooh' 'pooh']np.random.seed(20200614) x = np.random.randint(0, 10, 3) # 返回0到10之間的任意整數(shù) print(x) # [2 0 1]對(duì)數(shù)據(jù)集進(jìn)行洗牌操作
機(jī)器學(xué)習(xí)中很多算法要求數(shù)據(jù)之間相互獨(dú)立,所以要先對(duì)數(shù)據(jù)集進(jìn)行洗牌操作(改變?cè)匦蛄?#xff09;。
numpy.random.shuffle(x)
shuffle函數(shù)在原數(shù)組上進(jìn)行操作,改變自身序列,無(wú)返回值。
import numpy as np# 洗牌,改變自身內(nèi)容,打亂順序。np.random.seed(20200614) x = np.arange(10) print(x) 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])) # 無(wú)返回值 # 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) # 在原數(shù)組上進(jìn)行 print(x) # [[ 8 9 10 11] # [ 0 1 2 3] # [12 13 14 15] # [16 17 18 19] # [ 4 5 6 7]]numpy.random.permutation(x)
permutation函數(shù)不在原數(shù)組上進(jìn)行操作,不改變自身數(shù)組,返回新數(shù)組。
import numpy as np# 洗牌np.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])) # 返回新的數(shù)組 # [ 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) # 在新的數(shù)組的上進(jìn)行 print(y) # [[ 8 9 10 11] # [ 0 1 2 3] # [12 13 14 15] # [16 17 18 19] # [ 4 5 6 7]] print(x) # [[ 0 1 2 3] # [ 4 5 6 7] # [ 8 9 10 11] # [12 13 14 15] # [16 17 18 19]]總結(jié)
以上是生活随笔為你收集整理的numpy下 随机抽样的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 极智AI | 谈谈几种量化策略:MinM
- 下一篇: HTML5七夕情人节表白网页(抖音超火3