Генерация случайных чисел для функции плотности вероятности в Python

В настоящее время я работаю над проектом, связанным с броуновским движением, и пытаюсь смоделировать некоторые из них с помощью Python (язык, в котором я, по общему признанию, очень новичок). В настоящее время моя цель — генерировать случайные числа в соответствии с заданной функцией плотности вероятности. Я пытался использовать для этого библиотеку scipy.

Мой текущий код выглядит так:

>>> import scipy.stats as st
>>> class my_pdf(st.rv_continuous):
        def _pdf(self,x,y):
            return (1/math.sqrt(4*t*D*math.pi))*(math.exp(-((x^2)/(4*D*t))))*(1/math.sqrt(4*t*D*math.pi))*(math.exp(-((y^2)/(4*D*t))))
>>> def get_brown(a,b):
        D,t = a,b
        return my_pdf()
>>> get_brown(1,1)
<__main__.my_pdf object at 0x000000A66400A320>

Все попытки запустить функцию get_brown в конечном итоге дают мне эти шестнадцатеричные числа (всегда начиная с 0x000000A66400A с изменением только трех последних цифр, независимо от того, какие параметры я задаю для D и t). Я не уверен, как это интерпретировать. Все, что я хочу, это получить случайные числа после данного PDF; что означают эти шестнадцатеричные числа?


person user1209014    schedule 07.02.2018    source источник
comment
Вы печатаете ссылку на объект. Может быть, вы хотели вызвать его метод _pdf? Типа return my_pdf()._pdf(a,b) или типа того?   -  person trincot    schedule 08.02.2018
comment
Действительно ли y ^ 2 должен использовать побитовый оператор? Или вы имели в виду y ** 2?   -  person Mr. T    schedule 08.02.2018
comment
Вы правы, это должно было быть **, и я перешел к использованию my_pdf.pdf(a,b). Тем не менее, я думаю, что я все еще делаю это неправильно. Теперь он дает мне число - всегда одно и то же для заданных параметров - когда я пытаюсь создать случайные (x, y) координаты с использованием PDF.   -  person user1209014    schedule 14.02.2018


Ответы (2)


Результат, который вы видите, является адресом памяти объекта, который вы создали. Теперь вы можете спросить: какой объект? Ваш метод get_brown(int, int) вызывает return my_pdf(), который создает объект класса my_pdf и возвращает его. Если вы хотите сейчас получить доступ к функции _pdf вашего класса и рассчитать значение pdf, вы можете использовать этот код:

get_brown(1,1)._pdf(x, y)

На только что созданном объекте вы также можете использовать все методы класса scipy.stats.rv_continous, которые вы можете найти здесь.

В вашей ситуации вы также можете отказаться от своего текущего кода и просто использовать нормальное распределение, включенное в scipy, поскольку броуновское движение - это в основном нормальный случайный процесс.

person zimmerrol    schedule 07.02.2018
comment
Хм. Я попытался вызвать get_brown(1,1)._pdf(x, y), но все, что я получил, это NameError: имя 'y' не определено... - person user1209014; 09.02.2018

Как уже отмечалось, это место памяти. Ваша функция get_brown получает экземпляр класса my_pdf, но не оценивает метод внутри этого класса.

Что вы, вероятно, захотите сделать, так это вызвать метод _pdf для этого экземпляра, а не возвращать сам класс.

def get_brown(a,b):
    D,t = a,b  #  what is D,t for?
    return my_pdf()_pdf(a,b)

Я ожидаю, что код, который вы разместили, является упрощением того, что вы действительно делаете, но функции не обязательно должны быть внутри классов, поэтому функция _pdf может жить сама по себе. В качестве альтернативы вам не нужно использовать функцию get_brown — просто создайте экземпляр класса my_pdf и вызовите метод расчета.

person Kirk Broadhurst    schedule 07.02.2018