Антон Антонов
Неочевидное – вероятное
Доклады "Курилки" за последние полгода
1
Это физика!
В. Тарасевич
"Поединок"
1963, МГУ
д.ф.-м.н. В. В. Балашов
Высокий уровень абстракции
А по-человечески?
Примеры будут?
Зачем это нужно?
Случайная величина
система элементарных исходов
распределение вероятностей
3500 д.н.э. (!)
"Выпало нечётное количество очков"
"Выпало строго больше трёх очков"
Танк будет уничтожен с вероятностью
334277858179225404612400837541072273043933252046644720358295349210233339729451
653318623500070906096690267158057820537143710472954871543071966369497141477376
throw_dice <- function(n) {
sample.int(n = 6, size = n, replace = T)
}
emulate <- function(times) {
x <- replicate(times, sum(throw_dice(100)))
length(x[x >= 350 & x <= 500]) / length(x)
}
set.seed(42)
emulate(1e6)
# [1] 0.511896
С точностью до третьего знака
за несколько секунд!
S. Ulam
N. Metropolis
Метод Монте-Карло (1949)
J. von Neumann
Не считай на бумаге,
симулируй на компьютере!
В общем случае
Новая информация может изменить распределение вероятностей!
W. Casscells, A. Schoenberger, T. B. Grayboys, 1978:
"Пациент болен"
"Тест положителен"
"Пациент здоров"
"Тест отрицателен"
Ложноотрицательных нет:
Ложноположительных 1%:
болен
не болен и
тест ложноположителен
"Пациент болен"
"Тест положителен"
"Пациент здоров"
"Тест отрицателен"
infect_population <- function(n, p = 0.001) {
people <- rep.int(0, n)
people[as.logical(rbinom(n, 1, p))] <- 1
people
}
test_population <- function(people, fp_rate = 0.99) {
n_healthy <- length(people) - sum(people)
people[people == 1] <- 2
people[people == 0] <- rbinom(n_healthy, 1, 1 - fp_rate)
factor(people, labels = c("Healthy, test negative",
"Healthy, test positive",
"Infected"))
}
set.seed(1984)
people <- infect_population(1e6)
res <- summary(test_population(people))
paste0("P(Infected | test positive) = ",
sprintf("%3.1f", res["Infected"] /
(res["Infected"] + res["Healthy, test positive"])
* 100), "%")
# [1] "P(Infected | test positive) = 9.1%"
Проведём повторный тест:
болен
не болен и
тест ложноположителен
два раза подряд
test_population2 <- function(people, fp_rate = 0.99) {
n_healthy <- length(people) - sum(people)
people[people == 1] <- 3
people[people == 0] <- rbinom(n_healthy, 2, 1 - fp_rate)
factor(people, labels = c("Healthy, twice negative",
"Healthy, negative/positive",
"Healthy, twice positive",
"Infected"))
}
res2 <- summary(test_population2(people))
paste0("P(Infected | twice positive) = ",
sprintf("%3.1f", res2["Infected"] /
(res2["Infected"] + res2["Healthy, twice positive"])
* 100), "%")
# [1] "P(Infected | twice positive) = 90.8%"
Одинарный тест | Двойной тест | |
Истинное значение | 0.091 | 0.909 |
Монте-Карло | 0.091 | 0.908 |
Бесконечное количество обезьян
и собрание сочинений Шекспира
и торговля на фондовой бирже
Эксперимент стоимостью
$1,000,000,000
set.seed(1337); investor_count <- 100000; initial_balance <- 10000
delta <- 0.05; years <- 20; weeks <- 52
growth_factor <- 1.0 + (0.12 / weeks)
investors <- rep.int(initial_balance, investor_count)
bh_balance <- initial_balance
for (year in 1:years) {
for (week in 1:weeks) {
bh_balance <- bh_balance * growth_factor
investors <- investors *
(1 + delta * runif(investor_count, -1, 1)) * growth_factor
}
}
n_losers <- length(investors[investors < bh_balance])
n_winners <- length(investors[investors > bh_balance])
n_wolves <- length(investors[investors > 1000000])
writeLines(paste(sep = "\n",
sprintf("Investors %d, initial balance $%.02f",
investor_count, initial_balance),
sprintf("Buy & hold $%.02f, worst $%.02f, best $%.02f",
bh_balance, min(investors), max(investors)),
sprintf("Millionaires %d, winners %d, losers %d",
n_wolves, n_winners, n_losers)))
# Investors 100000, initial balance $10000.00
# Buy & hold $109927.40, worst $1546.53, best $4444214.61
# Millionaires 233, winners 31936, losers 68064
Результаты
Buy and hold
Начальный капитал
1. Фундаментальные математические исследования крайне важны
2. Вероятности обманчивы,
особенно в контексте медицинских и финансовых рисков
3. Метод Монте-Карло —
верный помощник при оценивании сложных вероятностей
NB!