Найти - Пользователи
Полная версия: Python 3.3 Подскажите пожалуйста, как правильно подобрать "шаг" для гауссианы.
Начало » Python для новичков » Python 3.3 Подскажите пожалуйста, как правильно подобрать "шаг" для гауссианы.
1
rudm
Мне необходимо брать два параметра и случайным образом выбирать на их основе третий, но с условием, что бы выбранное значение “укладывалось” в кривую нормального распределения.
Но как правильно подобрать шаг гауссианы, что бы вычисленное значение не сильно “выскакивало” за пределы двух значений на основе которых я его рассчитываю? Я не придумал ничего лучше, чем брать их разность и делить на два.

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)
sergeek
rudm
брать их разность и делить на два.
попробуйте делить на 7.7. На глаз(по графикам зависимости НР от СКО) вроде подходит если эти вводимые значения не сильно отличаются между собой. А лучше у какого-нибудь математика спросить.
зачем там целочисленное деление и с остатком к тому же, float не подходит?
rudm
sergeek
Спасибо! Попробую делить на 7.7
>>зачем там целочисленное деление и с остатком к тому же, float не подходит?
В документации нашел такую функцию и она показалась мне подходящей. Могу, конечно, ошибаться )

sergeek
вроде неплохо, подтверждаю число 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.

This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB