Как стать автором
Обновить
3
2.4

Пользователь

Отправить сообщение

Hololens имеет примерно все проблемы, описанные в статье, плюс дополнительно кучу своих, уникальных.

В статье ясно написано: 3 класс. Это 9-10 лет. Если язык не родной - вообще говорить не о чем, там возможно что угодно.

Дети даже без этого диагноза в 3-м классе пишут прошедшее время глагола «цвести»: «цвестил», «цвестила».

Не бывает таких детей. В 3 года - запросто, но в 3 классе и без диагноза - нет.

Чтобы было понятнее, "при чём тут претензии", давайте зафиксируем то состояние вашего предыдущего комментария, на которое я отвечал, а то вы его так почикали, что вообще смысла не осталось:

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
Т. к. дофига, нарисовал графики
alt
Графики

Не знаю, какие выводы из этого полагается сделать. Это если ещё с кодом нигде не налажал.

Собственно, о том и речь: дождь либо идёт с вероятностью 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, уже оттуда выбрать подмножество, удовлетворяющее второму критерию? Я, честно говоря, всё ещё не вижу разницы...

Но компьютер видит
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.

Правильный ответ же "никак", а не "не знаю"? Если не считать каких-то неофициальных фанатских сборок, где люди упоролись и таки убрали 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-й элемент, уж не знаю, что эффективнее.

Информация

В рейтинге
1 542-й
Зарегистрирован
Активность