欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Numpy隨機抽樣的實現

 更新時間:2023年03月02日 11:06:23   作者:為實現自我而奮斗  
本文主要介紹了Numpy隨機抽樣的實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

前言

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

一、隨機模塊

numpy.random.seed(seed=None)

seed()用于指定隨機數生成時所用算法開始的整數值,如果使用相同的seed()值,則每次生成的隨機數都相同,如果不設置這個值,則系統根據時間來自己選擇這個值,此時每次生成的隨機數因時間差異而不同。
在對數據進行預處理時,經常加入新的操作或改變處理策略,此時如果伴隨著隨機操作,最好還是指定唯一的隨機種子,避免由于隨機的差異對結果產生影響。

二、離散型隨機變量

二項分布

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

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

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

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

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

import numpy as np
import matplotlib.pyplot as plt
from scipy import stats

np.random.seed(20200605)
n = 9# 做某件事情的次數
p = 0.1# 做某件事情成功的概率
size = 50000
x = 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.3897

plt.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 np
from scipy import stats
import matplotlib.pyplot as plt

np.random.seed(20200605)
n = 2# 做某件事情的次數,這里是投兩次硬幣
p = 0.5#做某件事情成功的概率,在這里即投硬幣為正面的概率
size = 50000
x = 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.25154
print(np.sum(x == 1) / size) ?# 0.49874
print(np.sum(x == 2) / size) ?# 0.24972

plt.hist(x, density=True)
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為方差

泊松分布

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

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

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

numpy.random.poisson(lam=1.0, size=None)表示對一個泊松分布進行采樣,size表示采樣的次數,lam表示一個單位內發(fā)生事件的平均值,函數的返回值表示一個單位內事件發(fā)生的次數。
【例】假定某航空公司預定票處平均每小時接到42次訂票電話,那么10分鐘內恰好接到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)
'''或者
#模擬服從泊松分布的50000個隨機變量
x = stats.poisson.rvs(lam,size=size)
'''
print(np.sum(x == 6) / size) ?# 0.14988

plt.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)表示對一個超幾何分布進行采樣,size表示采樣的次數,ngood表示總體中具有成功標志的元素個數,nbad表示總體中不具有成功標志的元素個數,ngood+nbad表示總體樣本容量,nsample表示抽取元素的次數(小于或等于總體樣本容量),函數的返回值表示抽取nsample個元素中具有成功標識的元素個數。

【例】一共20只動物里有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)
'''或者
#用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.198664

plt.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')

三、連續(xù)型隨機變量

均勻分布

  • numpy.random.uniform(low=0.0, high=1.0, size=None)
  • 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范圍內,創(chuàng)建大小為size的均勻分布的隨機數。

import numpy as np
import matplotlib.pyplot as plt
from scipy import stats

np.random.seed(20200614)
a = 0
b = 100
size = 50000
x = np.random.uniform(a, b, size=size)
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.40144

plt.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.

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

import numpy as np

np.random.seed(20200614)
print(np.random.rand())
# 0.7594819171852776

print(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]]

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

  • numpy.random.randint(low, high=None, size=None, dtype='l') Return random integers from low (inclusive) to high (exclusive).

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

import numpy as np

np.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]]

四、正態(tài)分布

標準的正太分布數學表示:

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

【例】根據指定大小產生滿足標準正態(tài)分布的數組(均值為0,標準差為1)。

import numpy as np
import matplotlib.pyplot as plt
from scipy import stats

np.random.seed(20200614)
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) ?# 0.68596
print(y2) ?# 0.95456
print(y3) ?# 0.99744

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) ?# 0.6826894921370859
print(y2) ?# 0.9544997361036416
print(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()為創(chuàng)建均值為 loc(mu),標準差為 scale(sigma),大小為 size 的數組。
import numpy as np
import matplotlib.pyplot as plt

np.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 = 50000
x = np.random.normal(mu, sigma, size)

print(np.mean(x)) ?# 4.996403463175092
print(np.std(x, ddof=1)) ?# 0.4986846716715106(#樣本標準差)
'''
ddof:int, optional
Means 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()

五、指數分布

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

指數分布的數學表示:

  • 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)
'''或者
#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.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

其他隨機函數

隨機從序列中獲取元素

  • numpy.random.choice(a, size=None, replace=True, p=None)從序列中獲取元素,若a為整數,元素取值從np.range(a)中隨機獲取;若a為數組,取值從a數組元素中隨機獲取。該函數還可以控制生成數組中的元素是否重復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]

對數據集進行洗牌操作

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

  • 【例】洗牌,改變自身內容,打亂順序。
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)
# [[ 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)permutation()函數的作用與shuffle()函數相同,可以打亂第0軸的數據,但是它不會改變原來的數組。
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]))
# [ 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]]

到此這篇關于Numpy隨機抽樣的實現的文章就介紹到這了,更多相關Numpy隨機抽樣內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Python打包成exe的兩種方法

    Python打包成exe的兩種方法

    python的開發(fā)效率非常的高,但是當我們用python寫一些小工具需要給用戶使用的時候,用戶大多數是沒有安裝python的,本文介紹兩種python的打包方案,使用pyinstaller和nuitka打包成exe,文中通過代碼示例介紹的非常詳細,需要的朋友可以參考下
    2024-05-05
  • python工具模塊介紹之time?時間訪問和轉換的示例代碼

    python工具模塊介紹之time?時間訪問和轉換的示例代碼

    這篇文章主要介紹了python工具模塊介紹-time?時間訪問和轉換,本文通過示例代碼給大家介紹的非常詳細,對大家啊的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-04-04
  • python 用pandas實現數據透視表功能

    python 用pandas實現數據透視表功能

    這篇文章主要介紹了python 用pandas實現數據透視表功能的方法,幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2020-12-12
  • 用python寫的一個wordpress的采集程序

    用python寫的一個wordpress的采集程序

    在學習python的過程中,經過不斷的嘗試及努力,終于完成了第一個像樣的python程序,雖然還有很多需要優(yōu)化的地方,但是目前基本上實現了我所要求的功能,需要的朋友可以參考下
    2016-02-02
  • python中extend功能用法舉例

    python中extend功能用法舉例

    這篇文章主要給大家介紹了關于python中extend功能的相關資料,Python中的extend()方法是一種非常有用的列表操作,它可以將一個列表中的元素添加到另一個列表的末尾,需要的朋友可以參考下
    2023-08-08
  • 關于Pycharm亂碼解決大全

    關于Pycharm亂碼解決大全

    這篇文章主要介紹了關于Pycharm亂碼解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • 使用url_helper簡化Python中Django框架的url配置教程

    使用url_helper簡化Python中Django框架的url配置教程

    這篇文章主要介紹了使用url_helper簡化Python中Django框架的url配置教程,需要的朋友可以參考下
    2015-05-05
  • python 按不同維度求和,最值,均值的實例

    python 按不同維度求和,最值,均值的實例

    今天小編就為大家分享一篇python 按不同維度求和,最值,均值的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-06-06
  • 在Python中使用HTMLParser解析HTML的教程

    在Python中使用HTMLParser解析HTML的教程

    這篇文章主要介紹了在Python中使用HTMLParser解析HTML的教程,尤其是在用Python制作爬蟲程序的時候經常可以用到,需要的朋友可以參考下
    2015-04-04
  • 解決Pycharm中import時無法識別自己寫的程序方法

    解決Pycharm中import時無法識別自己寫的程序方法

    今天小編就為大家分享一篇解決Pycharm中import時無法識別自己寫的程序方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05

最新評論