случайная выборка
Модуль numpy.random дополняет встроенный в Python модуль random, добавляя некоторые функции для эффективной генерации выборочных значений из различных вероятностных распределений, таких как нормальное распределение, распределение Пуассона и т. д.
-
numpy.random.seed(seed=None)
Seed the generator.
seed()
Целочисленное значение, используемое для указания начала алгоритма, используемого при генерации случайных чисел, если одно и то жеseed()
Если значение установлено, случайное число, генерируемое каждый раз, будет одинаковым. Если это значение не установлено, система выберет значение в соответствии со временем. В это время случайное число, генерируемое каждый раз, будет отличаться из-за Разница во времени.
При предварительной обработке данных часто добавляются новые операции или меняются стратегии обработки.В это время, если она сопровождается случайными операциями, лучше указать уникальное случайное начальное число, чтобы избежать влияния случайных различий на результаты.
дискретная случайная величина
биномиальное распределение
Биномиальное распределение может быть использовано для проблемы вероятности нескольких экспериментов, в которой есть только один эксперимент и только два результата, и соответствующие вероятности каждого результата равны. Например, иметь дело с вероятностью угадать вероятность победы 6 раз из 10 ударов и так далее.
Кодовое представление функции вероятности биномиального распределения: 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 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. ]
[Пример] Имитация двойного подбрасывания монеты. Какова вероятность того, что оба орла выпадут?
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为方差
'''
распределение Пуассона
Распределение Пуассона в основном используется для оценки вероятности события, происходящего в определенный период времени.
Кодовое представление функции вероятности Пуассона: 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 звонка по бронированию в час, какова вероятность получения ровно 6 звонков в течение 10 минут?
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)
Draw samples from a Hypergeometric distribution.
представляет выборку гипергеометрического распределения,size
представляет количество раз выборки,ngood
представляет количество элементов с флагом успеха в популяции,nbad
Представляет количество элементов в популяции, у которых нет флага успеха,ngood+nbad
общий размер выборки,nsample
Указывает количество извлечений элементов (меньше или равно общему размеру выборки), а возвращаемое значение функции указывает на извлечениеnsample
Количество элементов с успешным идентификатором в elements.
[Пример] Имеется 7 собак из 20 животных, и выбирается вероятность того, что 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')
непрерывная случайная величина
Равномерно распределены
-
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
.
[Пример] В диапазоне от низкого до высокого создайте равномерно распределенное случайное число размера 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.
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 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 fromlow
(inclusive) tohigh
(exclusive).
Возвращает случайные целые числа из «дискретного равномерного» распределения указанного dtype в «полуоткрытом» интервале [низкий, высокий). Если высокий равен None (по умолчанию), то результаты берутся из [0, низкий).
【Пример】Еслиhigh
не дляNone
Когда , возьмите случайное целое число между [низкий, высокий), в противном случае возьмите случайное целое число между [0, низкий).
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]]
нормальное распределение
Математическое представление стандартного нормального распределения:
-
numpy.random.randn(d0, d1, ..., dn)
Return a sample (or samples) from the "standard normal" distribution.
[Пример] Создайте массив, удовлетворяющий стандартному нормальному распределению (среднее 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
Вы также можете указать распределение вместе с желаемыми параметрами для рандомизации, такими как мю и сигма в распределениях Гаусса.
-
numpy.random.normal(loc=0.0, scale=1.0, size=None)
Draw random samples from a normal (Gaussian) distribution.
normal()
Чтобы создать массив размера size со средним значением loc (mu), шкалой стандартного отклонения (sigma).
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) + 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()
распределение индекса
Экспоненциальные распределения описывают длину временных интервалов, в течение которых происходит время.
Математическое представление экспоненциального распределения:
-
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)
Generates a random sample from a given 1-D array.
Получить элемент из последовательности, если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)
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 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)
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 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]]
Диаграмма, иллюстрирующая связь между биномиальным распределением, распределением Пуассона, экспоненциальным распределением, геометрическим распределением, отрицательным биномиальным распределением и гамма-распределением @zhihuwuchenzhuanlan.zhihu.com/p/32932782
использованная литература
Ссылка из:Обучение команды сообщества DataWhale