Антон Антонов
Неочевидное – вероятное
Доклады "Курилки" за последние полгода
- История 13
- Биология 13
- Космос 12
- Литература, философия 11
- Психология 10
- Физика, химия 8
- Технологии 7
- Экономика, энергетика 7
- Математика 0
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:
- Редкая болезнь: один больной на тысячу
- Точность теста: 99%
(1% ложноположительных срабатываний,
ложноотрицательных нет) - Тест положителен;
какова вероятность, что пациент болен?
"Пациент болен"
"Тест положителен"
"Пациент здоров"
"Тест отрицателен"
Ложноотрицательных нет:
Ложноположительных 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 |
Бесконечное количество обезьян
и собрание сочинений Шекспира
и торговля на фондовой бирже
- Средний темп роста рынка: 12%
- 100000 инвесторов по $10000
- Торгуем каждую неделю, 20 лет
- Цена колеблется в диапазоне -5%...+5%
- Контрольное значение: "buy and hold"
- Все сделки случайны!
Эксперимент стоимостью
$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
- Всего инвесторов: 100000
- Начальный капитал: $10,000.00
- Стратегия "buy and hold": $109,927.40
- Худший инвестор: $1,546.53
- Лучший инвестор: $4,444,214.61
- Неудачливых инвесторов: 68064
- Удачливых инвесторов: 31936
- Миллионеров: 233
Результаты
Buy and hold
Начальный капитал
1. Фундаментальные математические исследования крайне важны
2. Вероятности обманчивы,
особенно в контексте медицинских и финансовых рисков
3. Метод Монте-Карло —
верный помощник при оценивании сложных вероятностей
NB!
Kurilka Gutenberga
By Antonov Anton
Kurilka Gutenberga
The talk I gave at Kurilka Gutenberga, a popular science event (St. Petersburg, 30.09.2016).
- 587