Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 12, 2013 16:16:50

rudm
От:
Зарегистрирован: 2009-10-27
Сообщения: 64
Репутация: +  0  -
Профиль   Отправить e-mail  

Python 3.3 Подскажите пожалуйста, как правильно подобрать "шаг" для гауссианы.

Мне необходимо брать два параметра и случайным образом выбирать на их основе третий, но с условием, что бы выбранное значение “укладывалось” в кривую нормального распределения.
Но как правильно подобрать шаг гауссианы, что бы вычисленное значение не сильно “выскакивало” за пределы двух значений на основе которых я его рассчитываю? Я не придумал ничего лучше, чем брать их разность и делить на два.

import random
value_one = 180
value_two = 195

#Находим сумму
srednee = value_one + value_two

#Делим без остатка (получаем массив где нулевой элемент результат деления на два
#а первый - остаток деления)
delenie = divmod(srednee, 2)

#Шаг отклонения по гауссиане берем как разность между
#value_one и value_two, деленную на два
#Берем по модулю, что бы убрать минус если value_one меньше value_two
sigma = abs(value_one - value_two)/2

#Подставляем как центр распределения среднее арифметическое от value_one
# и value_two, а как шаг распределения их разность деленную на два
sel = random.gauss(delenie[0], sigma)

#Округляем
rounded_sel = round(sel)

#Текстовые переменные для отладки
text1 = 'paramtr odin plus parametr dva'
text2 = 'srednee arifmeticheskoe i ostatok delenia'
text3 = 'sigma ili shag otkloninia dlia gaussiany'
text4 = 'resultat vydannyi gaussianoi'
text5 = 'okoncahtelnyi okruglenniy rezultat'

#Выводим для проверки
print(text1, srednee)
print(text2, delenie)
print(text3, sigma)
print(text4, sel)
print(text5, rounded_sel)



Отредактировано rudm (Янв. 12, 2013 16:17:51)

Офлайн

#2 Янв. 12, 2013 19:45:44

sergeek
Зарегистрирован: 2012-06-26
Сообщения: 470
Репутация: +  43  -
Профиль   Отправить e-mail  

Python 3.3 Подскажите пожалуйста, как правильно подобрать "шаг" для гауссианы.

rudm
брать их разность и делить на два.
попробуйте делить на 7.7. На глаз(по графикам зависимости НР от СКО) вроде подходит если эти вводимые значения не сильно отличаются между собой. А лучше у какого-нибудь математика спросить.
зачем там целочисленное деление и с остатком к тому же, float не подходит?

Офлайн

#3 Янв. 12, 2013 20:20:15

rudm
От:
Зарегистрирован: 2009-10-27
Сообщения: 64
Репутация: +  0  -
Профиль   Отправить e-mail  

Python 3.3 Подскажите пожалуйста, как правильно подобрать "шаг" для гауссианы.

sergeek
Спасибо! Попробую делить на 7.7
>>зачем там целочисленное деление и с остатком к тому же, float не подходит?
В документации нашел такую функцию и она показалась мне подходящей. Могу, конечно, ошибаться )



Офлайн

#4 Янв. 12, 2013 20:24:47

sergeek
Зарегистрирован: 2012-06-26
Сообщения: 470
Репутация: +  43  -
Профиль   Отправить e-mail  

Python 3.3 Подскажите пожалуйста, как правильно подобрать "шаг" для гауссианы.

вроде неплохо, подтверждаю число 7.7
можете потестить

from matplotlib import pyplot
def gen_rand(v1,v2):
    m = (v1+v2)/2;
    sko = abs(v1-v2)/7.7;
    ls=[]
    for n in range(10000):
        ls.append(random.gauss(m,sko))
    pyplot.hist(ls,bins=50)
    pyplot.show()
rudm
Могу, конечно, ошибаться )
делите просто оператором деления “/”. Если второй питон и оба числа целых то одно надо преобразовать во float.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version