日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

Python:NumPy-随机抽样

發(fā)布時(shí)間:2024/3/12 python 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python:NumPy-随机抽样 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

隨機(jī)抽樣

本文程序可直接運(yùn)行,但圖片導(dǎo)入有點(diǎn)問題;

numpy.random 模塊對 Python 內(nèi)置的 random 進(jìn)行了補(bǔ)充,增加了一些用于高效生成多種概率分
布的樣本值的函數(shù),如正態(tài)分布、泊松分布等。

  • numpy.random.seed(seed=None) Seed the generator.

seed() 用于指定隨機(jī)數(shù)生成時(shí)所用算法開始的整數(shù)值,如果使用相同的seed() 值,則每次生成的隨
機(jī)數(shù)都相同,如果不設(shè)置這個(gè)值,則系統(tǒng)根據(jù)時(shí)間來自己選擇這個(gè)值,此時(shí)每次生成的隨機(jī)數(shù)因時(shí)間
差異而不同。

在對數(shù)據(jù)進(jìn)行預(yù)處理時(shí),經(jīng)常加入新的操作或改變處理策略,此時(shí)如果伴隨著隨機(jī)操作,最好還是指
定唯一的隨機(jī)種子,避免由于隨機(jī)的差異對結(jié)果產(chǎn)生影響。

離散型隨機(jī)變量

二項(xiàng)分布

二項(xiàng)分布可以用于只有一次實(shí)驗(yàn)只有兩種結(jié)果,各結(jié)果對應(yīng)的概率相等的多次實(shí)驗(yàn)的概率問題。比如
處理猜10次拳贏6次的概率等類似的問題。

二項(xiàng)分布概率函數(shù)的代碼表示:binom.pmf(k) = choose(n, k) pk (1-p)(n-k)
二項(xiàng)分布概率函數(shù)的數(shù)學(xué)表示:

  • numpy.random.binomial(n, p, size=None) Draw samples from a binomial distribution.

表示對一個(gè)二項(xiàng)分布進(jìn)行采樣, size 表示采樣的次數(shù), n 表示做了n 重伯努利試驗(yàn), p 表示成功的概率,函數(shù)的返回值表示n 中成功的次數(shù)。

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

import numpy as np import matplotlib.pyplot as plt from scipy import statsnp.random.seed(20201125) n = 9 p = 0.1 size = 50000 x = np.random.binomial(n, p, size) print(x) print(np.sum(x==0)/size)plt.hist(x) plt.xlabel("隨機(jī)變量:成功次數(shù)") plt.ylabel("樣本中出現(xiàn)的次數(shù)") plt.show()s = stats.binom.pmf(range(10),n,p) print(np.around(s,3)) [2 0 0 ... 0 0 2] 0.3904

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-Gk6Mkzx3-1606315239569)(output_1_1.png)]

[0.387 0.387 0.172 0.045 0.007 0.001 0. 0. 0. 0. ]

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

import numpy as np from scipy import stats import matplotlib.pyplot as pltnp.random.seed(20201125) n = 2 p = 0.5 size = 50000 x = np.random.binomial(n,p,size)print(np.sum(x==0)/size) print(np.sum(x==1)/size) print(np.sum(x==2)/size)plt.hist(x, density=True) plt.xlabel("隨機(jī)變量:變量為正面次數(shù)") plt.ylabel("50000個(gè)樣本中出現(xiàn)的次數(shù)") plt.show()s = stats.binom.pmf(range(n+1),n,p) print(np.around(s,3)) 0.25018 0.50046 0.24936

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-nKHoOxLt-1606315239571)(output_3_1.png)]

[0.25 0.5 0.25]

計(jì)算期望和方差

“”"
期望:E(x) = np

方差:Var(x) = np(1‐p)

利用stats.binom.stats(n, p, loc=0, moments=‘mv’)計(jì)算期望和方差

moments參數(shù)中:m為期望,v為方差
“”"

泊松分布

泊松分布主要用于估計(jì)某個(gè)時(shí)間段某事件發(fā)生的概率。

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

泊松概率函數(shù)的數(shù)學(xué)表示:

  • numpy.random.poisson(lam=1.0, size=None) Draw samples from a Poisson distribution.

表示對一個(gè)泊松分布進(jìn)行采樣, size 表示采樣的次數(shù), lam 表示一個(gè)單位內(nèi)發(fā)生事件的平均值,函
數(shù)的返回值表示一個(gè)單位內(nèi)事件發(fā)生的次數(shù)。

【例】假定某航空公司預(yù)定票處平均每小時(shí)接到42次訂票電話,那么10分鐘內(nèi)恰好接到6次電話的概
率是多少?

