From 20a942ed6b2e3e3af761c895df60aa3bac859860 Mon Sep 17 00:00:00 2001 From: Sergey Slotin Date: Tue, 3 Sep 2019 01:02:06 +0300 Subject: [PATCH] revisions --- linalg.md | 160 ++++++++++----------- probability.md | 366 ++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 432 insertions(+), 94 deletions(-) diff --git a/linalg.md b/linalg.md index 6e39375..79d9b80 100644 --- a/linalg.md +++ b/linalg.md @@ -12,7 +12,9 @@ * Функция, которая проецирует трёхмерный вектор на какую-нибудь плоскость. * Скалярное произведение $f(x, y) = x \cdot y = \sum x_ky_k$ также линейно по обоим параметрам. -Линейная алгебра занимается изучением линейных функций. Из одних лишь двух пунктов в определении можно вывести много полезных свойств: +Линейная алгебра занимается изучением линейных функций. + +Из одних лишь двух пунктов в определении можно вывести много полезных свойств: * Сумма линейных функций является линейной функцией. * Композиция линейных функций $f(g(x)) = (f \circ g)(x)$ является линейной функцией. @@ -51,32 +53,15 @@ $$ Если вектор — это упорядоченный набор скаляров, то матрицу можно рассматривать как вектор векторов. Вектор, в частности, можно представить как матрицу, у которой одна из размерностей равна единице — тогда его называют *вектор-столбец* либо *вектор-строка*. -Напишем класс для работы с матрицами, который пока что будет просто оборачивать двумерные массивы: - ```c++ -// TODO: нормально обернуть два массива - -struct matrix { - int n, m; - vector> t; - - matrix(int _n, int _m) { - n = _n, m = _m; - t.assign(n, vector(m, 0)); - } - - // сделаем себе удобное индексирование - int[] operator[](int k) { - return t[k*m]; - } -}; +typedef vector> matrix; ``` Ещё есть *тензоры* — ими называют все объекты ещё более высокого порядка: векторы матриц (трёхмерный тензор), матрицы матриц (четырёхмерный тензор) и векторы матриц матриц и так далее. ![](https://pp.userapi.com/c854216/v854216517/2a73a/ARmNQyF_XIg.jpg) -У тензоров есть своя интересная алгебра, но в контекстах, в которых с ними сталкивается обычный программист, никакая алгебра обычно не подразумневается, и этот термин используется лишь потому, что в словосочетании «многомерный массив» слишком много букв. +У тензоров есть своя интересная алгебра, но в контекстах, в которых с ними сталкивается обычный программист, никакая алгебра, как правило, не подразумневается, и этот термин используется лишь потому, что в словосочетании «многомерный массив» слишком много букв. ### Матричное умножение @@ -88,54 +73,28 @@ $$ Читатель может убедиться в этом, расписав, какие коэффициенты получаются, если формулы из $g$ подставить в $f$. -При перемножении матриц на белковых процессорах удобно думать так: элемент на пересечении $i$-го столбца и $j$-той строки — это скалярное произведение $i$-той строки $A$ и $j$-того столбца $B$. Заметим, что это накладывает ограничение на размерности перемножаемых матриц: если первая матрица имеет размер $n \times k$, то вторая должна иметь размер $k \times m$, то есть «средние» размерности обязательно должны совпадать. +При перемножении матриц руками удобно думать так: элемент на пересечении $i$-го столбца и $j$-той строки — это скалярное произведение $i$-той строки $A$ и $j$-того столбца $B$. Заметим, что это накладывает ограничение на размерности перемножаемых матриц: если первая матрица имеет размер $n \times k$, то вторая должна иметь размер $k \times m$, то есть «средние» размерности обязательно должны совпадать. ![](https://cdn.kastatic.org/googleusercontent/rk4fR1jNJsGUfdHOc87UzuQh2zokwYDoVo3Hk1m3s6ToGDgW6KxgrsUeIj8-CJeV6cNf6WB8B6sRHt3BoGBdVY7h) Исходное выражение для $f(x)$ теперь можно компактно записать как $f(x) = Ax$ вместо $m$ уравнений с $n$ слагаемыми в каждом. -Напишем внешнюю функцию, реализующую матричное умножение: +Напишем функцию, реализующую матричное умножение: ```c++ -matrix operator*(matrix a, matrix b) { - matrix c(a.n, b.m); - for (int i = 0; i < a.n; i++) - for (int j = 0; j < b.m; j++) - for (int k = 0; k < a.m; k++) - c[i][j] += a[i][k] * b[k][j]; +const int n, k, m; + +matrix matmul(matrix a, matrix b) { + matrix c(n, vector(m, 0)); + for (int i = 0; i < n; i++) + for (int j = 0; j < m; j++) + for (int t = 0; t < k; t++) + c[i][j] += a[i][t] * b[t][j]; return c; } ``` -Эта реализация очень проста, но неоптимальна. Если задуматься о том, как выглядят доступы к элементам `a` и `b` в памяти, то можно заметить что по `b` мы каждый раз прыгаем на $m$ шагов вперёд, что приводит к лишним загрузкам кэш-линий и не позволяет компилятору применить [автовекторизацию](sse). - -Однако, чтобы это исправить, достаточно перед всеми циклами *транспонировать* `b`, то есть поменять каждый её $(i, j)$-тый элемент на $(j, i)$-тый (пусть, для определённости, $i < j$). - -```c++ -// ... -``` - -Эта реализация работает раз в 5 быстрее предыдущей, и её уже довольно трудно побить. У неё возникают трудности лишь при работе большими матрицами — теми, которые не помещаются целиком в кэш. Мы для каждой строчки $c$ линейно проходимся по всем матрицам $a$ и $b$. Но можно поступить следующим образом — разделить матрицы $A$ и $B$, например, на 4 части и перемножить блочно: - -$$ -AB = -\begin{pmatrix} -A_{11} & A_{12} \\ -A_{21} & A_{22} \\ -\end{pmatrix} -\times -\begin{pmatrix} -B_{11} & B_{12} \\ -B_{21} & B_{22} \\ -\end{pmatrix} -= -\begin{pmatrix} -A_{11} B_{11} + A_{12} B_{21} & A_{11} B_{11} + A_{12} B_{21} \\ -A_{11} B_{11} + A_{12} B_{21} & A_{11} B_{11} + A_{12} B_{21} \\ -\end{pmatrix} -$$ - -Кстати, наука знает и [более быстрые](https://en.wikipedia.org/wiki/Strassen_algorithm) способы перемножить матрицы, но они имеют весьма большую константу, и более эффективны только на матрицах от тысяч элементов. +Такая реализация хоть и наиболее простая, но не оптимальная ввиду особенностей работы кэша (см. раздел «Оптимизации матричного умножения»). ### Свойства матриц @@ -149,7 +108,7 @@ $$ * Умножение матриц ассоциативно: $(AB)C = A(BC) = ABC$. * Умножение матриц в общем случае не коммутативно. -Есть специальная матрица $I$, которая называется *единичной* и относительно умножения ничего не делает, то есть ведёт себя как единица. У неё единицы на *главной диагонали* и нули вне неё: +Есть специальная матрица $I$ (иногда обозначается $E$), которая называется *единичной* и относительно умножения ничего не делает, то есть ведёт себя как единица. У неё единицы на *главной диагонали* и нули вне неё: $$ I_3 = \begin{pmatrix} @@ -161,9 +120,9 @@ $$ Некоторые линейные функции обратимы (например, поворот на угол), некоторые — необратимы (например, проекция). Понятие обратимости можно продолжить и на матрицы. -**Определение.** Матрица $A$ является *обратимой*, если существует матрица $A^{-1}$ такая, что $A \cdot A^{-1} = I$. +**Определение.** Матрица $A$ является *обратимой*, если существует матрица $A^{-1}$ такая, что $A \cdot A^{-1} = A^{-1} \cdot A = I$. -Из формулы также следует, что матрица $A$ должна быть как минимум квадратной. Обратную матрицу можно находить за $O(n^3)$ методом Гаусса, который мы рассмотрим дальше. TODO +Из формулы следует, что матрица $A$ должна быть квадратной, но этого не всегда достаточно. У неквадратных матриц обратных матриц не существует. Обратную матрицу можно находить за $O(n^3)$ методом Гаусса, который будет рассмотрен чуть позже. ### Примеры матриц @@ -215,15 +174,15 @@ $$ Переходы в некоторых динамиках иногда можно выразить в терминах матричного умножения. -Рассмотирм конкретный пример. Пусть у нас есть ориентированный граф $G$, заданный своей матрицей смежности, и нам нужно найти количество путей из $s$ в $t$ через ровно $k$ переходов. Размер графа маленький по сравнению с $k$. +Рассмотирм конкретный пример. Пусть у нас есть ориентированный граф $G$, заданный своей матрицей смежности, и нам нужно найти количество путей из $s$ в $t$ через ровно $k$ переходов. Размер графа маленький по сравнению с $k$ (скажем, несколько сотен вершин, в то время как $k$ это число порядка $10^{18}$). Обычно, мы бы ввели динамику $f_{i,v}$, равную количеству способов дойти до $v$-той вершины через ровно $i$ переходов. Пересчёт — перебор предпоследней вершины в пути: $$ -f_{i,v} = \sum_u g_{uv} \cdot f_{i-1,u} +f_{i,v} = \sum_u f_{i-1,u} \cdot G_{uv} $$ -Выясняется, что $f_{i}$ зависит от $f_{i-1}$ линейно: $v$-тый элемент получается скалярным умножением $f_{i-1}$ и $v$-того столбца матрицы смежности $G$. +Выясняется, что вектор $f_{i}$ зависит от $f_{i-1}$ **линейно**: его $v$-тый элемент получается скалярным умножением $f_{i-1}$ и $v$-того столбца матрицы смежности $G$. Значит, имеет место следующее равенство: @@ -231,7 +190,7 @@ $$ f_i = f_{i-1} G $$ -Поэтому $G$ и называют матрицей смежности. +(Поэтому $G$ и называют матрицей смежности.) Получается, $f_k$ можно раскрыть как $f_k = f_0 \cdot G \cdot G \cdot \ldots \cdot G$. Вспоминая, что умножение матриц коммутативно, по аналогии со скалярами для вычисления $G^k$ мы можем применить бинарное возведение в степень: @@ -242,21 +201,18 @@ $$ По этой формуле нам нужно $\log k$ раз перемножить две матрицы размера $n$, что суммарно будет работать за $O(n^3 \log k)$. ```c++ -matrix identity(int n) { - // создаёт единичную матрицу - matrix a(n, n); - for (int i = 0; i < n; i++) - a[i][i] = 1; - return a; -} +const int n; matrix binpow(matrix a, int p) { - matrix b = identity(a.n); + // создадим единичную матрицу + matrix b(n, vector(n, 0)); + for (int i = 0; i < n; i++) + b[i][i] = 1; while (p > 0) { if (p & 1) - b = b*a; - a = a*a; + b = matmul(b, a); + a = matmul(a, a); p >>= 1; } @@ -266,19 +222,21 @@ matrix binpow(matrix a, int p) { В получившейся матрице в ячейке $g_{ij}$ будет находиться количество способов дойти из $i$-той вершины в $j$-тую, используя ровно $k$ переходов. Ответом нужно просто вывести $g_{st}$. -Практически не меняя алгоритм, можно решить задачу «с какой вероятностью я попаду из вершины $s$ в вершину $t$», если вместо матрицы смежности даны вероятности, с которыми мы переходим из вершины в вершину в марковской цепи. +Модификации задачи: + +* Практически не меняя сам алгоритм, можно решить задачу «с какой вероятностью мы попадём из вершины $s$ в вершину $t$», если вместо булевой матрицы смежности даны вероятности, с которыми мы переходим из вершины в вершину в марковской цепи. -Если нам не нужно количество способов, а только сам факт, можно ли дойти за ровно $k$ переходов, то можно обернуть матрицу в битсеты и сильно ускорить решение. +* Если нам не нужно количество способов, а только сам факт, можно ли дойти за ровно $k$ переходов, то можно обернуть матрицу в [битсеты](bitset) и сильно ускорить решение. -Если нам нужно «за не более $k$ переходов», то можно вместо $k$-той степени считать сумму геометрической прогрессии. +* Если нас спрашивают «за не более, чем $k$ переходов», то вместо $k$-той степени матрицы мы можем подобным методом посчитать сумму геометрической прогрессии. -Подобную технику можно применить и к другим динамикам, где нужно посчитать количество способов что-то сделать — иногда очень неочевидными способами. Например, можно найти количество строк длины большого $k$, не содержащих данные маленькие подстроки, построив граф легальных переходов в Ахо-Корасике. +* Эту технику можно применить и к другим динамикам, где нужно посчитать количество способов что-то сделать — иногда очень неочевидными способами. Например, можно решить такую задачу: найти количество строк длины $k \approx 10^{18}$, не содержащих данные маленькие запрещённые подстроки. Для этого нужно построить граф «легальных» переходов в [Ахо-Корасике](aho-corasick), возвести его матрицу смежности в $k$-тую степень и просуммировать в нём первую строчку. -Внутри матричного умножения не обязательно использовать сложение и умножение — это могут быть и какие-нибудь другие операции. Например, для нахождения минимального пути. TODO: более адекватный пример +В некоторых изощрённых случаях в матричном умножении вместо умножения и сложения нужно использовать другие операции, которые ведут себя как умножение и сложение. Пример задачи: «найти путь от $s$ до $t$ с минимальным весом ребра, использующий ровно $k$ переходов»; здесь нужно возводить в $(k-1)$-ую степень матрицу весов графа, и вместо обеих операций использовать минимум матрице весов графа. ### Линейные рекурренты -Расмотрим другой пример динамики — последовательность Фибоначчи. Ну а чем не динамика? +Расмотрим другой пример — последовательность Фибоначчи. Ну а чем не динамика? $$ f_{n} = f_{n-1} + f_{n-2} @@ -286,7 +244,7 @@ $$ Как мы видим, $n$-ный элемент линейно выражается через два предыдущих. -Вообще, последовательностей Фибоначчи много — им не обязательно начинаться с 0 и 1. Для однозначной идентификации достаточно знать позиции и значения любых двух различных элементов. Поэтому в качестве состояния динамики введём: +Вообще говоря, последовательностей Фибоначчи много — им не обязательно начинаться с $0$ и $1$. Для однозначной идентификации всей последовательности достаточно знать позиции и значения любых двух различных элементов. Поэтому в качестве состояния динамики введём такой вектор-столбец: $$ \begin{pmatrix} @@ -295,8 +253,8 @@ f_{n+2} \\ \end{pmatrix} = \begin{pmatrix} -0+f_{n+1} \\ -f_{n}+f_{n+1} \\ +0 + f_{n+1} \\ +f_{n} + f_{n+1} \\ \end{pmatrix} = \begin{pmatrix} @@ -309,9 +267,9 @@ f_{n+1} \\ \end{pmatrix} $$ -Также можно «шагать» в обратном направлении, если обратить эту матрицу. +(Также можно «шагать» в обратном направлении, если обратить эту матрицу.) -Обозначим за $A$ эту матрицу перехода. Чтобы посчитать $n$-е число Фибоначчи, нужно применить $n$ раз эту матрицу к вектору $(f_0, f_1) = (0, 1)$. +Обозначим за $A$ эту матрицу перехода. Чтобы посчитать $n$-ное число Фибоначчи, нужно применить $n$ раз эту матрицу к вектору $(f_0, f_1) = (0, 1)$. Как и в предыдущем случае, мы можем воспользоваться бинарным возведением в степень: операция матричного умножения ассоциативна, поэтому применить $n$ раз матрицу перехода к вектору равносильно одному применению к нему матрицы перехода, возведённой $n$-ную степень. Её можно посчитать за $O(\log n)$, потому что размер матрицы на этот раз константный. В общем случае, линейная рекуррента $f_n = a_1 f_{n-1} + a_2 f_{n-2} + \ldots + a_k f_{n-k}$ имеет такую матрицу перехода: @@ -325,8 +283,6 @@ a_k & a_{k-1} & a_{k-2} & \ldots & a_1 \\ \end{pmatrix} $$ -Как и в прошлом случае, чтобы найти $n$-ный член последовательности, воспользуемся бинарным возведением матрицы в степень: операция матричного умножения ассоциативна, поэтому применить $n$ раз матрицу перехода к вектору равносильно одноразовому применению к нему матрицы перехода, возведённой $n$-ную степень. - ## Собственные векторы Очень часто у матриц есть *собственные векторы* — те, которые не меняют направление при применении этой матрицы к ним. @@ -390,3 +346,33 @@ t gauss (matrix a) { Код находит вектор $x$ из уравнения $Ax = b$ при условии, что решение существует и единственно. Для простоты кода, предполагается, что вектор $b$ приписан справа к матрице $A$. Часто эту систему нужно решить по модулю 2. Тогда код значительно упрощается и ускоряется (опять же, см. [Битсет](bitset#%D0%93%D0%B0%D1%83%D1%81%D1%81)). + +## Оптимизации матричного умножения + +Наивная реализация матричного умножения из начала статьи неоптимальна из-за паттерна обращения к элементам `b`: мы каждый раз двигаем указатель в памяти на $m$ шагов вперёд, что приводит к лишним загрузкам кэш-линий и не позволяет компилятору применить [автовекторизацию](sse). + +Однако, чтобы это исправить, достаточно перед всеми циклами *транспонировать* `b`, то есть поменять каждый её $(i, j)$-тый элемент на $(j, i)$-тый (пусть, для определённости, $i < j$). Такая реализация будет работать в ~5 раз быстрее, и её уже довольно трудно соптимизировать дальше. + +Дальше трудности возникают лишь при работе большими матрицами, которые не помещаются целиком в кэш — мы ведь для каждой строчки $C$ каждый раз заново проходимся по всем элементам $A$ и $B$. Тогда можно поступить следующим образом: разделить матрицы $A$ и $B$ на, например, 4 равные части, и перемножить блочно: + +$$ +AB = +\begin{pmatrix} +A_{11} & A_{12} \\ +A_{21} & A_{22} \\ +\end{pmatrix} +\times +\begin{pmatrix} +B_{11} & B_{12} \\ +B_{21} & B_{22} \\ +\end{pmatrix} += +\begin{pmatrix} +A_{11} B_{11} + A_{12} B_{21} & A_{11} B_{11} + A_{12} B_{21} \\ +A_{11} B_{11} + A_{12} B_{21} & A_{11} B_{11} + A_{12} B_{21} \\ +\end{pmatrix} +$$ + +При рекурсивном вычислении этой формулы кэш будет использован оптимально вне зависимости от его размера, а также размера кэш-линии (такие алгоритмы называют *cache-oblivious*). + +Наука знает и [более быстрые](https://en.wikipedia.org/wiki/Strassen_algorithm) способы перемножить матрицы, но они имеют весьма большую константу, и более эффективны только на матрицах от тысяч элементов. На практике достаточно транспонирования одной из матриц и итерации по второй размерности во всех трёх массивах. diff --git a/probability.md b/probability.md index 78ab7d6..5804620 100644 --- a/probability.md +++ b/probability.md @@ -1,16 +1,326 @@ # Ликбез по теорверу +**Определение.** Случайной переменной называется переменная, принимающая различные результаты случайного события. Сама по себе, случайная переменная только описывает возможные состояния; она должна быть связана с *вероятностным распределением*, которая указывает, насколько вероятно каждое из состояний. + +Например, мы можем ввести случайную переменную для исходов броска шестигранного кубика. + +Случайные переменные могут быть дискретными или непрерывными. Дискретные переменные имеют конечное или счётное количество состояний. Непрерывные переменные принимают действительные значения. + Эта статья представляет собой выжимку самых интересных фактов и «больших идей» теорвера, которые обычно рассказывают на курсах статистики, машинного обучения и теории информации. -```python -import numpy as np +Вероятностным пространством $\Omega$ называют какое-то множество элементарных исходов. Это, в общем-то, любое множество: например, $\{1, 2, 3, 4, 5, 6\}$ - исходы на кубике, или $\{(x, y) | 1 \leq x, y \leq 6\}$ - исходы на двух последовательно брошенных кубиках. + +Событием $A$ в этом пространстве называется некоторое подмножество вероятностного пространства $\Omega$, например, пустое, или само $\Omega$, или $\{1, 2, 6\}$ --- подмножество $\{1, 2, 3, 4, 5, 6\}$. + +События можно пересекать, объединять, дополнять --- они же подмножества. + +На некоторых событиях (в том числе элементарных исходах) определена функция $P$, которую называют вероятностью. Она удовлетворяет следующим условиям: + +1) $P(A \cup B) = P(A) + P(B)$, если они не пересекаются ($A \cap B = \emptyset$) + +2) $P(\Omega) = 1$ + +Чаще всего (если ничего не указывает на обратное) на элементарных исходах вероятности равны --- это называется равномерным распределением. + +Во всех этих задачах первого раздела в решениях нужно первым делом описать вероятностное пространство. + +% \subsection{Места в электричке} +% % TODO куда-то передвинуть +% Андрей, Серёжа и Лёша едут в электричке из Долгопрудного. Отсеки по 6 человек, по 12 в вагоне, вагонов 9. Они хотели бы найти места, где они могут сесть втроем. Они заглянули в вагон и увидели там 7 свободных мест. Они хотят узнать, имеет ли смысл ходить по поезду в поиске свободного места. Помогите им, посчитав матожидание числа вагонов (вероятность найти место?), которые им нужно пройти. + +\subsection{Монетка} +% TODO: какое-то из чисел нужно пофиксить так, чтобы ответ был 1/2 +Андрей и Серёжа играют в игру. Они подбрасывают монетку $N$ раз. Если орлов выпало $K$ и больше, то побеждает Андрей. В противном случае побеждает Серёжа (ничья не предусмотрена). С какой вероятностью победит Серёжа? + +a) N = 3, K = 2 + +b) N = 99, K = 50 + +c) N = 100, K = 50 + +\subsection{Рисуйте круги Эйлера} +Каждый школьник на сборах изучает хотя бы один из трех языков: Java, Python и C++. Вероятности, что случайно выбранный школьник изучает соответственно Java, Python и C++ равны $0.4$, $0.5$ и $0.6$. Вероятность, что школьник изучает Java и Python, равна $0.2$. Вероятность, что школьник изучает Python и C++, равна $0.3$. Вероятность, что школьник изучает C++ и Java, равна $0.2$. + +Найдите вероятность, что школьник изучает все три языка программирования. Найдите вероятность того, что школьник изучает только C++. + +\subsection{Разбиение числа 10*} +Петя случайным образом разбивает число 10 на сумму трех слагаемых (целые, больше нуля). Опишите вероятностное пространство и вычислите вероятность того, что среди слагаемых будет число 4. Порядок слагаемых в разложении важен. + +\subsection{Ладьи*} +На шахматной доске размера $n \times n$ случайно размещают $n$ ладей. Найдите вероятность следующих событий: + +a) $A = \{$ладьи не бьют друг друга$\}$ + +b) $B = \{$ладьи не бьют друг друга, и на главной диагонали нет никаких фигур$\}$ + +\subsection{Подсчёт голосов*} +Докажите, что вероятность того, что на выборах с участием двух кандидатов, в которых первый набрал $p$ голосов, а второй набрал $q \leq p$, первый будет опережать второго в течение всего времени подсчета, равна $\frac{p-q}{p+q}$. +\newpage +\section{Геометрическая вероятность} + +В этих задачах используется красивый прием --- вероятность равна отношению каких-нибудь площадей. + +\subsection{Точка в прямоугольнике} +Случайная точка $A$ имеет равномерное распределение в прямоугольнике со сторонами $1$ и $2$. Найдите вероятность следующих событий: + +a) расстояние от точки $A$ до любой стороны прямоугольника не превосходит $0.1$ + +b) расстояние от точки $A$ до ближайшей большей стороны прямоугольнике меньше, чем до ближайшей меньшей стороны. + +\subsection{Два числа} +$X$ и $Y$ равномерно распределены на отрезке $[0, 1]$. Какая вероятность того, что $X^2 + Y^2 \leq 1$? + +\subsection{Петя и Вася*} +Петя и Вася договорились встретиться с 12:00 до 13:00, но не договорились в какое время, поэтому каждый из них решил прийти в случайное время, подождать 10 минут и уйти. С какой вероятностью они встретятся? + +\subsection{Два числа*} Найти вероятность того, что из трех наудачу взятых отрезков длиной не более, чем 1, можно составить треугольник. +\newpage +\section{Условная вероятность и независимость} + +По определению, вероятность $A$ при условии $B$ равна $P(A | B) = \frac{P(A \cap B)}{P(B)}$. Это называется условной вероятностью, и в бытовом смысле это вероятность события $A$, если мы уже знаем, что событие $B$ точно произошло (мы как бы сужаем вероятностное пространство до $B$, отсюда и формула). + +По определению, $A \perp B$ ($A$ независимо с $B$), если $P(A \cap B) = P(A) P(B)$. Это совпадает с бытовым понятием независимости событий. Если монетку кидают несколько раз, то считается, что эти броски независимы. + +\subsection{Лампы} +Помещение освещается фонарем с тремя лампами. Вероятность перегорания одной лампы в течение года равна $0.3$. Найдите вероятность того, что в течение года хотя бы одна лампа не перегорит. + +\subsection{Формула Байеса и формула полной вероятности} +a) Докажете формулу Байеса: +$$P(A|B) = \frac{P(B|A)P(A)}{P(B)}$$ + +По смыслу это очень крутая формула --- обычно ты знаешь вероятность событий при каких-то условиях, а вот вероятности выполнения этих условий неочевидны. С помощью этих формул можно посчитать вероятность условий при условии выполнения этих событий. + +b) Докажите формулу полной вероятности: +$$P(A) = P(A|B_1)P(B_1) + ... + P(A|B_n)P(B_n)$$ +при условии +$$\Omega = B_1 \cup ... \cup B_n (B_i \cap B_j = \emptyset)$$ + +Это важная и интуитивно понятная формула --- событие просто разбивается на непересекающиеся подслучаи, считаются вероятности событий в этих случаях, и усредняется с весами, равными вероятностям этих случаев. + +\subsection{Задача на формулу Байеса, либо формулу полной вероятности} +Из 30 стрелков 12 попадает в цель с вероятностью 0,6, 8 - с вероятностью 0,5 и 10 – с вероятностью 0,7. Наудачу выбранный стрелок произвел выстрел, поразив цель. К какой из этих трех групп вероятнее всего принадлежал этот стрелок? Найдите вероятность его принадлежности к этой группе (при условии, что он действительно попал). + +% Я не понял ничего про эту задачу +% \subsection{Экзитпол*} +% Вы опрашиваете людей на выходе из избирательного участка, кто за кого проголосовал. Всего есть два кандидата — А и Б. Вы опросили 100 людей, из которых 55 проголосовали за А. С какой вероятностью кандидат А победит? + +\subsection{Контпримеры*} +Привести примеры, показывающие, что равенства + +$$P(B|A) + P(B|\overline A) = 1$$ + +$$P(B|A) + P(\overline B|\overline A) = 1$$ + +неверны. + +\subsection{Еще контрпример*} +События $A_1$, ..., $A_k$ по определению независимы в совокупности, если для любого их подмножества $A_{i_1}$, ..., $A_{i_t}$ верно равенство $P(A_{i_1}, ..., A_{i_t}) = P(A_{i_1}) \times ... \times P(A_{i_t})$). + +Приведите пример трех попарно независимых событий, которы, тем не менее, в совокупности зависимы. + +\subsection{Попарно независимые события*} +Пусть $A$, $B$, $C$ – попарно независимые равновероятные события, причем $A \cap B \cap C = \emptyset$. Найдите максимально возможное значение $P(A)$. +\newpage +\section{Случайная величина и функция распределения} + +Функцию $X: \Omega \rightarrow\mathbb{R}$ будем называть случайной величиной. Она сопоставляет каждому элементарному исходу какое-то число. Тогда можно определить и $P(X \in A)$ - вероятность, что случайная величина $X$ лежит в каком-то подмножестве действительных чисел $A$, потому что $X \in A$ — это событие в вероятностом пространстве $\Omega$. + +Функцией распределения называют $F_X(x) = P(X \leq x)$. + +Плотностью распределения называют либо $\rho_X(k) = P(X = k)$ (в дискретном случае), либо $\rho_X(x) = F_X(x)'$ --- производную функции распределения. + +\subsection{Функции распределения} +Найдите и нарисуйте функции распределения и плотности следующих случайных величин: + +a) $X = 1$ + +b) $X = +\begin{cases} + 0, & p \\ + 1, & 1-p +\end{cases} +$ + +c) $X \sim U[0, 1]$ ($X$ равномерно распределена на отрезке $[0, 1]$) + +\subsection{Геометрическое распределение} +Петя кидает монету, с вероятностью $p$ выпадает орел и он прекращает кидать ее, с вероятностью $1-p$ выпадает решка и он кидает ее еще раз. Пусть $X$ - это количество бросков. Найдите $\rho_X(x)$ и $F_X(x)$. + +% \subsection{Пуассон} +% % Это лучше рассказать просто так +% Мост может выдержать до $k$ машин. Чтобы проехать по нему, требуется 1 час. В каждую очень малую единицу времени заезжает машина с вероятностью $\lambda$. Найдите вероятность того, что мост рухнет в промежуток времени $t$, то есть по нему за это время проедет более $k$ машин. +\newpage +\section{Мат. ожидание и дисперсия} +Мат. ожиданием случайной величины $X$, которая принимает значения $a_0$, $a_1$, ... называют +$$E[X] = a_0 P(X = a_0) + a_1 P(X = a_1) + ... = \sum_{x} x p_X(x) $$ + +Если X принимает несчетное число значение (например, равномерное распределение на отрезке $[0, 1]$), то мат. ожидание определяется как интеграл фукнции $x$ умножить на плотность (достаточно понимать, что интеграл - это площадь под графиком этой функции): +$$E[X] = \int\limits_{-\infty}^{\infty} x \rho (x) dx$$ + +Дисперсия определяется как $D[X] = E[(X-E[X])^2]$ --- средний квадрат отклонения случайной величины от ее мат. ожидания. + +В бытовом смысле мат. ожидание --- это среднее значение случайное величины, а именно если взять несколько независимых одинаково распределенных случайных величин, то их среднее действительно будет стремиться к мат. ожиданию (например на физике делают несколько опытов и усредняют ответ именно для этого). + +В бытовом смысле дисперсия --- это насколько случайная величина шумная. + +Самая главная вещь в теории вероятностей: мат. ожидание линейно: + +\begin{align*} +E[X+Y] & = \sum_{x, y} (x+y) p(x, y) +\\ & = \sum_{x, y} x p(x, y) + \sum_{x, y} y p(x, y) +\\ & = \sum_x x p(x) \sum_y p(y) + \sum_y y p(y) \sum_x p(x) +\\ & = \sum_x x p(x) + \sum_y y p(y) +\\ & = E[X] + E[Y] +\end{align*} + +Если $X \perp Y$ (это значит, что все события вида $X \in A$ независимы всем событиям вида $Y \in B$), то еще и произведение можно снимать: + +$$ E[X \cdot Y] = E[X] \cdot E[Y] $$ + +% Дисперсия суммы, произведения, домноженя на константу? -import matplotlib as plt -%matplotlib inline +\subsection{Простые примеры} + +Найдите мат. ожидания и дисперсии следующих случайных величин: + +a) $X = 1$ + +b) $X = +\begin{cases} + 0, & p \\ + 1, & 1-p +\end{cases} +$ + +c) $X \sim U[0, 1]$ ($X$ равномерно распределена на отрезке $[0, 1]$) + +d) Случайная величина из задачи 4.2 (геометрическое распределение) [10-11 классам надо честно найти, 8-9 классам можно погуглить чему равна сумма ряда, так как для его нахождения нужно уметь дифференцировать] + +\subsection{Простая формула для дисперсии} +Докажите, что $$D[X] = E[X^2] - E[X]^2$$ + +\subsection{Разбиение на индикаторы} +Кинули кубик $N$ раз, найдите мат. ожидание числа выпавших шестерок. + +Подсказка: случайную величину $X[$количество выпавших шестерок$]$ можно представить как $$X = I_1 + ... + I_N$$ +где $I_k = +\begin{cases} + 1, & $на k-м кубике выпало $ 6 \\ + 0, & $иначе$ +\end{cases} +$ +Подсказка 2: используйте после этого линейность мат. ожидания + +\subsection{Случайный граф*} +Взяли $N$ вершин и каждую пару разных вершин соединили с вероятностью $0.5$. Найдите + +a) мат. ожидание числа ребер + +b) мат. ожидание числа треугольников + +\subsection{Случайный граф - 2*} +Взяли $N$ вершин и каждую пару разных вершин соединили с вероятностью $0.5$. Найдите + +a) дисперсию числа ребер + +b) дисперсию числа треугольников + +\newpage +\section{Нормальное распределение} +% ты знаешь доказательство «на пальцах»? +% доказательство чего? ЦПТ +% может не надо? может в следующий раз? +% Ну, хоть как-то убедить в правильности +% Там, про выборы и соцопросы рассказать +% мне кажется, это можно упомянуть и не доказывать + +% кстати, зацени http://sereja.me/a/pollard + +%Метод Монте-карло и его относительная ошибка. + +Есть замечательное нормальное распределение $N(a, \sigma^2)$ --- это распределение со страшной плотностью $$\rho(x) = \frac{1}{\sigma\sqrt{2\pi}}e^{-{\frac{(x-a)^2}{2\sigma^2}}}$$ +Причем его мат. ожидание равно $a$, а дисперсия равна $\sigma^2$. + +Оно замечательно тем, что если взять много независимых случайных величин одного любого распределения $X$, то распределение их среднего арифметического примерно равно $N(E[X], \frac{D[X]}{N})$. Этот факт (более строгий, конечно) называется Центральной Предельной Теоремой. + +\subsection{Кубики} +Нарисуйте, как распределена (график плотности, или просто значения плотности) сумма значений на N игральных кубиках при + +a) N = 1 + +b) N = 2 + +c) N = 3 + +d*) N = 5 + +e*) N = 100 + +Подсказка: для 5 и 100 можно написать программу и нарисовать гистгорамму. + +\subsection{Сумма нормальных величин} +Известно, что сумма двух нормально распределенных случайных величин --- тоже нормально распределенная случайная величина. Пусть $X \sim N(0, 1), Y \sim N(5, 4)$, найдите параметры (мат. ожидание и дисперсию) у случайной величины $2X + Y$. +\newpage +\section{Оценка времени работы алгоритмов и не только} + +Про рандомизированные алгоритмы мы очень часто говорили фразу "в среднем работает за O(n)". Это означает, что количество операций --- это случайная величина, и её мат. ожидание --- O(n). + +\subsection{Quicksort} +Докажите, что Quicksort со случайным выбором опорного элемента на любой фиксированной перестановке работает в среднем за $O(n\log{n})$ сравнений. + +Подсказка 1: разбейте количество сравнений на простые случайные величины и используйте линейность мат. ожидания. + +Подсказка 2: докажите лемму --- два числа $x_i$ и $x_j$ сравниваются только в том случае, если опорным элементом среди всех элементов между ними (в упорядоченном массиве) первым опорным элементом был выбран один из этих двух. + +\subsection{Высота случайного бинарного дерева*} +Найдите мат. ожидание глубины вершины случайного бинарного дерева (например, декартово дерево таким является), а именно такого дерева, у которого приоритеты вершин распределены одинаково, и по приоритетам дерево является кучей. + +Подсказка: Докажите лемму --- для любых $i\neq k$ , $x_i$ является предком $x_k$ тогда и только тогда, когда $x_i$ имеет наибольший приоритет среди $x_{min(i, k)}$, $x_{min(i, k) + 1} ... x_{max(i, k)} $. + +\subsection{Эратосфен*} +Предполагая, что вероятность того, что число $k$ простое, равно $\frac{1}{\ln k}$, покажите, что обычное решето Эратосфена работает за $O(n \log \log n)$. + +% \subsection{Гипотеза Гольдбаха} +% Предполагая, что простые числа распределены как в прошлой задаче, «докажите» гипотезу Гольдбаха. + +\subsection{Разрушение дерева*} +Дано корневое дерево. Каждую итерацию выбирается вершина (равновероятно из всех оставшихся), и удаляется всё поддерево, соответствующее этой вершине. Найти, сколько ходов в среднем будет продолжаться этот процесс, то есть матожидание номера итерации, на которой будет удалён корень дерева. + +\subsection{Альтернативное декартово дерево} +Пусть при мердже двух деревьев мы делаем подвешивание не за вершину с большим приоритетом, а следующим образом: + +\begin{itemize} + \item За левое с вероятностью $\frac{L}{L+R}$. + \item За правое с вероятностью $\frac{R}{L+R}$. +\end{itemize} + +где $L$ и $R$ это размеры соответствующих деревьев. + +Покажите, что каждая вершина всё так же равновероятно будет корнем дерева. + +% \section{Случайные процессы} + +% \subsection{От нуля до единицы*} + +% Дан следующий код: + +% % что-то не работает, как исправить? +% \begin{lstlisting}[language=Python] +% x = 0 +% while x < 1: +% x += random() +% \end{lstlisting} + +% Требуется посчитать матожидание x. + +% (random в питоне возвращает случайное действительное число от 0 до 1.) + +% \subsection{Пьяница} +% Пьяница стоит на краю обрыва (обрыв слева). С вероятностью $p$ он идёт на один шаг вправо, с вероятностью $p-1$ — на один шаг влево. Посчитайте вероятность того, что пьяница когда-либо упадёт. + +% \subsection{Казино*} +% Вы стартуете с $A$ долларов и играете в азартную игру, постоянно делая ставку один доллар, которая дает вам два доллара с вероятностью $p < \frac{1}{2}$. Для оплаты смены в лагере Юнивёрсум вы хотите в какой-то момент получить $B > A$ долларов, и как только это произойдет, вы играть прекратите. Найдите вероятность, что вы уйдете с деньгами. Вы либо уходите с $B$ долларами, либо разоряетесь. Возможно, вам придётся играть бесконечно. -import seaborn as sns -sns.set() -``` ## Плотность распределения Пусть есть некоторая случайная величина $X$. *Плотностью распределения* $X$ называется функция $p(x)$, отражающая относительную вероятность наступления события $X=x$ (то есть относительно всех остальных возможных событий). Например, для случайной величины с конечным множеством элементарных исходов $\Omega$ $p(x)=P(X=x)$ (где $P(A)$ - вероятность наступления события $A$). Обычно функция плотности вероятности предполагается нормированной на единицу (то есть площадь под графиком равна 1). *Функцией распределения* случайной численной величины $F(x)$ называется вероятность попадания $X$ в луч $(-\infty;\,x]$ (или $\int_{-\infty}^{x}p(x)\,dx$). @@ -66,6 +376,48 @@ $$ f_n = \ldots $$ TODO: история про эстетическое удовольствие, азарт и смысл посещения казино. Казино. Мы приходим в казино с 1000\$ и следующим образом проводим там время: ставим по 1\$, пока не обанкротимся или не выиграем 1100\$. Какая вероятность того, что мы уйдём с деньгами? +## Парадокс дней рождений + +> В группе, состоящей из 23 или более человек, вероятность совпадения дней рождения хотя бы у двух людей превышает 50%. + +Более общее утверждение: в мультимножество нужно добавить $\Theta(\sqrt{n})$ случайных чисел от 1 до n, чтобы какие-то два совпали. + +**Первое доказательство** (для любителей матана). Пусть $f(n, d)$ это вероятность того, что в группе из $n$ человек ни у кого не совпали дни рождения. +Будем считать, что дни рождения распределены независимо и равномерно в промежутке от $1$ до $d$. + +$$ +f(n, d) = (1-\frac{1}{d}) \times (1-\frac{2}{d}) \times ... \times (1-\frac{n-1}{d}) +$$ + +Попытаемся оценить $f$: + +$$ +\begin{aligned} + e^x & = 1 + x + \frac{x^2}{2!} + \ldots & \text{(ряд Тейлора для экспоненты)} \\ + & \simeq 1 + x & \text{(аппроксимация для $|x| \ll 1$)} \\ + e^{-\frac{n}{d}} & \simeq 1 - \frac{n}{d} & \text{(подставим $\frac{n}{d} \ll 1$)} \\ + f(n, d) & \simeq e^{-\frac{1}{d}} \times e^{-\frac{2}{d}} \times \ldots \times e^{-\frac{n-1}{d}} & \\ + & = e^{-\frac{n(n-1)}{2d}} & \\ + & \simeq e^{-\frac{n^2}{2d}} & \\ +\end{aligned} +$$ + +Из последнего выражения более-менее понятно, что вероятность $\frac{1}{2}$ достигается при $n \approx \sqrt{d}$ и в этой точке изменяется очень быстро. + +**Второе доказательство** (для любителей теорвера). Введем $\frac{n(n-1)}{2}$ индикаторов — по одному для каждой пары людей $(i, j)$ — каждый будет равен единице, если дни рождения совпали. Ожидание и вероятность каждого индикатора равна $\frac{1}{d}$. + +Обозначим за $X$ число совпавших дней рождений. Его ожидание равно сумме ожиданий этих индикаторов, то есть $\frac{n (n-1)}{2} \cdot \frac{1}{d}$. + +Отсюда понятно, что если $d = \Theta(n^2)$, то ожидание равно константе, а если $d$ асимптотически больше или меньше, то $X$ стремится нулю или бесконечности соответственно. + +*Примечание*: формально, из этого явно не следует, что вероятности тоже стремятся к 0 и 1. + +### Бонус: «мета-задача» + +Дана произвольная строка, по которой известным только авторам задачи способом генерируется ответ yes/no. В задаче 100 тестов. У вас есть 20 попыток отослать решение. В качестве фидбэка вам доступны вердикты на каждом тесте. Вердиктов всего два: OK (ответ совпал) и WA. Попытки поделить на ноль, выделить терабайт памяти и подобное тоже считаются как WA. + +«Решите» задачу. + ## Принцип максимального правдоподобия ## Энтропия