|
1 | | -# C++ project template with Google Tests and CI/CD |
| 1 | +# ProbabilityTheoryModeling |
| 2 | +## Сборка и тесты |
| 3 | + |
| 4 | +```bash |
| 5 | +mkdir -p cmake-build-debug |
| 6 | +cd cmake-build-debug |
| 7 | +cmake .. |
| 8 | +cmake --build . |
| 9 | +ctest # или ./bin/cpp_tests |
| 10 | +``` |
2 | 11 |
|
3 | | -This is a project template. Feel free to use & fork it. It contains all pre-configured |
4 | | -CMakeLists.txt, so to use it, replace project name with your one in |
5 | | -[main CmakeLists.txt](CMakeLists.txt), and all target and executable names in |
6 | | -[CI/CD script](./.github/workflows/ci_tests.yml). Sample program prints a greeting for the first argument. |
| 12 | +--- |
7 | 13 |
|
8 | | -## How to build and run |
| 14 | +## Задание 1. Конечное вероятностное пространство и σ-алгебра |
9 | 15 |
|
10 | | -Run the following commands from the project directory. |
11 | 16 |
|
12 | | -1. Create CMake cache |
| 17 | +* Реализовать конечное пространство исходов `OutcomeSpace`. |
| 18 | +* Реализовать класс `Event` (событие как подмножество Ω). |
| 19 | +* Реализовать `ProbabilityMeasure`, задающую вероятности атомов и событий. |
| 20 | +* Реализовать дискретную случайную величину `DiscreteRandomVariable` и вычисление ее математического ожидания. |
| 21 | +* Опционально: проверить, что набор событий образует σ-алгебру. |
13 | 22 |
|
14 | | -```shell |
15 | | -cmake -S . -B cmake-build |
16 | | -``` |
| 23 | +Ожидается, что можно: |
17 | 24 |
|
18 | | -2. Build executable target |
| 25 | +* Создать Ω (например, исходы броска кубика). |
| 26 | +* Задать события (чётные числа и т.п.). |
| 27 | +* Посчитать их вероятности и E[X] для простой X. |
19 | 28 |
|
20 | | -```shell |
21 | | -cmake --build cmake-build --target cpp_tests |
22 | | -``` |
| 29 | +--- |
23 | 30 |
|
24 | | -3. Build tests target |
| 31 | +## Задание 2. Распределения и моделирование |
25 | 32 |
|
26 | | -```shell |
27 | | -cmake --build cmake-build --target cpp_tests_tests |
28 | | -``` |
| 33 | +* Есть базовый интерфейс `Distribution` с методами: |
29 | 34 |
|
30 | | -4. Run executable target |
| 35 | + * `Pdf(x)` / `Cdf(x)` |
| 36 | + * `Sample(rng)` |
| 37 | + * теоретические `Mean`, `Cariance` |
| 38 | +* Реализовать/использовать распределения: |
31 | 39 |
|
32 | | -* On Windows: |
| 40 | + * Бернулли, биномиальное, геометрическое, Пуассон |
| 41 | + * Нормальное, равномерное, экспоненциальное |
| 42 | + * Коши, Лапласа (или другое «интересное» распределение) |
| 43 | +* Класс `DistributionExperiment`: |
33 | 44 |
|
34 | | -```shell |
35 | | -.\cmake-build\cpp_tests.exe World |
36 | | -``` |
| 45 | + * сэмплирует N значений, |
| 46 | + * считает выборочные среднее и дисперсию, |
| 47 | + * сравнивает с теорией, |
| 48 | + * может строить эмпирическую CDF и считать расстояние Колмогорова. |
37 | 49 |
|
38 | | -* On *nix: |
| 50 | +Ожидается, что можно: |
39 | 51 |
|
40 | | -```shell |
41 | | -./cmake-build/bin/cpp_tests World |
42 | | -``` |
| 52 | +* Для каждого распределения провести эксперимент. |
| 53 | +* Убедиться, что выборочные характеристики приближаются к теоретическим. |
43 | 54 |
|
44 | | -5. Run tests |
| 55 | +--- |
45 | 56 |
|
46 | | -* On Windows: |
| 57 | +## Задание 3. Закон больших чисел |
47 | 58 |
|
48 | | -```shell |
49 | | -.\cmake-build\cpp_tests_tests.exe |
50 | | -``` |
| 59 | +* Класс `LawOfLargeNumbersSimulator`: |
51 | 60 |
|
52 | | -* On *nix: |
| 61 | + * принимает `std::shared_ptr<Distribution>`, |
| 62 | + * моделирует одну траекторию выборочного среднего |
| 63 | + $\overline{X}_n = (X_1 + \dots + X_n)/n$ при $n = \text{step}, 2\text{step}, \dots$, |
| 64 | + * возвращает вектор записей `(n, sample_mean, |sample_mean - theoretical_mean|)`. |
53 | 65 |
|
54 | | -```shell |
55 | | -./cmake-build/tests/cpp_tests_tests |
56 | | -``` |
| 66 | +Ожидается, что можно: |
| 67 | + |
| 68 | +* Для разных распределений (Ber, Uniform, Exp, Laplace) показать численно, что |
| 69 | + $|\overline{X}_n - \mu|$ уменьшается при росте `n`. |
| 70 | +* Обсудить поведение для распределения, у которого матожидание не определено (Коши). |
| 71 | + |
| 72 | +--- |
| 73 | + |
| 74 | +## Задание 4. Цепи Маркова и генерация текста |
| 75 | + |
| 76 | +* Класс `MarkovChain`: |
| 77 | + |
| 78 | + * состояния - строки (`std::string`), |
| 79 | + * инкрементальное обучение по последовательностям состояний, |
| 80 | + * хранение счётчиков переходов и оценка `P(next | current)`, |
| 81 | + * генерация цепочки заданной длины. |
| 82 | +* Класс `MarkovTextModel`: |
| 83 | + |
| 84 | + * два режима токенизации: `Character` (символы) и `Word` (слова), |
| 85 | + * `trainFromText(text)` - токенизировать и обучить цепь Маркова, |
| 86 | + * `generateText(num_tokens, rng, start_token)` - сгенерировать текст. |
| 87 | +* Интеграционный тест: |
| 88 | + |
| 89 | + * обучить word-level модель на «Войне и мире», |
| 90 | + * проверить размер словаря, |
| 91 | + * убедиться, что типичные слова попали в модель, |
| 92 | + * проверить, что генерация текста работает. |
| 93 | + |
| 94 | +Ожидается, что можно: |
| 95 | + |
| 96 | +* Обучить Markov-модель на большом корпусе. |
| 97 | +* Генерировать текст в стиле корпуса. |
| 98 | +* Сравнить word- и char-модели. |
| 99 | + |
| 100 | +--- |
| 101 | + |
| 102 | +Краткое резюме: |
| 103 | + |
| 104 | +* Задание 1: моделируем конечное Ω, события и вероятности. |
| 105 | +* Задание 2: реализуем и исследуем разные распределения. |
| 106 | +* Задание 3: показываем закон больших чисел на численных экспериментах. |
| 107 | +* Задание 4: строим цепь Маркова и генерируем текст (в т.ч. по «Войне и миру»). |
0 commit comments