Чтобы было понятнее, "при чём тут претензии", давайте зафиксируем то состояние вашего предыдущего комментария, на которое я отвечал, а то вы его так почикали, что вообще смысла не осталось:
sample(n) моделирует нечто исходя из нашего "знания" того, что вероятность дождя 1/n. При этом вы скармливаете этой функции все значения от 1 до 100. Пытаясь узнать вероятность дождя, вы исходите из того, что вы уже знаете что-то о дожде, причем эмулируете его вероятность так же спорно, как в примере выше мы выбирали случайную хорду.
Идут дожди с какой-то вероятностью от 1 до 0. Сгенерируем миллион случаев для каждой вероятности. Уже спорно или ещё нет? В чём "спорность"?
К каждому случаю из каждого миллиона добавим по три ответа от респондентов, соответствующих действительности с вероятностью 2/3. Теперь спорно? В чём спорность?
Выберем все случаи, когда все три ответа "да, идёт дождь", из них все случаи, когда дождь действительно идёт, поделим размер второго на размер первого, получаем статистическую вероятность. Спорно? В чём?
Вывод пока у меня получается только такой, что этот "опрос друзей" позволяет повысить точность прогноза, если нам известна "объективная" вероятность дожда, а если неизвестна, то опрос малоценен (вообще ли он бессмысленен в этом случае - чо-то не соображу).
from random import choice
def sample(n):
# (идёт ли дождь, что сказал первый друг, второй, третий)
# дождь идёт с априорной вероятностью 1/n
rain = choice([True] + [False] * (n - 1)) # идёт либо не идёт
answers = (rain, rain, not rain) # две правды и одна ложь
return (rain, choice(answers), choice(answers), choice(answers))
def probability(n_rain, N_samples):
samples = [sample(n_rain) for _ in range(N_samples)]
# выбираем все случаи, где трое сказали "да"
samples2 = [x for x in samples if x[1] and x[2] and x[3]]
# выбираем из них все случаи, когда дождь идёт
samples3 = [x for x in samples2 if x[0]]
p = len(samples3) / len(samples2)
return p
n = 100 # число априорных вероятностей, для которых моделируем
N_samples = 1000000 # число испытаний для каждой вероятности
for n in range(1, 100):
p = probability(n, N_samples)
print(f"Априорная: 1/{n}")
print(f"По опросу: {p}\n")
Вывод
Априорная: 1/1
По опросу: 1.0
Априорная: 1/2
По опросу: 0.8894085960092104
Априорная: 1/3
По опросу: 0.7996206509174386
Априорная: 1/4
По опросу: 0.7274877810361682
Априорная: 1/5
По опросу: 0.6658936353757045
...
Априорная: 1/96
По опросу: 0.07856023456852536
Априорная: 1/97
По опросу: 0.07950073936690143
Априорная: 1/98
По опросу: 0.07607433217189315
Априорная: 1/99
По опросу: 0.07514465472370316
Т. к. дофига, нарисовал графики
Графики
Не знаю, какие выводы из этого полагается сделать. Это если ещё с кодом нигде не налажал.
Собственно, о том и речь: дождь либо идёт с вероятностью P, либо не идёт с вероятностью (1 - P). P + (1 - P) = 1. А сумма вероятностей "все врут" и "все не врут" как бы получается 9/27, что не = 1.
Фублин. И действительно. 1/27 и 8/27. Прикол, типа, в том, что сумма вероятностей всех возможных исходов не равна 1? Вообще, сдаётся мне, что если все трое говорят одно и то же, то эти события перестают быть независимыми, и нужно не считать произведение вероятностей, а рассматривать их как триединую сущность, врущую с вероятностью 1/3 и говорящую правду с вероятностью 2/3. Обосновать, впрочем, не могу.
Что, на первый взгляд, и там половина, и там половина, ну вот какая разница. Но во втором случае выбираем из большего набора, и половина, сама не меняясь в количественном выражении, становится третью.
Играть в игры "у меня где-то там спрятана хитрая под2.7бка", а, тем более "угадайте, что я имел ввиду, а вот и не угадаете, бе-бе-бе" желания нет совершенно, извините. Но могу анекдот в тему рассказать: Учительница: "По небу летят два крокодила, один зелёный, другой коричневый, один со скоростью 50 км/ч, другой со скоростью 80 км/ч. Вопрос: сколько мне лет?" Вовочка (тянет руку): "Вам 24 года." "Правильно, Вовочка. Как ты узнал?" "Мой папа называет меня полудурком, а мне 12 лет."
В общем, понятно: дело в том, что в данном случае, по-сути, производятся две последовательных выборки, и первая перекашивает результат второй. В исходной популяции у нас поровну случаев "М, М", "Д, Д", "М, Д", "Д, М". В первую выборку для первой задачи идут "Д, Д" и "Д, М", из них выбираются случаи "Д, Д", их половина. В первую выборку для второй задачи идут "М, М", "М, Д" и "Д, М", из них выбираются случаи "М, М", их треть. Какая-то мутнота присутствует в формулировке задачи, раз приходится делать предположения, выходящие за рамки этой формулировки. Пояснения выше, что "становится понятнее, если бросать монеты" меня что-то, наоборот, запутали.
Правильно будет сперва сгенерировать популяцию случайных пар детей, потом выбрать из неё для первой задачи те пары, где старшая - девочка, для второй - где есть хотя бы один мальчик и, приняв размер выборки для каждой задачи за 1, уже оттуда выбрать подмножество, удовлетворяющее второму критерию? Я, честно говоря, всё ещё не вижу разницы...
Но компьютер видит
from random import choice
GIRL, BOY = 0, 1
def outcome0():
# случайная пара детей
return (choice([GIRL, BOY]), choice([GIRL, BOY]))
# проверка исхода на "оба - девочки" и "оба - мальчики"
def both_girls(outcome):
return sum(outcome) == 0
def both_boys(outcome):
return sum(outcome) == 2
N = 1000000 # миллион случайных исходов
population = [outcome0() for _ in range(N)]
outcomes1 = [outcome for outcome in population if outcome[0] == GIRL]
girls_only = [1 for outcome in outcomes1 if both_girls(outcome)]
probability1 = len(girls_only) / len(outcomes1)
outcomes2 = [outcome for outcome in population if BOY in outcome]
boys_only = [1 for outcome in outcomes2 if both_boys(outcome)]
probability2 = len(boys_only) / len(outcomes2)
print(f"Задача №1: {probability1}")
print(f"Задача №2: {probability2}")
Вывод:
Задача №1: 0.5007268254500726
Задача №2: 0.3322241975783202
Однако. Несколько лет назад я так же замоделировал "парадокс Монти-Холла", там было всё прямее и проще, понимание приходит ещё до запуска программы, где-то на этапе формализации исходов. Тут как-то более хитровыделанно...
from random import choice, shuffle
GIRL, BOY = 0, 1
# исходы для обеих задач
# (дети в парах по убыванию старшинства)
def outcome1():
# для первой задачи:
# первый - девочка, второй - ?
return [GIRL, choice([GIRL, BOY])]
def outcome2():
# для второй задачи:
# один - мальчик, другой - ?, порядок случайный
tmp = [BOY, choice([GIRL, BOY])]
shuffle(tmp) # перемешиваем, следуя букве условия (но что это меняет?)
return tmp
# проверка исхода на "оба - девочки" и "оба - мальчики"
def both_girls(outcome):
return sum(outcome) == 0
def both_boys(outcome):
return sum(outcome) == 2
N = 1000000 # миллион случайных исходов
outcomes1 = [outcome1() for _ in range(N)]
girls_only = [1 for outcome in outcomes1 if both_girls(outcome)]
probability1 = len(girls_only) / N
outcomes2 = [outcome2() for _ in range(N)]
boys_only = [1 for outcome in outcomes2 if both_boys(outcome)]
probability2 = len(boys_only) / N
print(f"Задача №1: {probability1}")
print(f"Задача №2: {probability2}")
Вывод:
Задача №1: 0.499951
Задача №2: 0.50002
Ну, понятно, чуть туда, чуть сюда, закон больших чисел, ответ для обеих задач стремится к 0.5. Если действительно для второй задачи ответ должен быть 0.33333..., то, значит, с определением функции outcome2 я просчитался, но где? Вроде, всё сделал самым наитупейшим образом, строго "в лоб", следуя букве условия вопреки здравому смыслу.
Таких сразу на улицу - он будет так же делать при любой проблеме.
Да не будет он так же делать при любой проблеме. Просто человек интеллектуально травмирован младшей, средней и высшей школой, где материал ограничен и ты должен знать его весь, тебя спрашивают - ты должен ответить, единственно правильным образом, не можешь - садись, два. Ну, отсеете вы его - остальные 99.999...% - такие же. С возрастом и с опытом, даст бог, оклемаются, заматереют, оборзеют...
Правильный ответ же "никак", а не "не знаю"? Если не считать каких-то неофициальных фанатских сборок, где люди упоролись и таки убрали GIL, сделав вместо этого отдельный lock для каждого объекта, или как-то так, но оно почему-то хуже работало, забыл почему. Мне ещё когда-то интервьюер доказывал, что в Stackless Python нету GIL, но, насколько я помню, это ложьпиздёжь.
Билять, сраный ИИ. Загуглил "Stackless Python", чтобы проверить. В гугловском "AI Overview" один из пунктов: "No Global Interpreter Lock (GIL): Unlike standard CPython, Stackless Python avoids the GIL, allowing for true parallelism in CPU-bound tasks." Думаю, фигассе, таки тот интервьюер был прав? Но далее, по первой же ссылке на Википедию: "Although microthreads make it easier to deal with running subtasks on a single core, Stackless Python does not remove CPython's global interpreter lock (GIL), nor does it use multiple threads and/or processes." И вот эта конина уже всех программистов заменит ещё вчера.
UPD.: хотя ChatGPT правильно отвечает, что GIL там есть.
UPD2.: а, ну и ещё всякие IronPython/Jython, вроде, без GIL, на .NET/Java-овских примитивах синхронизации, хотя Питон без своих библиотек, а вместо этого с библиотеками от .NET или Java чё-то счастье сомнительное.
Так output получается чёрный и пустой, потому что np.nonzero пакует результат в tuple. Надо либо во второй строчке взять area_indices[0][1:], либо в первой использовать не nonzero, а flatnonzero, ну либо там же от обычного nonzero взять только 0-й элемент, уж не знаю, что эффективнее.
Hololens имеет примерно все проблемы, описанные в статье, плюс дополнительно кучу своих, уникальных.
В статье ясно написано: 3 класс. Это 9-10 лет. Если язык не родной - вообще говорить не о чем, там возможно что угодно.
Не бывает таких детей. В 3 года - запросто, но в 3 классе и без диагноза - нет.
Чтобы было понятнее, "при чём тут претензии", давайте зафиксируем то состояние вашего предыдущего комментария, на которое я отвечал, а то вы его так почикали, что вообще смысла не осталось:
Идут дожди с какой-то вероятностью от 1 до 0. Сгенерируем миллион случаев для каждой вероятности. Уже спорно или ещё нет? В чём "спорность"?
К каждому случаю из каждого миллиона добавим по три ответа от респондентов, соответствующих действительности с вероятностью 2/3. Теперь спорно? В чём спорность?
Выберем все случаи, когда все три ответа "да, идёт дождь", из них все случаи, когда дождь действительно идёт, поделим размер второго на размер первого, получаем статистическую вероятность. Спорно? В чём?
Вывод пока у меня получается только такой, что этот "опрос друзей" позволяет повысить точность прогноза, если нам известна "объективная" вероятность дожда, а если неизвестна, то опрос малоценен (вообще ли он бессмысленен в этом случае - чо-то не соображу).
Не понял претензий. А в чём ошибка? А надо как? А как вообще можно моделировать нечто, исходя только из незнания, что это такое?
У меня получилось как-то так...
Вывод
Т. к. дофига, нарисовал графики
Не знаю, какие выводы из этого полагается сделать. Это если ещё с кодом нигде не налажал.
Собственно, о том и речь: дождь либо идёт с вероятностью P, либо не идёт с вероятностью (1 - P). P + (1 - P) = 1. А сумма вероятностей "все врут" и "все не врут" как бы получается 9/27, что не = 1.
Ваш вариант я сам не понял, а мой заключался в том, что я затупил, решив, что 1/3 в кубе будет 1/9.
Но вероятность того, что все трое сказали правду (с учётом того, что все трое ответили одинаково) разве не является уже искомой вероятностью дождя?
Я что-то не улавливаю точки приложения моделирования. Брутфорсить все возможные варианты-то бессмысленно, рассматриваются только два частных случая.
Фублин. И действительно. 1/27 и 8/27. Прикол, типа, в том, что сумма вероятностей всех возможных исходов не равна 1?
Вообще, сдаётся мне, что если все трое говорят одно и то же, то эти события перестают быть независимыми, и нужно не считать произведение вероятностей, а рассматривать их как триединую сущность, врущую с вероятностью 1/3 и говорящую правду с вероятностью 2/3. Обосновать, впрочем, не могу.
Что, на первый взгляд, и там половина, и там половина, ну вот какая разница. Но во втором случае выбираем из большего набора, и половина, сама не меняясь в количественном выражении, становится третью.
Играть в игры "у меня где-то там спрятана хитрая под2.7бка", а, тем более "угадайте, что я имел ввиду, а вот и не угадаете, бе-бе-бе" желания нет совершенно, извините. Но могу анекдот в тему рассказать:
Учительница: "По небу летят два крокодила, один зелёный, другой коричневый, один со скоростью 50 км/ч, другой со скоростью 80 км/ч. Вопрос: сколько мне лет?"
Вовочка (тянет руку): "Вам 24 года."
"Правильно, Вовочка. Как ты узнал?"
"Мой папа называет меня полудурком, а мне 12 лет."
Т. к. все трое ответили одно и то же, то либо с вероятностью 1/9 все трое соврали, либо с вероятностью 8/9 все трое сказали правду.
В общем, понятно: дело в том, что в данном случае, по-сути, производятся две последовательных выборки, и первая перекашивает результат второй. В исходной популяции у нас поровну случаев "М, М", "Д, Д", "М, Д", "Д, М".
В первую выборку для первой задачи идут "Д, Д" и "Д, М", из них выбираются случаи "Д, Д", их половина.
В первую выборку для второй задачи идут "М, М", "М, Д" и "Д, М", из них выбираются случаи "М, М", их треть.
Какая-то мутнота присутствует в формулировке задачи, раз приходится делать предположения, выходящие за рамки этой формулировки. Пояснения выше, что "становится понятнее, если бросать монеты" меня что-то, наоборот, запутали.
Правильно будет сперва сгенерировать популяцию случайных пар детей, потом выбрать из неё для первой задачи те пары, где старшая - девочка, для второй - где есть хотя бы один мальчик и, приняв размер выборки для каждой задачи за 1, уже оттуда выбрать подмножество, удовлетворяющее второму критерию? Я, честно говоря, всё ещё не вижу разницы...
Но компьютер видит
Вывод:
Однако. Несколько лет назад я так же замоделировал "парадокс Монти-Холла", там было всё прямее и проще, понимание приходит ещё до запуска программы, где-то на этапе формализации исходов. Тут как-то более хитровыделанно...
Замоделировал численно
Вывод:
Ну, понятно, чуть туда, чуть сюда, закон больших чисел, ответ для обеих задач стремится к 0.5. Если действительно для второй задачи ответ должен быть 0.33333..., то, значит, с определением функции
outcome2
я просчитался, но где? Вроде, всё сделал самым наитупейшим образом, строго "в лоб", следуя букве условия вопреки здравому смыслу.Да не будет он так же делать при любой проблеме. Просто человек интеллектуально травмирован младшей, средней и высшей школой, где материал ограничен и ты должен знать его весь, тебя спрашивают - ты должен ответить, единственно правильным образом, не можешь - садись, два. Ну, отсеете вы его - остальные 99.999...% - такие же. С возрастом и с опытом, даст бог, оклемаются, заматереют, оборзеют...
Правильный ответ же "никак", а не "не знаю"? Если не считать каких-то неофициальных фанатских сборок, где люди упоролись и таки убрали GIL, сделав вместо этого отдельный lock для каждого объекта, или как-то так, но оно почему-то хуже работало, забыл почему. Мне ещё когда-то интервьюер доказывал, что в Stackless Python нету GIL, но, насколько я помню, это ложьпиздёжь.
Билять, сраный ИИ. Загуглил "Stackless Python", чтобы проверить. В гугловском "AI Overview" один из пунктов: "No Global Interpreter Lock (GIL): Unlike standard CPython, Stackless Python avoids the GIL, allowing for true parallelism in CPU-bound tasks." Думаю, фигассе, таки тот интервьюер был прав? Но далее, по первой же ссылке на Википедию: "Although microthreads make it easier to deal with running subtasks on a single core, Stackless Python does not remove CPython's global interpreter lock (GIL), nor does it use multiple threads and/or processes." И вот эта конина уже всех программистов заменит ещё вчера.
UPD.: хотя ChatGPT правильно отвечает, что GIL там есть.
UPD2.: а, ну и ещё всякие IronPython/Jython, вроде, без GIL, на .NET/Java-овских примитивах синхронизации, хотя Питон без своих библиотек, а вместо этого с библиотеками от .NET или Java чё-то счастье сомнительное.
Так
output
получается чёрный и пустой, потому чтоnp.nonzero
пакует результат в tuple. Надо либо во второй строчке взятьarea_indices[0][1:]
, либо в первой использовать неnonzero
, аflatnonzero
, ну либо там же от обычногоnonzero
взять только 0-й элемент, уж не знаю, что эффективнее.