import numpy as np from scipy import stats import matplotlib.pyplot as plt np.random.seed(20200605) lam = 42 / 6 # 平均值:平均每十分鐘接到42/6次訂票電話 size = 50000 x = np.random.poisson(lam, size)print(np.sum(x == 6) / size) # 0.14988 plt.hist(x) plt.xlabel('隨機(jī)變量:每十分鐘接到訂票電話的次數(shù)') plt.ylabel('50000個(gè)樣本中出現(xiàn)的次數(shù)') plt.show() # 用poisson.pmf(k, mu)求對應(yīng)分布的概率:概率質(zhì)量函數(shù) (PMF) x = stats.poisson.pmf(6, lam) print(x) # 0.14900277967433773 0.14988

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-nB0kY7of-1606315239573)(output_6_1.png)]

0.14900277967433773

超幾何分布

在超幾何分布中,各次實(shí)驗(yàn)不是獨(dú)立的,各次實(shí)驗(yàn)成功的概率也不等。 超幾何分布概率函數(shù)的數(shù)學(xué)表
示:

  • numpy.random.hypergeometric(ngood, nbad, nsample, size=None) Draw samples from a Hypergeometric distribution.

表示對一個(gè)超幾何分布進(jìn)行采樣, size 表示采樣的次數(shù), ngood 表示總體中具有成功標(biāo)志的元素個(gè)
數(shù), nbad 表示總體中不具有成功標(biāo)志的元素個(gè)數(shù), ngood+nbad 表示總體樣本容量, nsample 表示抽取元素的次數(shù)(小于或等于總體樣本容量),函數(shù)的返回值表示抽取nsample 個(gè)元素中具有成功標(biāo)識的元素個(gè)數(shù)。

【例】一共20只動(dòng)物里有7只是狗,抽取12只有3只狗的概率(無放回抽樣)。

import numpy as np from scipy import stats import matplotlib.pyplot as plt np.random.seed(20200605) size = 500000 x = np.random.hypergeometric(ngood=7, nbad=13, nsample=12, size=size)print(np.sum(x == 3) / size) # 0.198664 plt.hist(x, bins=8) 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)來計(jì)算k次成功的概率 s = stats.hypergeom.pmf(k=x, M=20, n=7, N=12) print(np.round(s, 3)) 0.198664

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-Izzi6wBk-1606315239574)(output_8_1.png)]

[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次實(shí)驗(yàn)的超幾何分布,令p=n/M,當(dāng)總體容量足夠大時(shí)((M‐N)/(M‐1))近似于1,此時(shí)數(shù)學(xué)期望為Np,方差為Np(1‐p).

#用stats(M, n, N, loc=0, moments=‘mv’)計(jì)算均值和方差

stats.hypergeom.stats(20,7,12,moments=‘mv’)
‘’’

連續(xù)型隨機(jī)變量

均勻分布

  • 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, butexcludes high). In other words, any value within the given interval is equally likely to bedrawn by uniform .

【例】在low到high范圍內(nèi),創(chuàng)建大小為size的均勻分布的隨機(jī)數(shù)。

import numpy as np import matplotlib.pyplot as plt from scipy import statsnp.random.seed(20201125) a = 0 b = 100 size = 50000 x = np.random.uniform(a,b,size=size) print(np.all(x >= 0)) print(np.all(x < 100)) y = (np.sum(x < 50) - np.sum(x < 10)) / size print(y)plt.hist(x, bins = 20) plt.show()a = stats.uniform.cdf(10,0,100) b = stats.uniform.cdf(50,0,100) print(b-a) True True 0.40464

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-ViHdZr9m-1606315239575)(output_11_1.png)]

0.4

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

  • 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) .

【例】根據(jù)指定大小產(chǎn)生[0,1)之間均勻分布的隨機(jī)數(shù)。

import numpy as np np.random.seed(20201125) print(np.random.rand())print(np.random.rand(5))print(np.random.rand(4,3))np.random.seed(20201125) print(np.random.uniform()) print(np.random.uniform(size=5))print(np.random.uniform(size=(4,3))) 0.8098159304646425 [0.03579724 0.20674657 0.94257697 0.62413889 0.01230949] [[0.31290955 0.05072421 0.47959837][0.73333412 0.23161854 0.93494929][0.67984729 0.35497093 0.56270729][0.3101304 0.21993047 0.11158845]] 0.8098159304646425 [0.03579724 0.20674657 0.94257697 0.62413889 0.01230949] [[0.31290955 0.05072421 0.47959837][0.73333412 0.23161854 0.93494929][0.67984729 0.35497093 0.56270729][0.3101304 0.21993047 0.11158845]]

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

  • 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 時(shí),取[low,high)之間隨機(jī)整數(shù),否則取值[0,low)之間隨機(jī)整數(shù)。

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

