it-swarm.com.de

So generieren Sie eine zufällige Normalverteilung ganzer Zahlen

Wie generiert man eine zufällige ganze Zahl wie bei np.random.randint(), jedoch mit einer Normalverteilung um 0 herum.

np.random.randint(-10, 10) gibt Ganzzahlen mit einer diskreten gleichmäßigen Verteilung zurück np.random.normal(0, 0.1, 1) gibt Floats mit einer Normalverteilung zurück

Was ich will, ist eine Art Kombination der beiden Funktionen.

12
Ghilas BELHADJ

Eine andere Möglichkeit, eine diskrete Verteilung zu erhalten, die wie die Normalverteilung aussieht, besteht darin, aus einer multinomialen Verteilung zu zeichnen, bei der die Wahrscheinlichkeiten aus einer Normalverteilung berechnet werden.

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

x = np.arange(-10, 11)
xU, xL = x + 0.5, x - 0.5 
prob = ss.norm.cdf(xU, scale = 3) - ss.norm.cdf(xL, scale = 3)
prob = prob / prob.sum() #normalize the probabilities so their sum is 1
nums = np.random.choice(x, size = 10000, p = prob)
plt.hist(nums, bins = len(x))

Hier, np.random.choice wählt eine ganze Zahl aus [-10, 10]. Die Wahrscheinlichkeit für die Auswahl eines Elements, beispielsweise 0, wird durch p (-0,5 <x <0,5) berechnet, wobei x eine normale Zufallsvariable mit dem Mittelwert Null und der Standardabweichung 3 ist. dev. als 3, weil auf diese Weise p (-10 <x <10) fast 1 ist.

Das Ergebnis sieht so aus:

enter image description here

25
ayhan

Es kann möglich sein, eine ähnliche Verteilung aus einer Truncated Normal Distribution zu generieren, die auf ganze Zahlen gerundet wird. Hier ist ein Beispiel mit scipys truncnorm () .

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

scale = 3.
range = 10
size = 100000

X = truncnorm(a=-range/scale, b=+range/scale, scale=scale).rvs(size=size)
X = X.round().astype(int)

Mal sehen, wie es aussieht

bins = 2 * range + 1
plt.hist(X, bins)

 enter image description here

10
bakkal

Die akzeptierte Antwort funktioniert, aber ich habe die Lösung von Will Vousden ausprobiert und funktioniert auch gut:

import numpy as np

# Generate Distribution:
randomNums = np.random.normal(scale=3, size=100000)
randomInts = np.round(randomNums)

# Plot:
axis = np.arange(start=min(randomInts), stop = max(randomInts) + 1)
plt.hist(randomInts, bins = axis)

 Looks good no?

0
stephan

Hier beginnen wir mit Werten aus der Glockenkurve

CODE:

#--------*---------*---------*---------*---------*---------*---------*---------*
# Desc: Discretize a normal distribution centered at 0
#--------*---------*---------*---------*---------*---------*---------*---------*

import sys
import random
from math import sqrt, pi
import numpy as np
import matplotlib.pyplot as plt

def gaussian(x, var):
    k1 = np.power(x, 2)
    k2 = -k1/(2*var)
    return (1./(sqrt(2. * pi * var))) * np.exp(k2)

#--------*---------*---------*---------*---------*---------*---------*---------#
while 1:#                          M A I N L I N E                             #
#--------*---------*---------*---------*---------*---------*---------*---------#
#                                  # probability density function
#                                  #   for discrete normal RV
    pdf_DGV = []
    pdf_DGW = []    
    var = 9
    tot = 0    
#                                  # create 'rough' gaussian
    for i in range(-var - 1, var + 2):
        if i ==  -var - 1:
            r_pdf = + gaussian(i, 9) + gaussian(i - 1, 9) + gaussian(i - 2, 9)
        Elif i == var + 1:
            r_pdf = + gaussian(i, 9) + gaussian(i + 1, 9) + gaussian(i + 2, 9)
        else:
            r_pdf = gaussian(i, 9)
        tot = tot + r_pdf
        pdf_DGV.append(i)
        pdf_DGW.append(r_pdf)
        print(i, r_pdf)
#                                  # amusing how close tot is to 1!
    print('\nRough total = ', tot)
#                                  # no need to normalize with Python 3.6,
#                                  #   but can't help ourselves
    for i in range(0,len(pdf_DGW)):
        pdf_DGW[i] = pdf_DGW[i]/tot
#                                  # print out pdf weights
#                                  #   for out discrte gaussian
    print('\npdf:\n')
    print(pdf_DGW)

#                                  # plot random variable action
    rv_samples = random.choices(pdf_DGV, pdf_DGW, k=10000)
    plt.hist(rv_samples, bins = 100)
    plt.show()
    sys.exit()

AUSGABE:

-10 0.0007187932912256041
-9 0.001477282803979336
-8 0.003798662007932481
-7 0.008740629697903166
-6 0.017996988837729353
-5 0.03315904626424957
-4 0.05467002489199788
-3 0.0806569081730478
-2 0.10648266850745075
-1 0.12579440923099774
0 0.1329807601338109
1 0.12579440923099774
2 0.10648266850745075
3 0.0806569081730478
4 0.05467002489199788
5 0.03315904626424957
6 0.017996988837729353
7 0.008740629697903166
8 0.003798662007932481
9 0.001477282803979336
10 0.0007187932912256041

Rough total =  0.9999715875468381

pdf:

[0.000718813714486599, 0.0014773247784004072, 0.003798769940305483, 0.008740878047691289, 0.017997500190860556, 0.033159988420867426, 0.05467157824565407, 0.08065919989878699, 0.10648569402724471, 0.12579798346031068, 0.13298453855078374, 0.12579798346031068, 0.10648569402724471, 0.08065919989878699, 0.05467157824565407, 0.033159988420867426, 0.017997500190860556, 0.008740878047691289, 0.003798769940305483, 0.0014773247784004072, 0.000718813714486599]

 enter image description here

0
CopyPasteIt