2013-02-26 4 views
4

Я пытаюсь создать массив случайных чисел, используя случайное экспоненциальное распределение Numpy. У меня это нормально работает, однако у меня есть одно дополнительное требование для моего проекта, и это возможность точно указать, сколько элементов массива имеет определенное значение.Манипулирование распределением numpy.random.exponential в Python

Позвольте мне объяснить (код ниже, но я буду объяснять это здесь): Я генерирую свое случайное экспоненциальное распределение и строю гистограмму данных, создавая хорошую экспоненциальную кривую. То, что я действительно хочу сделать, это использовать переменную, чтобы указать y-перехват этой кривой (точка, где кривая соответствует оси y). Я могу добиться этого в основном путем изменения количества ящиков в моей гистограмме, но это только изменяет график, а не исходные данные.

Здесь я вставил кости своего кода. Чтобы дать некоторый контекст, я пытаюсь создать экспоненциальный диск из галактики, поэтому случайный массив, который я хочу сгенерировать, представляет собой массив радиусов, а переменная, которую я хочу указать, - это плотность числа в центре галактики :

import numpy as N 
import matplotlib.pyplot as P 

n = 1000  
scale_radius = 2 
central_surface_density = 100 #I would like this to be the controlling variable, even if it's specification had knock on effects on n. 

radius_array = N.random.exponential(scale_radius,(n,1))  

P.figure()  
nbins = 100 
number_density, radii = N.histogram(radius_array, bins=nbins,normed=False) 
P.plot(radii[0:-1], number_density) 
P.xlabel('$R$') 
P.ylabel(r'$\Sigma$') 
P.ylim(0, central_surface_density) 
P.legend()  
P.show() 

Этот код создает следующую гистограмму:

enter image description here

Таким образом, чтобы подвести итоги, я хотел бы быть в состоянии определить, где этот участок перехватывает у оси, контролируя, как я ve сгенерировал данные, а не изменяя, как была построена гистограмма.

Любая помощь или просьба о дальнейшем уточнении была бы очень оценена.

ответ

7

В соответствии с документами для numpy.random.exponential входной параметр beta равен 1/lambda для определения exponential described in wikipedia.

Что вы хотите, эта функция оценивается в f(x=0)=lambda=1/beta. Поэтому в нормированном распределении, ваш у-перехват должен быть просто инверсией Numpy функции:

import numpy as np 
import pylab as plt 

target = 250 
beta = 1.0/target 

Y = np.random.exponential(beta, 5000) 
plt.hist(Y, normed=True, bins=200,lw=0,alpha=.8) 
plt.plot([0,max(Y)],[target,target],'r--') 
plt.ylim(0,target*1.1) 
plt.show() 

enter image description here

Да у-отсекаемый гистограммы будет меняться с различными размерами бункера, но это ничего не значит. Единственное, о чем вы можете рассуждать здесь, это базовое распределение вероятности (отсюда normed=true)

+0

Именно это мне и нужно. Большое спасибо. – user2111574

+0

Если вы не знаете, что делает normed = true do, проверьте здесь: https://docs.scipy.org/doc/numpy/reference/generated/numpy.histogram.htm В принципе, он отображает «значение функция плотности вероятности в бункере, нормированная так, что интеграл по диапазону равен 1 " –