正態(tài)分布

標(biāo)準(zhǔn)正態(tài)分布數(shù)學(xué)表示:

  • numpy.random.randn(d0, d1, …, dn) Return a sample (or samples) from the “standard normal” distribution.

【例】根據(jù)指定大小產(chǎn)生滿足標(biāo)準(zhǔn)正態(tài)分布的數(shù)組(均值為0,標(biāo)準(zhǔn)差為1)。

import numpy as np import matplotlib.pyplot as plt from scipy import statsnp.random.seed(20201125) size = 50000 x = np.random.randn(size) 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) print(y2) print(y3)plt.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) print(y2) print(y3) 0.68192 0.95412 0.99734

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-bW4FIzfD-1606315239577)(output_17_1.png)]

0.6826894921370859 0.9544997361036416 0.9973002039367398

還可以指定分布以及所需參數(shù)來進(jìn)行隨機(jī),例如高斯分布中的mu和sigma。

  • numpy.random.normal(loc=0.0, scale=1.0, size=None) Draw random samples from a normal (Gaussian) distribution.

normal() 為創(chuàng)建均值為 loc(mu),標(biāo)準(zhǔn)差為 scale(sigma),大小為 size 的數(shù)組。

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

import numpy as np import matplotlib.pyplot as plt np.random.seed(20200614) x = 0.5 * np.random.randn(2, 4) + 5print(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)差 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]] [[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)差) 4.996403463175092 0.4986846716715106 plt.hist(x, bins=20) plt.show()

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-23IE0XtK-1606315239578)(output_21_0.png)]

指數(shù)分布

指數(shù)分布描述時(shí)間發(fā)生的時(shí)間長度間隔。

指數(shù)分布的數(shù)學(xué)表示:

  • numpy.random.exponential(scale=1.0, size=None) Draw samples from an exponential distribution.

【例】scale = 1/lambda

import numpy as np import matplotlib.pyplot as plt from scipy import stats np.random.seed(20200614) lam = 7 size = 50000 x = np.random.exponential(1 / lam, size) 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.95056 plt.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.6321205588285577 print(y2) # 0.8646647167633873 print(y3) # 0.950212931632136 0.63218 0.86518 0.95056

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-50zHUYYz-1606315239578)(output_23_1.png)]

0.6321205588285577 0.8646647167633873 0.950212931632136

其它隨機(jī)函數(shù)

隨機(jī)從序列中獲取元素

  • numpy.random.choice(a, size=None, replace=True, p=None) Generates a random sample from a given 1-D array.

從序列中獲取元素,若a 為整數(shù),元素取值從np.range(a) 中隨機(jī)獲取;若a 為數(shù)組,取值從a 數(shù)組
元素中隨機(jī)獲取。該函數(shù)還可以控制生成數(shù)組中的元素是否重復(fù)replace ,以及選取元素的概率p 。

import numpy as np np.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] [2 0 1] [3 2 3] [3 0 2] ['pooh' 'rabbit' 'pooh' 'pooh' 'pooh'] [2 0 1]

對數(shù)據(jù)集進(jìn)行洗牌操作

數(shù)據(jù)一般都是按照采集順序排列的,但是在機(jī)器學(xué)習(xí)中很多算法都要求數(shù)據(jù)之間相互獨(dú)立,所以需要
先對數(shù)據(jù)集進(jìn)行洗牌操作。

  • 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 進(jìn)行重排序,如果x 為多維數(shù)組,只沿第 0 軸洗牌,改變原來的數(shù)組,輸出為None。

【例】洗牌,改變自身內(nèi)容,打亂順序。

import numpy as np np.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])) # None x = np.arange(20).reshape((5, 4)) print(x)np.random.shuffle(x) print(x) [6 8 7 5 3 9 1 4 0 2] None [[ 0 1 2 3][ 4 5 6 7][ 8 9 10 11][12 13 14 15][16 17 18 19]] [[ 8 9 10 11][ 0 1 2 3][12 13 14 15][16 17 18 19][ 4 5 6 7]]
  • 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() 函數(shù)的作用與shuffle() 函數(shù)相同,可以打亂第0軸的數(shù)據(jù),但是它不會(huì)改變原來的數(shù)
組。

【例】

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

總結(jié)

以上是生活随笔為你收集整理的Python:NumPy-随机抽样的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。