Deployed eb4c3fc with MkDocs version: 1.6.1

This commit is contained in:
github-actions[bot]
2025-06-03 08:39:37 +00:00
commit 3a9ab60d1f
71 changed files with 14785 additions and 0 deletions

BIN
maths/assets/baes/mode.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

BIN
maths/assets/baes/video.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 428 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 207 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 288 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

701
maths/baes/index.html Normal file
View File

@@ -0,0 +1,701 @@
<!doctype html>
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<link rel="canonical" href="https://rustbas.github.io/blog/maths/baes/">
<link rel="icon" href="../../assets/images/favicon.png">
<meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.14">
<title>Немного про Байесовскую статистику - Очередные записки очередного гика</title>
<link rel="stylesheet" href="../../assets/stylesheets/main.342714a4.min.css">
<link rel="stylesheet" href="../../assets/stylesheets/palette.06af60db.min.css">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CJetBrains+Mono:400,400i,700,700i&display=fallback">
<style>:root{--md-text-font:"Roboto";--md-code-font:"JetBrains Mono"}</style>
<script>__md_scope=new URL("../..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
</head>
<body dir="ltr" data-md-color-scheme="default" data-md-color-primary="green" data-md-color-accent="indigo">
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a href="#_1" class="md-skip">
Skip to content
</a>
</div>
<div data-md-component="announce">
</div>
<header class="md-header md-header--shadow" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="Header">
<a href="../.." title="Очередные записки очередного гика" class="md-header__button md-logo" aria-label="Очередные записки очередного гика" data-md-component="logo">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg>
</a>
<label class="md-header__button md-icon" for="__drawer">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
</label>
<div class="md-header__title" data-md-component="header-title">
<div class="md-header__ellipsis">
<div class="md-header__topic">
<span class="md-ellipsis">
Очередные записки очередного гика
</span>
</div>
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
Немного про Байесовскую статистику
</span>
</div>
</div>
</div>
<form class="md-header__option" data-md-component="palette">
<input class="md-option" data-md-color-media="" data-md-color-scheme="default" data-md-color-primary="green" data-md-color-accent="indigo" aria-label="Switch to dark mode" type="radio" name="__palette" id="__palette_0">
<label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_1" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M17 7H7a5 5 0 0 0-5 5 5 5 0 0 0 5 5h10a5 5 0 0 0 5-5 5 5 0 0 0-5-5m0 8a3 3 0 0 1-3-3 3 3 0 0 1 3-3 3 3 0 0 1 3 3 3 3 0 0 1-3 3"/></svg>
</label>
<input class="md-option" data-md-color-media="" data-md-color-scheme="slate" data-md-color-primary="teal" data-md-color-accent="indigo" aria-label="Switch to light mode" type="radio" name="__palette" id="__palette_1">
<label class="md-header__button md-icon" title="Switch to light mode" for="__palette_0" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M17 6H7c-3.31 0-6 2.69-6 6s2.69 6 6 6h10c3.31 0 6-2.69 6-6s-2.69-6-6-6m0 10H7c-2.21 0-4-1.79-4-4s1.79-4 4-4h10c2.21 0 4 1.79 4 4s-1.79 4-4 4M7 9c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3"/></svg>
</label>
</form>
<script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script>
<label class="md-header__button md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
</label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="__search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
<label class="md-search__icon md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
</label>
<nav class="md-search__options" aria-label="Search">
<button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
</button>
</nav>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
<div class="md-search-result" data-md-component="search-result">
<div class="md-search-result__meta">
Initializing search
</div>
<ol class="md-search-result__list" role="presentation"></ol>
</div>
</div>
</div>
</div>
</div>
<div class="md-header__source">
<a href="https://github.com/rustbas/blog" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M216.29 158.39H137C97 147.9 6.51 150.63 6.51 233.18c0 30.09 15 51.23 35 61-25.1 23-37 33.85-37 49.21 0 11 4.47 21.14 17.89 26.81C8.13 383.61 0 393.35 0 411.65c0 32.11 28.05 50.82 101.63 50.82 70.75 0 111.79-26.42 111.79-73.18 0-58.66-45.16-56.5-151.63-63l13.43-21.55c27.27 7.58 118.7 10 118.7-67.89 0-18.7-7.73-31.71-15-41.07l37.41-2.84zm-63.42 241.9c0 32.06-104.89 32.1-104.89 2.43 0-8.14 5.27-15 10.57-21.54 77.71 5.3 94.32 3.37 94.32 19.11m-50.81-134.58c-52.8 0-50.46-71.16 1.2-71.16 49.54 0 50.82 71.16-1.2 71.16m133.3 100.51v-32.1c26.75-3.66 27.24-2 27.24-11V203.61c0-8.5-2.05-7.38-27.24-16.26l4.47-32.92H324v168.71c0 6.51.4 7.32 6.51 8.14l20.73 2.84v32.1zm52.45-244.31c-23.17 0-36.59-13.43-36.59-36.61s13.42-35.77 36.59-35.77c23.58 0 37 12.62 37 35.77s-13.42 36.61-37 36.61M512 350.46c-17.49 8.53-43.1 16.26-66.28 16.26-48.38 0-66.67-19.5-66.67-65.46V194.75c0-5.42 1.05-4.06-31.71-4.06V154.5c35.78-4.07 50-22 54.47-66.27h38.63c0 65.83-1.34 61.81 3.26 61.81H501v40.65h-60.56v97.15c0 6.92-4.92 51.41 60.57 26.84z"/></svg>
</div>
<div class="md-source__repository">
GitHub
</div>
</a>
</div>
</nav>
</header>
<div class="md-container" data-md-component="container">
<main class="md-main" data-md-component="main">
<div class="md-main__inner md-grid">
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary" aria-label="Navigation" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href="../.." title="Очередные записки очередного гика" class="md-nav__button md-logo" aria-label="Очередные записки очередного гика" data-md-component="logo">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg>
</a>
Очередные записки очередного гика
</label>
<div class="md-nav__source">
<a href="https://github.com/rustbas/blog" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M216.29 158.39H137C97 147.9 6.51 150.63 6.51 233.18c0 30.09 15 51.23 35 61-25.1 23-37 33.85-37 49.21 0 11 4.47 21.14 17.89 26.81C8.13 383.61 0 393.35 0 411.65c0 32.11 28.05 50.82 101.63 50.82 70.75 0 111.79-26.42 111.79-73.18 0-58.66-45.16-56.5-151.63-63l13.43-21.55c27.27 7.58 118.7 10 118.7-67.89 0-18.7-7.73-31.71-15-41.07l37.41-2.84zm-63.42 241.9c0 32.06-104.89 32.1-104.89 2.43 0-8.14 5.27-15 10.57-21.54 77.71 5.3 94.32 3.37 94.32 19.11m-50.81-134.58c-52.8 0-50.46-71.16 1.2-71.16 49.54 0 50.82 71.16-1.2 71.16m133.3 100.51v-32.1c26.75-3.66 27.24-2 27.24-11V203.61c0-8.5-2.05-7.38-27.24-16.26l4.47-32.92H324v168.71c0 6.51.4 7.32 6.51 8.14l20.73 2.84v32.1zm52.45-244.31c-23.17 0-36.59-13.43-36.59-36.61s13.42-35.77 36.59-35.77c23.58 0 37 12.62 37 35.77s-13.42 36.61-37 36.61M512 350.46c-17.49 8.53-43.1 16.26-66.28 16.26-48.38 0-66.67-19.5-66.67-65.46V194.75c0-5.42 1.05-4.06-31.71-4.06V154.5c35.78-4.07 50-22 54.47-66.27h38.63c0 65.83-1.34 61.81 3.26 61.81H501v40.65h-60.56v97.15c0 6.92-4.92 51.41 60.57 26.84z"/></svg>
</div>
<div class="md-source__repository">
GitHub
</div>
</a>
</div>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../" class="md-nav__link">
<span class="md-ellipsis">
Математика
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../linux/" class="md-nav__link">
<span class="md-ellipsis">
Linux
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../common/" class="md-nav__link">
<span class="md-ellipsis">
Общее
</span>
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#_2" class="md-nav__link">
<span class="md-ellipsis">
Задача
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_3" class="md-nav__link">
<span class="md-ellipsis">
Решение
</span>
</a>
<nav class="md-nav" aria-label="Решение">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#_4" class="md-nav__link">
<span class="md-ellipsis">
Библиотеки
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_5" class="md-nav__link">
<span class="md-ellipsis">
Константы и функции
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_6" class="md-nav__link">
<span class="md-ellipsis">
Моделирование
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_7" class="md-nav__link">
<span class="md-ellipsis">
График
</span>
</a>
<nav class="md-nav" aria-label="График">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#_8" class="md-nav__link">
<span class="md-ellipsis">
Мода
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content" data-md-component="content">
<article class="md-content__inner md-typeset">
<h1 id="_1">Немного про Байесовскую статистику</h1>
<h2 id="_2">Задача</h2>
<p>Представим, что у нас есть монета, честность которой нам неизвестна (если быть
точным, мы не знаем с каким шансом выпадает орёл, с каким — решка). Поэтому мы
бы хотели оценить вероятность <span class="arithmatex">\(p\)</span> — шанс выпадения орла<sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup>.</p>
<p>В <a href="https://ru.wikipedia.org/wiki/%D0%A1%D1%82%D0%B0%D1%82%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%B0">классической статистике</a>
эта задача бы решалась бы так:</p>
<ul>
<li>Монета подбрасывается <span class="arithmatex">\(n\)</span> раз.</li>
<li>Из них <span class="arithmatex">\(m\)</span> — количество выпавших орлов.</li>
<li>Отношение <span class="arithmatex">\(\frac{m}{n}\)</span> будет оценкой <span class="arithmatex">\(p\)</span>.</li>
</ul>
<p>В <a href="https://ru.wikipedia.org/wiki/%D0%91%D0%B0%D0%B9%D0%B5%D1%81%D0%BE%D0%B2%D1%81%D0%BA%D0%B0%D1%8F_%D1%81%D1%82%D0%B0%D1%82%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%B0">Байесовской
статистике</a>
подход иной:</p>
<ol>
<li>Обозначим монету как <a href="https://ru.wikipedia.org/wiki/%D0%A0%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%91%D0%B5%D1%80%D0%BD%D1%83%D0%BB%D0%BB%D0%B8">бернуллевскую случайную
величину</a>
<span class="arithmatex">\(\xi\)</span> с параметром <span class="arithmatex">\(\theta\)</span>, у которой <span class="arithmatex">\(1\)</span> — это выпадение орла, <span class="arithmatex">\(0\)</span>
решки. </li>
<li>Предполагается априорное распределение <span class="arithmatex">\(\pi(\theta)\)</span> (т.е. распределение,
которое мы предполагаем, исходя из того, что нам известно о параметре
<span class="arithmatex">\(\theta\)</span>), как правило, это <a href="https://ru.wikipedia.org/wiki/%D0%9D%D0%B5%D0%BF%D1%80%D0%B5%D1%80%D1%8B%D0%B2%D0%BD%D0%BE%D0%B5_%D1%80%D0%B0%D0%B2%D0%BD%D0%BE%D0%BC%D0%B5%D1%80%D0%BD%D0%BE%D0%B5_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5">равномерное
распределение</a>
<span class="arithmatex">\(U \left(0,1\right)\)</span>. </li>
<li>Монета подбрасывается. </li>
<li>Распределение <span class="arithmatex">\(\theta\)</span> уточняется по формуле<sup id="fnref:2"><a class="footnote-ref" href="#fn:2">2</a></sup>:
$$\Large
\pi(\theta | \xi) = \frac{p(\xi|\theta)p(\theta)}
{\int\limits_{\Theta}p(\xi|\theta)p(\theta)d\theta}
$$</li>
<li>Повторить пункты 2-4, предполагая <span class="arithmatex">\(\pi(\theta) = \pi(\theta|\xi)\)</span></li>
</ol>
<p>Тогда оценкой <span class="arithmatex">\(\theta\)</span> будет:
$$\Large
\hat \theta = \arg \max_\theta \pi ( \theta | \xi )
$$</p>
<p>Иначе говоря,
<a href="https://ru.wikipedia.org/wiki/%D0%9C%D0%BE%D0%B4%D0%B0_%28%D1%81%D1%82%D0%B0%D1%82%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%B0%29">мода</a>
апостериорного распределения.</p>
<p>Мы, в качестве априорного распределения, взяли <a href="https://ru.wikipedia.org/wiki/%D0%91%D0%B5%D1%82%D0%B0-%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5">Бета-распределения</a> <span class="arithmatex">\(Beta(2,2)\)</span>. В
таком случае, если на <span class="arithmatex">\(i\)</span>-ом шаге мы имеем:
$$\Large
\theta \sim Beta \left( \alpha_i, \beta_i \right)
$$</p>
<p>то апостериорное распределение будет:</p>
<div class="arithmatex">\[\Large
Beta \left( \alpha_i, \beta_i \right) =
\begin{cases}
Beta \left( \alpha_i + 1, \beta_i \right), &amp;\xi_i = 1 \\
Beta \left( \alpha_i, \beta_i + 1 \right), &amp;\xi_i = 0 \\
\end{cases}
\]</div>
<p>Тогда не нужно интегрировать на каждом шаге, что существенно упрощает вычисления.</p>
<h2 id="_3">Решение</h2>
<p>Приведем решение на <code>python</code>.</p>
<h3 id="_4">Библиотеки</h3>
<p>Сначала нужно импортировать и настроить библиотеки:</p>
<div class="highlight"><pre><span></span><code><span class="kn">import</span><span class="w"> </span><span class="nn">numpy</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="nn">np</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">pandas</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="nn">pd</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">matplotlib.pyplot</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="nn">plt</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">seaborn</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="nn">sns</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">tqdm</span><span class="w"> </span><span class="kn">import</span> <span class="n">tqdm</span>
<span class="n">plt</span><span class="o">.</span><span class="n">rcParams</span><span class="o">.</span><span class="n">update</span><span class="p">({</span><span class="s1">&#39;font.size&#39;</span><span class="p">:</span> <span class="mi">14</span><span class="p">})</span>
</code></pre></div>
<h3 id="_5">Константы и функции</h3>
<p>Обозначим константы:</p>
<ul>
<li><code>p</code> — истинная вероятность выпадения орла.</li>
<li><code>NMODEL</code> — количество бросков монеты.</li>
</ul>
<div class="highlight"><pre><span></span><code><span class="n">p</span> <span class="o">=</span> <span class="mf">0.523</span>
<span class="n">NMODEL</span> <span class="o">=</span> <span class="mi">7501</span>
</code></pre></div>
<p>Введем функции:
- <code>beta</code> — объект для Бета-распределения
- <code>coin</code> — функция одиночного броска монеты</p>
<div class="highlight"><pre><span></span><code><span class="kn">from</span><span class="w"> </span><span class="nn">scipy.stats</span><span class="w"> </span><span class="kn">import</span> <span class="n">beta</span>
<span class="n">coin</span> <span class="o">=</span> <span class="k">lambda</span><span class="p">:</span> <span class="n">np</span><span class="o">.</span><span class="n">random</span><span class="o">.</span><span class="n">binomial</span><span class="p">(</span><span class="n">n</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">p</span><span class="o">=</span><span class="n">p</span><span class="p">)</span>
</code></pre></div>
<h3 id="_6">Моделирование</h3>
<p>В качестве априорного распределения тут используется Бета-распределение
<span class="arithmatex">\(Beta(2,2)\)</span>. Это сделано потому, что расчет моды накладывает ограничение, что оба
параметра должны быть строго больше 1.</p>
<p>Мода расчитывается по формуле:</p>
<div class="arithmatex">\[\Large
\text{Mode} = \frac{\alpha - 1}{\alpha + \beta - 2}
\]</div>
<div class="highlight"><pre><span></span><code><span class="n">alphas</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">zeros</span><span class="p">(</span><span class="n">NMODEL</span><span class="p">)</span>
<span class="n">betas</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">zeros</span><span class="p">(</span><span class="n">NMODEL</span><span class="p">)</span>
<span class="n">alphas</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">betas</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="mi">2</span><span class="p">,</span><span class="mi">2</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">tqdm</span><span class="p">(</span><span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">NMODEL</span><span class="p">)):</span>
<span class="n">A</span> <span class="o">=</span> <span class="n">coin</span><span class="p">()</span>
<span class="k">if</span> <span class="n">A</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
<span class="n">betas</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">alphas</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span>
<span class="n">betas</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">cumsum</span><span class="p">(</span><span class="n">betas</span><span class="p">)</span>
<span class="n">alphas</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">cumsum</span><span class="p">(</span><span class="n">alphas</span><span class="p">)</span>
<span class="n">Es</span> <span class="o">=</span> <span class="p">(</span><span class="n">alphas</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">/</span> <span class="p">(</span><span class="n">alphas</span> <span class="o">+</span> <span class="n">betas</span> <span class="o">-</span> <span class="mi">2</span><span class="p">)</span>
</code></pre></div>
<h3 id="_7">График</h3>
<h4 id="_8">Мода</h4>
<p>Построим график зависимости моды от количества бросков.</p>
<div class="highlight"><pre><span></span><code><span class="n">fig</span><span class="p">,</span> <span class="n">ax</span> <span class="o">=</span> <span class="n">plt</span><span class="o">.</span><span class="n">subplots</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">figsize</span><span class="o">=</span><span class="p">(</span><span class="mi">10</span><span class="p">,</span><span class="mi">8</span><span class="p">),</span> <span class="n">dpi</span><span class="o">=</span><span class="mi">80</span><span class="p">)</span>
<span class="n">sns</span><span class="o">.</span><span class="n">lineplot</span><span class="p">(</span><span class="n">x</span><span class="o">=</span><span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="n">NMODEL</span><span class="p">),</span>
<span class="n">y</span><span class="o">=</span><span class="n">Es</span><span class="p">,</span>
<span class="n">ax</span><span class="o">=</span><span class="n">ax</span><span class="p">,</span>
<span class="n">label</span><span class="o">=</span><span class="sa">r</span><span class="s2">&quot;arg$\max_p \; f(p|\mathbb</span><span class="si">{X}</span><span class="s2">)$&quot;</span><span class="p">,</span> <span class="p">)</span>
<span class="n">sns</span><span class="o">.</span><span class="n">lineplot</span><span class="p">(</span><span class="n">x</span><span class="o">=</span><span class="n">np</span><span class="o">.</span><span class="n">arange</span><span class="p">(</span><span class="n">NMODEL</span><span class="p">),</span>
<span class="n">y</span><span class="o">=</span><span class="n">p</span><span class="p">,</span>
<span class="n">ax</span><span class="o">=</span><span class="n">ax</span><span class="p">,</span>
<span class="n">label</span><span class="o">=</span><span class="sa">r</span><span class="s2">&quot;Истинное $p = </span><span class="si">{:.3f}</span><span class="s2">$&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">p</span><span class="p">))</span>
<span class="n">ax</span><span class="o">.</span><span class="n">grid</span><span class="p">()</span>
<span class="n">ax</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="n">ylabel</span><span class="o">=</span><span class="sa">r</span><span class="s2">&quot;$E(p|\mathbb</span><span class="si">{X}</span><span class="s2">)$&quot;</span><span class="p">,</span> <span class="n">xlabel</span><span class="o">=</span><span class="sa">r</span><span class="s2">&quot;$i$&quot;</span><span class="p">);</span>
</code></pre></div>
<p><img alt="mode.jpg" src="../assets/baes/mode.jpg" /></p>
<p>Гифка</p>
<p>Сделаем гифку на тему. Сначала нужно импортировать библиотеку <code>imageio</code> и зададим
шаг <code>STEP</code> (так как, потом нужно будет сохранять каждый график в опертивной
памяти, что проблематично при большом <code>NMODEL</code>):</p>
<div class="highlight"><pre><span></span><code><span class="kn">import</span><span class="w"> </span><span class="nn">imageio</span>
<span class="n">STEP</span> <span class="o">=</span> <span class="n">NMODEL</span><span class="o">//</span><span class="mi">150</span>
</code></pre></div>
<p>После, создадим список функций плотности вероятности:</p>
<div class="highlight"><pre><span></span><code><span class="n">pi</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">tqdm</span><span class="p">(</span><span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">NMODEL</span><span class="p">)):</span>
<span class="n">pi</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">beta</span><span class="p">(</span><span class="n">alphas</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="n">betas</span><span class="p">[</span><span class="n">i</span><span class="p">]))</span>
</code></pre></div>
<p>И по ним сделаем gif-изображение:</p>
<div class="highlight"><pre><span></span><code><span class="k">def</span><span class="w"> </span><span class="nf">create_frame</span><span class="p">(</span><span class="n">i</span><span class="p">):</span>
<span class="n">fig</span><span class="p">,</span> <span class="n">ax</span> <span class="o">=</span> <span class="n">plt</span><span class="o">.</span><span class="n">subplots</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">figsize</span><span class="o">=</span><span class="p">(</span><span class="mi">10</span><span class="p">,</span><span class="mi">8</span><span class="p">),</span> <span class="n">dpi</span><span class="o">=</span><span class="mi">80</span><span class="p">)</span>
<span class="n">x</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">linspace</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="mi">500</span><span class="p">)</span>
<span class="n">y</span> <span class="o">=</span> <span class="n">pi</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">.</span><span class="n">pdf</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
<span class="n">i_max</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">argmax</span><span class="p">(</span><span class="n">y</span><span class="p">)</span>
<span class="n">x_max</span> <span class="o">=</span> <span class="n">x</span><span class="p">[</span><span class="n">i_max</span><span class="p">]</span>
<span class="n">y_max</span> <span class="o">=</span> <span class="n">y</span><span class="p">[</span><span class="n">i_max</span><span class="p">]</span>
<span class="n">ax</span><span class="o">.</span><span class="n">grid</span><span class="p">()</span>
<span class="n">ax</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">x</span><span class="p">,</span><span class="n">y</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="sa">r</span><span class="s2">&quot;$f(p|\mathbb</span><span class="si">{X}</span><span class="s2">)$&quot;</span><span class="p">)</span>
<span class="n">ax</span><span class="o">.</span><span class="n">axvline</span><span class="p">(</span><span class="n">x</span> <span class="o">=</span> <span class="n">p</span><span class="p">,</span> <span class="n">color</span> <span class="o">=</span> <span class="s1">&#39;red&#39;</span><span class="p">,</span> <span class="n">label</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;Истинное $p=</span><span class="si">{</span><span class="n">p</span><span class="si">}</span><span class="s2">$&quot;</span><span class="p">)</span>
<span class="n">plt</span><span class="o">.</span><span class="n">scatter</span><span class="p">([</span><span class="n">x_max</span><span class="p">],</span>
<span class="p">[</span><span class="n">y_max</span><span class="p">],</span>
<span class="n">color</span><span class="o">=</span><span class="s2">&quot;green&quot;</span><span class="p">,</span>
<span class="n">marker</span><span class="o">=</span><span class="s2">&quot;o&quot;</span><span class="p">,</span>
<span class="n">label</span><span class="o">=</span><span class="sa">r</span><span class="s2">&quot;Мода $f(p|\mathbb</span><span class="si">{X}</span><span class="s2">)$&quot;</span><span class="p">)</span>
<span class="n">plt</span><span class="o">.</span><span class="n">xlim</span><span class="p">([</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">])</span>
<span class="n">plt</span><span class="o">.</span><span class="n">xlabel</span><span class="p">(</span><span class="s1">&#39;x&#39;</span><span class="p">,</span> <span class="n">fontsize</span> <span class="o">=</span> <span class="mi">14</span><span class="p">)</span>
<span class="n">plt</span><span class="o">.</span><span class="n">ylim</span><span class="p">([</span><span class="mi">0</span><span class="p">,</span><span class="mi">100</span><span class="p">])</span>
<span class="n">plt</span><span class="o">.</span><span class="n">ylabel</span><span class="p">(</span><span class="sa">r</span><span class="s1">&#39;$f(p|\mathbb</span><span class="si">{X}</span><span class="s1">)$&#39;</span><span class="p">,</span> <span class="n">fontsize</span> <span class="o">=</span> <span class="mi">14</span><span class="p">)</span>
<span class="n">plt</span><span class="o">.</span><span class="n">title</span><span class="p">(</span><span class="sa">r</span><span class="s1">&#39;Распределение p, $i=</span><span class="si">{}</span><span class="s1">$&#39;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">),</span>
<span class="n">fontsize</span><span class="o">=</span><span class="mi">14</span><span class="p">)</span>
<span class="n">ax</span><span class="o">.</span><span class="n">legend</span><span class="p">()</span>
<span class="n">plt</span><span class="o">.</span><span class="n">savefig</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;./img/img_</span><span class="si">{</span><span class="n">i</span><span class="si">:</span><span class="s1">04d</span><span class="si">}</span><span class="s1">.png&#39;</span><span class="p">,</span>
<span class="n">transparent</span> <span class="o">=</span> <span class="kc">False</span><span class="p">,</span>
<span class="n">facecolor</span> <span class="o">=</span> <span class="s1">&#39;white&#39;</span>
<span class="p">)</span>
<span class="n">plt</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">tqdm</span><span class="p">(</span><span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">NMODEL</span><span class="p">,</span> <span class="n">STEP</span><span class="p">)):</span>
<span class="n">create_frame</span><span class="p">(</span><span class="n">i</span><span class="p">)</span>
<span class="n">frames</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">tqdm</span><span class="p">(</span><span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">NMODEL</span><span class="p">,</span> <span class="n">STEP</span><span class="p">)):</span>
<span class="n">image</span> <span class="o">=</span> <span class="n">imageio</span><span class="o">.</span><span class="n">v2</span><span class="o">.</span><span class="n">imread</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;./img/img_</span><span class="si">{</span><span class="n">i</span><span class="si">:</span><span class="s1">04d</span><span class="si">}</span><span class="s1">.png&#39;</span><span class="p">)</span>
<span class="n">frames</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">image</span><span class="p">)</span>
<span class="n">imageio</span><span class="o">.</span><span class="n">mimsave</span><span class="p">(</span><span class="s1">&#39;./distributions.gif&#39;</span><span class="p">,</span>
<span class="n">frames</span><span class="p">,</span>
<span class="n">fps</span> <span class="o">=</span> <span class="mi">30</span><span class="p">)</span>
</code></pre></div>
<p>Результат:</p>
<p><img alt="gif" src="../assets/baes/video.gif" /></p>
<div class="footnote">
<hr />
<ol>
<li id="fn:1">
<p>Понятно, что вероятность выпадения решки равна <span class="arithmatex">\(1 - p\)</span>&#160;<a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text">&#8617;</a></p>
</li>
<li id="fn:2">
<p><span class="arithmatex">\(p(\theta|\xi)\)</span> -- это функция правдоподобия.&#160;<a class="footnote-backref" href="#fnref:2" title="Jump back to footnote 2 in the text">&#8617;</a></p>
</li>
</ol>
</div>
<aside class="md-source-file">
<span class="md-source-file__fact">
<span class="md-icon" title="Last update">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M21 13.1c-.1 0-.3.1-.4.2l-1 1 2.1 2.1 1-1c.2-.2.2-.6 0-.8l-1.3-1.3c-.1-.1-.2-.2-.4-.2m-1.9 1.8-6.1 6V23h2.1l6.1-6.1zM12.5 7v5.2l4 2.4-1 1L11 13V7zM11 21.9c-5.1-.5-9-4.8-9-9.9C2 6.5 6.5 2 12 2c5.3 0 9.6 4.1 10 9.3-.3-.1-.6-.2-1-.2s-.7.1-1 .2C19.6 7.2 16.2 4 12 4c-4.4 0-8 3.6-8 8 0 4.1 3.1 7.5 7.1 7.9l-.1.2z"/></svg>
</span>
2025-06-02
</span>
</aside>
</article>
</div>
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
</div>
</main>
<footer class="md-footer">
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-copyright">
Made with
<a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
Material for MkDocs
</a>
</div>
</div>
</div>
</footer>
</div>
<div class="md-dialog" data-md-component="dialog">
<div class="md-dialog__inner md-typeset"></div>
</div>
<div class="md-progress" data-md-component="progress" role="progressbar"></div>
<script id="__config" type="application/json">{"base": "../..", "features": ["navigation.instant", "navigation.instant.progress", "header.autohide"], "search": "../../assets/javascripts/workers/search.d50fe291.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
<script src="../../assets/javascripts/bundle.13a4f30d.min.js"></script>
<script src="../../javascripts/mathjax.js"></script>
<script src="https://unpkg.com/mathjax@3/es5/tex-mml-chtml.js"></script>
</body>
</html>

961
maths/gen_fun/index.html Normal file
View File

@@ -0,0 +1,961 @@
<!doctype html>
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<link rel="canonical" href="https://rustbas.github.io/blog/maths/gen_fun/">
<link rel="icon" href="../../assets/images/favicon.png">
<meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.14">
<title>Немного про производящие функции - Очередные записки очередного гика</title>
<link rel="stylesheet" href="../../assets/stylesheets/main.342714a4.min.css">
<link rel="stylesheet" href="../../assets/stylesheets/palette.06af60db.min.css">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CJetBrains+Mono:400,400i,700,700i&display=fallback">
<style>:root{--md-text-font:"Roboto";--md-code-font:"JetBrains Mono"}</style>
<script>__md_scope=new URL("../..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
</head>
<body dir="ltr" data-md-color-scheme="default" data-md-color-primary="green" data-md-color-accent="indigo">
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a href="#_1" class="md-skip">
Skip to content
</a>
</div>
<div data-md-component="announce">
</div>
<header class="md-header md-header--shadow" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="Header">
<a href="../.." title="Очередные записки очередного гика" class="md-header__button md-logo" aria-label="Очередные записки очередного гика" data-md-component="logo">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg>
</a>
<label class="md-header__button md-icon" for="__drawer">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
</label>
<div class="md-header__title" data-md-component="header-title">
<div class="md-header__ellipsis">
<div class="md-header__topic">
<span class="md-ellipsis">
Очередные записки очередного гика
</span>
</div>
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
Немного про производящие функции
</span>
</div>
</div>
</div>
<form class="md-header__option" data-md-component="palette">
<input class="md-option" data-md-color-media="" data-md-color-scheme="default" data-md-color-primary="green" data-md-color-accent="indigo" aria-label="Switch to dark mode" type="radio" name="__palette" id="__palette_0">
<label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_1" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M17 7H7a5 5 0 0 0-5 5 5 5 0 0 0 5 5h10a5 5 0 0 0 5-5 5 5 0 0 0-5-5m0 8a3 3 0 0 1-3-3 3 3 0 0 1 3-3 3 3 0 0 1 3 3 3 3 0 0 1-3 3"/></svg>
</label>
<input class="md-option" data-md-color-media="" data-md-color-scheme="slate" data-md-color-primary="teal" data-md-color-accent="indigo" aria-label="Switch to light mode" type="radio" name="__palette" id="__palette_1">
<label class="md-header__button md-icon" title="Switch to light mode" for="__palette_0" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M17 6H7c-3.31 0-6 2.69-6 6s2.69 6 6 6h10c3.31 0 6-2.69 6-6s-2.69-6-6-6m0 10H7c-2.21 0-4-1.79-4-4s1.79-4 4-4h10c2.21 0 4 1.79 4 4s-1.79 4-4 4M7 9c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3"/></svg>
</label>
</form>
<script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script>
<label class="md-header__button md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
</label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="__search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
<label class="md-search__icon md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
</label>
<nav class="md-search__options" aria-label="Search">
<button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
</button>
</nav>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
<div class="md-search-result" data-md-component="search-result">
<div class="md-search-result__meta">
Initializing search
</div>
<ol class="md-search-result__list" role="presentation"></ol>
</div>
</div>
</div>
</div>
</div>
<div class="md-header__source">
<a href="https://github.com/rustbas/blog" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M216.29 158.39H137C97 147.9 6.51 150.63 6.51 233.18c0 30.09 15 51.23 35 61-25.1 23-37 33.85-37 49.21 0 11 4.47 21.14 17.89 26.81C8.13 383.61 0 393.35 0 411.65c0 32.11 28.05 50.82 101.63 50.82 70.75 0 111.79-26.42 111.79-73.18 0-58.66-45.16-56.5-151.63-63l13.43-21.55c27.27 7.58 118.7 10 118.7-67.89 0-18.7-7.73-31.71-15-41.07l37.41-2.84zm-63.42 241.9c0 32.06-104.89 32.1-104.89 2.43 0-8.14 5.27-15 10.57-21.54 77.71 5.3 94.32 3.37 94.32 19.11m-50.81-134.58c-52.8 0-50.46-71.16 1.2-71.16 49.54 0 50.82 71.16-1.2 71.16m133.3 100.51v-32.1c26.75-3.66 27.24-2 27.24-11V203.61c0-8.5-2.05-7.38-27.24-16.26l4.47-32.92H324v168.71c0 6.51.4 7.32 6.51 8.14l20.73 2.84v32.1zm52.45-244.31c-23.17 0-36.59-13.43-36.59-36.61s13.42-35.77 36.59-35.77c23.58 0 37 12.62 37 35.77s-13.42 36.61-37 36.61M512 350.46c-17.49 8.53-43.1 16.26-66.28 16.26-48.38 0-66.67-19.5-66.67-65.46V194.75c0-5.42 1.05-4.06-31.71-4.06V154.5c35.78-4.07 50-22 54.47-66.27h38.63c0 65.83-1.34 61.81 3.26 61.81H501v40.65h-60.56v97.15c0 6.92-4.92 51.41 60.57 26.84z"/></svg>
</div>
<div class="md-source__repository">
GitHub
</div>
</a>
</div>
</nav>
</header>
<div class="md-container" data-md-component="container">
<main class="md-main" data-md-component="main">
<div class="md-main__inner md-grid">
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary" aria-label="Navigation" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href="../.." title="Очередные записки очередного гика" class="md-nav__button md-logo" aria-label="Очередные записки очередного гика" data-md-component="logo">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg>
</a>
Очередные записки очередного гика
</label>
<div class="md-nav__source">
<a href="https://github.com/rustbas/blog" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M216.29 158.39H137C97 147.9 6.51 150.63 6.51 233.18c0 30.09 15 51.23 35 61-25.1 23-37 33.85-37 49.21 0 11 4.47 21.14 17.89 26.81C8.13 383.61 0 393.35 0 411.65c0 32.11 28.05 50.82 101.63 50.82 70.75 0 111.79-26.42 111.79-73.18 0-58.66-45.16-56.5-151.63-63l13.43-21.55c27.27 7.58 118.7 10 118.7-67.89 0-18.7-7.73-31.71-15-41.07l37.41-2.84zm-63.42 241.9c0 32.06-104.89 32.1-104.89 2.43 0-8.14 5.27-15 10.57-21.54 77.71 5.3 94.32 3.37 94.32 19.11m-50.81-134.58c-52.8 0-50.46-71.16 1.2-71.16 49.54 0 50.82 71.16-1.2 71.16m133.3 100.51v-32.1c26.75-3.66 27.24-2 27.24-11V203.61c0-8.5-2.05-7.38-27.24-16.26l4.47-32.92H324v168.71c0 6.51.4 7.32 6.51 8.14l20.73 2.84v32.1zm52.45-244.31c-23.17 0-36.59-13.43-36.59-36.61s13.42-35.77 36.59-35.77c23.58 0 37 12.62 37 35.77s-13.42 36.61-37 36.61M512 350.46c-17.49 8.53-43.1 16.26-66.28 16.26-48.38 0-66.67-19.5-66.67-65.46V194.75c0-5.42 1.05-4.06-31.71-4.06V154.5c35.78-4.07 50-22 54.47-66.27h38.63c0 65.83-1.34 61.81 3.26 61.81H501v40.65h-60.56v97.15c0 6.92-4.92 51.41 60.57 26.84z"/></svg>
</div>
<div class="md-source__repository">
GitHub
</div>
</a>
</div>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../" class="md-nav__link">
<span class="md-ellipsis">
Математика
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../linux/" class="md-nav__link">
<span class="md-ellipsis">
Linux
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../common/" class="md-nav__link">
<span class="md-ellipsis">
Общее
</span>
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#_2" class="md-nav__link">
<span class="md-ellipsis">
Мотивация
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_3" class="md-nav__link">
<span class="md-ellipsis">
Ликбез
</span>
</a>
<nav class="md-nav" aria-label="Ликбез">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#_4" class="md-nav__link">
<span class="md-ellipsis">
Кратко о производящей функции последовательности
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_5" class="md-nav__link">
<span class="md-ellipsis">
Кратко о ряде Тейлора
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_6" class="md-nav__link">
<span class="md-ellipsis">
Кратко о математической индукции
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#_7" class="md-nav__link">
<span class="md-ellipsis">
Получение ряда в замкнутом виде
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_8" class="md-nav__link">
<span class="md-ellipsis">
Разложение дроби на элементарные дроби
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_9" class="md-nav__link">
<span class="md-ellipsis">
Доказательство по индукции
</span>
</a>
<nav class="md-nav" aria-label="Доказательство по индукции">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#_10" class="md-nav__link">
<span class="md-ellipsis">
База индукции
</span>
</a>
<nav class="md-nav" aria-label="База индукции">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#n-0" class="md-nav__link">
<span class="md-ellipsis">
\(n = 0\)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#n-1" class="md-nav__link">
<span class="md-ellipsis">
\(n = 1\)
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#_11" class="md-nav__link">
<span class="md-ellipsis">
Переход индукции
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#_12" class="md-nav__link">
<span class="md-ellipsis">
Выводы
</span>
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content" data-md-component="content">
<article class="md-content__inner md-typeset">
<h1 id="_1">Немного про производящие функции</h1>
<h2 id="_2">Мотивация</h2>
<p>Идея данной публикации родилась в процессе чтения статьи на <a href="https://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%B4%D1%8F%D1%89%D0%B0%D1%8F_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F#.D0.9F.D1.80.D0.B8.D0.BC.D0.B5.D1.80.D1.8B_.D1.80.D0.B5.D1.88.D0.B5.D0.BD.D0.B8.D0.B9_.D0.B7.D0.B0.D0.B4.D0.B0.D1.87_.D0.BC.D0.B5.D1.82.D0.BE.D0.B4.D0.BE.D0.BC_.D0.BF.D1.80.D0.BE.D0.B8.D0.B7.D0.B2.D0.BE.D0.B4.D1.8F.D1.89.D0.B8.D1.85_.D1.84.D1.83.D0.BD.D0.BA.D1.86.D0.B8.D0.B9">викиконспектах</a> о производящих рядах. Мне показалось очень интересным, что существует способ решения рекуррентных уравнений с помощью бесконечных сумм.</p>
<p>Здесь мы собираемся рассмотреть что такое производящая функция, разложение в ряд Тейлора, а также затронем математическую индукцию.</p>
<h2 id="_3">Ликбез</h2>
<p>Для начала, по моему мнению, нужно кратко описать сущности, которые появляются в статье. </p>
<h3 id="_4">Кратко о производящей функции последовательности</h3>
<p><em><strong>Производя́щая фу́нкция после́довательности</strong> — алгебраическое понятие, которое позволяет работать с разными комбинаторными объектами аналитическими методами. Они дают гибкий способ описывать соотношения в комбинаторике, а иногда помогают вывести явные формулы для числа комбинаторных объектов определённого типа.</em> (<a href="https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%B4%D1%8F%D1%89%D0%B0%D1%8F_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8">Википедия</a>)</p>
<p>Для последовательности <span class="arithmatex">\(\{a_n\}\)</span> производящим рядом называется бесконечная сумма:</p>
<div class="arithmatex">\[\Large{
G(z) = \sum_{n=0}^\infty a_nz^n.
}\]</div>
<p>В данной статье описывается, как использовать производящий ряд последовательности для решения рекуррентных уравнений вида:</p>
<div class="arithmatex">\[\Large{
a_n = f(a_{n-1}, \dots, a_0).
}\]</div>
<h3 id="_5">Кратко о ряде Тейлора</h3>
<p><em><strong>Ряд Те́йлора</strong> — разложение функции в бесконечную сумму степенных функций.</em> (<a href="https://ru.wikipedia.org/wiki/%D0%A0%D1%8F%D0%B4_%D0%A2%D0%B5%D0%B9%D0%BB%D0%BE%D1%80%D0%B0">Википедия</a>)</p>
<p>Для бесконечно дифференцируемой функции <span class="arithmatex">\(f(x)\)</span> в окрестности точки <span class="arithmatex">\(a\)</span> рядом Тейлора называется ряд:</p>
<div class="arithmatex">\[\Large{
f(x) = \sum_{n=0}^\infty \frac{f^{(n)}(a)}{n!}(x-a)^n.
}\]</div>
<p>В нашем случае этот ряд будет полезен тем, что когда мы вычислим производящую функцию последовательности в виде дроби, мы сможем разложить её в ряд и найти общую формулу для элементов последовательности. </p>
<h3 id="_6">Кратко о математической индукции</h3>
<p><em><strong>Математическая индукция</strong> — метод математического
доказательства, который используется, чтобы доказать
истинность некоторого утверждения для всех натуральных
чисел. Для этого сначала проверяется истинность утверждения
с номером <span class="arithmatex">\(1\)</span> — база (базис) индукции, а затем
доказывается, что если верно утверждение с номером <span class="arithmatex">\(n\)</span>, то
верно и следующее утверждение с номером <span class="arithmatex">\(n+1\)</span> — шаг
индукции, или индукционный переход.</em>
(<a href="https://ru.wikipedia.org/wiki/%D0%9C%D0%B0%D1%82%D0%B5%D0%BC%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B0%D1%8F_%D0%B8%D0%BD%D0%B4%D1%83%D0%BA%D1%86%D0%B8%D1%8F">Википедия</a>)</p>
<p>Нам понадобится этот метод для того, чтобы доказать верность формулы, которую мы получим. Применяя к нашему случаю, можно сформулировать идею доказательства так:</p>
<ol>
<li>Нужно доказать <strong>базу индукции</strong>. То есть, что формула верна для <span class="arithmatex">\(a_0\)</span> и <span class="arithmatex">\(a_1\)</span>.</li>
<li>Нужно доказать <strong>переход индукции</strong>. В нашем случае, это означает, что нужно проверить, что формула удовлетворяет изначальному рекуррентному уравнению. </li>
</ol>
<p>Идея доказательства состоит в том, что для любого <span class="arithmatex">\(k &gt; 1\)</span> наша формула будет верна, потому что она рекурсивно раскладывается с помощью <strong>верного перехода</strong> до <strong>верных базовых случаев</strong>.</p>
<h2 id="_7">Получение ряда в замкнутом виде</h2>
<p>Первое, что нам нужно сделать, это найти ряд в замкнутом виде, т. е. в виде дроби. </p>
<p>По определению:
$$
\Large{
G(z) = \sum_{n=0}^\infty a_n z^n
}
$$</p>
<p>Тогда можно вынести первые два члена, которые известны:</p>
<div class="arithmatex">\[\Large{
G(z) = a_0 + a_1 z + \sum_{n=2}^\infty a_n z^n
}\]</div>
<p>По формуле чисел Фибоначчи:</p>
<div class="arithmatex">\[
\Large{
G(z) = a_0 + a_1 z + \sum_{n=2}^\infty (a_{n-1} + a_{n-2}) z^n =
}
\]</div>
<div class="arithmatex">\[
\Large{
= a_0 + a_1 z + \sum_{n=2}^\infty a_{n-1} z^{n-1} z +
\sum_{n=2}^\infty a_{n-2} z^{n-2} z^2 =
}
\]</div>
<div class="arithmatex">\[
\Large{
= a_0 + a_1 z + z\underbrace{\sum_{n=2}^\infty a_{n-1} z^{n-1}}_{(I)} +
z^2 \underbrace{\sum_{n=2}^\infty a_{n-2} z^{n-2}}_{(II)}
}
\]</div>
<p>Рассмотрим <span class="arithmatex">\((I)\)</span> и <span class="arithmatex">\((II)\)</span>.</p>
<div class="arithmatex">\[\Large{
(I) = \sum_{n=2}^\infty a_{n-1} z^{n-1} = \left&lt;
\begin{split}
k = n-1\\
n = k+1
\end{split}
\right&gt; = \sum_{k=1}^\infty a_{k} z^{k} =
}\]</div>
<div class="arithmatex">\[\Large{
= \underbrace{a_0 + \sum_{k=1}^\infty a_{k} z^{k}}_
{\sum_{k=0}^\infty a_{k} z^{k}}
- a_0
= \sum_{k=0}^\infty a_{k} z^{k} - a_0 = G(z) - a_0
}\]</div>
<div class="arithmatex">\[\Large{
(II) = \sum_{n=2}^\infty a_{n-2} z^{n-2} =
\left&lt;
\begin{split}
k = n-2\\
n = k+2
\end{split}
\right&gt;
= \sum_{k=0}^\infty a_{k} z^{k} = G(z)
}\]</div>
<p>Здесь мы производим замену и приводим суммы к виду <span class="arithmatex">\(\sum\limits_{i=0}^\infty a_iz^i\)</span>. Очевидно, значение суммы не зависит от названия счетчика <span class="arithmatex">\(i\)</span>. </p>
<p>Таким образом:</p>
<div class="arithmatex">\[\Large{
G(z) = a_0 + a_1 z + z \left( G\left(z\right) - a_0 \right) + z^2G(z) =
}\]</div>
<div class="arithmatex">\[\Large{
= a_0 + a_1 z + z G(z) - a_0 z + z^2 G(z)
}\]</div>
<p>Перенесем все члены с <span class="arithmatex">\(G(z)\)</span> влево:</p>
<div class="arithmatex">\[\Large{
G(z) - zG(z) - z^2 G(z) = a_0 +a_1z-a_0z
}\]</div>
<div class="arithmatex">\[\Large{
G(z)\left(1 - z - z^2\right) = a_0 +a_1z-a_0z
}\]</div>
<p>В итоге, получаем:</p>
<div class="arithmatex">\[\Large{
G(z) = \frac{a_0 +a_1z-a_0z}{1 - z - z^2}
}\]</div>
<blockquote>
<p><em>Замечание</em>: получившееся дробь правильная. То есть степень многочлена в знаменателе больше, чем в числителе.</p>
</blockquote>
<h2 id="_8">Разложение дроби на элементарные дроби</h2>
<p>Мы получили ряд:</p>
<div class="arithmatex">\[\Large{
G(z) = \frac{a_0 + a_1 z - a_0 z}{1 - z - z^2}
}\]</div>
<p>Рассмотрим знаменатель:</p>
<div class="arithmatex">\[\Large{
-z^2 - z + 1 = 0
}\]</div>
<p>Разложим его на множители:</p>
<div class="arithmatex">\[\Large{
D = (-1)^2 - 4 \cdot 1 \cdot (-1) = 5
}\]</div>
<div class="arithmatex">\[\Large{
\begin{split}
z_{1} = - \frac{1 + \sqrt{5}}{2}\\
z_{2} = - \frac{1 - \sqrt{5}}{2}
\end{split}
}\]</div>
<p>Тогда:</p>
<div class="arithmatex">\[\Large{
-z^2 -z + 1 = -(z - z_1)(z - z_2)
}\]</div>
<p>Таким образом, мы можем записать:</p>
<div class="arithmatex">\[\Large{
G(z) = \frac{a_0 + a_1 z - a_0 z}{-(z-z_1)(z-z_2)} =
\frac{A}{z-z_1} + \frac{B}{z - z_2}
}\]</div>
<p>Домножим обе части на <span class="arithmatex">\(-(z-z_1)(z-z_2)\)</span>:</p>
<div class="arithmatex">\[\Large{
a_0 + a_1 z - a_0 z = -A(z-z_2) - B(z-z_1)
}\]</div>
<p>Раскроем скобки и сгруппируем относительно степеней <span class="arithmatex">\(z\)</span>:</p>
<div class="arithmatex">\[\Large{
a_0 + z(a_1 - a_0) = -Az + Az_2 - Bz + Bz_1 = (Az_2 + Bz_1) + z(-A -B)
}\]</div>
<p>Получаем систему линейных уравнений с двумя неизвестными:</p>
<div class="arithmatex">\[\Large{
\begin{cases}
&amp;Az_2 &amp;+ &amp;B z_1 &amp;= a_0\\
&amp;A &amp;+ &amp;B &amp;= a_0 - a_1
\end{cases}
}\]</div>
<p>Решение тривиально, опустим его. Приведу только ответ:</p>
<div class="arithmatex">\[\Large{
\begin{cases}
&amp;A = a_0 - a_1 - \frac{a_0 - a_0z_2 + a_1z_2}{z_1-z_2}\\
&amp;B = \frac{a_0 - a_0z_2 + a_1z_2}{z_1-z_2}
\end{cases}
}\]</div>
<p>Таким образом, получаем следующий результат:</p>
<div class="arithmatex">\[\Large{
\begin{cases}
z_{1} &amp;= - \frac{1 + \sqrt{5}}{2}\\
z_{2} &amp;= - \frac{1 - \sqrt{5}}{2}\\
A &amp;= a_0 - a_1 - \frac{a_0 - a_0z_2 + a_1z_2}{z_1-z_2}\\
B &amp;= \frac{a_0 - a_0z_2 + a_1z_2}{z_1-z_2}\\
G(z) &amp;= \frac{A}{z - z_1} + \frac{B}{z - z_2}
\end{cases}
}\]</div>
<h2 id="_9">Доказательство по индукции</h2>
<h3 id="_10">База индукции</h3>
<h4 id="n-0"><span class="arithmatex">\(n = 0\)</span></h4>
<p>Подставим <span class="arithmatex">\(n=0\)</span> в полученную формулу:</p>
<div class="arithmatex">\[\Large{
a_0 = \left(
-\frac{A}{z_1} - \frac{B}{z_2}
\right)
}\]</div>
<p>Рассмотрим <span class="arithmatex">\(A\)</span>:</p>
<div class="arithmatex">\[\Large{
A = \frac{a_0z_1-a_0z_2-a_1z_1+a_1z_2-a_0+a_0z_2-a_1z_2}{z_1-z_2} =
}\]</div>
<div class="arithmatex">\[\Large{
= \frac{a_0z_1-\cancelto{0}{a_0z_2+a_0z_2}-a_1z_1+
\cancelto{0}{a_1z_2-a_1z_2}-a_0}{z_1-z_2} =
}\]</div>
<div class="arithmatex">\[\Large{
= \frac{a_0z_1-a_1z_1-a_0}{z_1-z_2} = z_1\frac{a_0-a_1}{z_1-z_2}-\frac{a_0}{z_1-z_2}
}\]</div>
<p>Проведя аналогичные вычисления для <span class="arithmatex">\(B\)</span> получим:</p>
<div class="arithmatex">\[\Large{
B = \frac{a_0}{z_1-z_2} - z_2 \frac{a_0-a_1}{z_1-z_2}
}\]</div>
<p>Тогда:</p>
<div class="arithmatex">\[\Large{
a_0 = \frac{a_0}{z_1(z_1-z_2)} - \frac{z_1}{z_1}\frac{a_0-a_1}{z_1-z_2} +
}\]</div>
<div class="arithmatex">\[\Large{
+ \frac{z_2}{z_2}\frac{a_0-a_1}{z_1-z_2} - \frac{a_0}{z_1-z_2} =
}\]</div>
<div class="arithmatex">\[\Large{
=\frac{a_0}{z_1(z_1-z_2)} - \cancelto{0}{\frac{a_0-a_1}{z_1-z_2} +
\frac{a_0-a_1}{z_1-z_2}} - \frac{a_0}{z_2(z_1-z_2)} =
}\]</div>
<div class="arithmatex">\[\Large{
= \frac{a_0z_2-a_0z_1}{z_1z_2(z_1-z_2)} =
-\frac{a_0(z_1-z_2)}{z_1z_2(z_1-z_2)} = -\frac{a_0}{z_1z_2}
}\]</div>
<p>Рассмотрим <span class="arithmatex">\(z_1z_2\)</span>:</p>
<div class="arithmatex">\[\Large{
z_1z_2 = \frac{(1+\sqrt{5})(1-\sqrt{5})}{2\cdot2} = \frac{1-5}{4} = -1
}\]</div>
<p>Подставив результат в наше выражение:</p>
<div class="arithmatex">\[\Large{
-\frac{a_0}{-1} = a_0, \text{ Q.E.D.}
}\]</div>
<h4 id="n-1"><span class="arithmatex">\(n = 1\)</span></h4>
<p>По нашей формуле:</p>
<div class="arithmatex">\[\Large{
a_1 =
-\left(
\frac{A}{z_1^2} +
\frac{B}{z_2^2}
\right) =
}\]</div>
<div class="arithmatex">\[\Large{
= -\left(
\frac{a_0-a_1}{z_1(z_1-z_2)} - \frac{a_0}{z_1(z_1-z_2)} +
\frac{a_0}{z_2(z_1-z_2)} - \frac{a_0-a_1}{z_2(z_1-z_2)}
\right) =
}\]</div>
<div class="arithmatex">\[\Large{
= -\left(
\frac{a_0-a_1}{z_1-z_2} \left(
\frac{1}{z_1} -
\frac{1}{z_2}
\right) +
\frac{a_0}{z_1-z_2} \left(
\frac{1}{z_1^2} -
\frac{1}{z_2^2}
\right)
\right) =
}\]</div>
<div class="arithmatex">\[\Large{
= -\left(
\frac{(a_0-a_1)(z_2-z_1)}{z_1z_2(z_1-z_2)} +
\frac{a_0(z_1^2-z_2^2)}{z_1^2z_2^2(z_1-z_2)} +
\right) =
}\]</div>
<p>Как мы доказали: </p>
<div class="arithmatex">\[\Large{
z_1z_2 = -1
}\]</div>
<p>Также рассмотрим <span class="arithmatex">\(z_1 + z_2\)</span>:</p>
<div class="arithmatex">\[\Large{
z_1+z_2 = \frac{-1-
\cancelto{0}{\sqrt{5}+\sqrt{5}}
-1}{2} =
\frac{-1-1}{2} =
-1
}\]</div>
<p>Подставив значения в выражение, получим:</p>
<div class="arithmatex">\[\Large{
= -\left(
a_0 - a_1 +
\frac{a_0(z_1-z_2)(z_1+z_2)}{(z_1-z_2)} +
\right) =
}\]</div>
<div class="arithmatex">\[\Large{
= -\left(
\cancelto{0}{a_0 - a_0}
-a_1
\right) = -(-a_1) = a_1, \text{ Q.E.D.}
}\]</div>
<h3 id="_11">Переход индукции</h3>
<p>По определению чисел Фибоначчи:</p>
<div class="arithmatex">\[\Large{
a_{n+2} = a_{n+1}+a_n
}\]</div>
<p>где:</p>
<div class="arithmatex">\[\Large{
a_n = \left(
-\frac{A}{z_1^{n+1}}-\frac{B}{z_2^{n+1}}
\right)
}\]</div>
<p>Подставим это в формулу:</p>
<div class="arithmatex">\[\Large{
a_{n+2} = a_{n+1}+a_n =
-\frac{A}{z_1^{n+1}}-\frac{B}{z_2^{n+1}}
-\frac{A}{z_1^{n+2}}-\frac{B}{z_2^{n+2}} =
}\]</div>
<p>Сгруппируем по <span class="arithmatex">\(A\)</span> и <span class="arithmatex">\(B\)</span>:</p>
<div class="arithmatex">\[\Large{
= -A \underbrace{\left(
\frac{1}{z_1^{n+1}}+
\frac{1}{z_1^{n+2}}
\right)}_{(I)}
%
-B \underbrace{\left(
\frac{1}{z_2^{n+1}}+
\frac{1}{z_2^{n+2}}
\right)}_{(II)}
}\]</div>
<p>Рассмотрим <span class="arithmatex">\((I)\)</span> и <span class="arithmatex">\((II)\)</span>:</p>
<div class="arithmatex">\[\Large{
(I) =
\frac{z_1+1}{z_1^{n+2}}
}\]</div>
<div class="arithmatex">\[\Large{
z_1 + 1 =
-\frac{1+\sqrt{5}}{2} + 1 =
\frac{-1-\sqrt{5}+2}{2} =
}\]</div>
<div class="arithmatex">\[\Large{
=
\frac{1-\sqrt{5}}{2} =
\frac{(1-\sqrt{5})(1+\sqrt{5})}{2(1+\sqrt{5})} =
}\]</div>
<div class="arithmatex">\[\Large{
= \frac{1 - 5}{2(1+\sqrt{5})} =
\frac{-4}{2(1+\sqrt{5})} =
- \frac{2}{1+\sqrt{5}} = \frac{1}{z_1}
}\]</div>
<p>Таким образом:</p>
<div class="arithmatex">\[\Large{
(I) = \frac{1}{z_1^{n+3}}
}\]</div>
<p>Аналогично для <span class="arithmatex">\((II)\)</span>:</p>
<div class="arithmatex">\[\Large{
(II) =
\frac{z_2+1}{z_2^{n+2}}
}\]</div>
<div class="arithmatex">\[\Large{
z_2 + 1 =
-\frac{1-\sqrt{5}}{2} + 1 =
\frac{-1+\sqrt{5}+2}{2} =
}\]</div>
<div class="arithmatex">\[\Large{
= \frac{-1+\sqrt{5}+2}{2} =
\frac{1+\sqrt{5}}{2} =
}\]</div>
<div class="arithmatex">\[\Large{
= \frac{(1+\sqrt{5})(1-\sqrt{5})}{2(1-\sqrt{5})} =
\frac{1 - 5}{2(1-\sqrt{5})} =
}\]</div>
<div class="arithmatex">\[\Large{
= \frac{-4}{2(1-\sqrt{5})} =
-\frac{2}{1-\sqrt{5}} =
\frac{1}{z_2}
}\]</div>
<p>Подставив это в <span class="arithmatex">\((II)\)</span>:</p>
<div class="arithmatex">\[\Large{
(II) = \frac{1}{z_2^{n+3}}
}\]</div>
<p>Подставляя <span class="arithmatex">\((I)\)</span> и <span class="arithmatex">\((II)\)</span>:</p>
<div class="arithmatex">\[\Large{
-A \underbrace{\left(
\frac{1}{z_1^{n+1}}+
\frac{1}{z_1^{n+2}}
\right)}_{(I)}
-B \underbrace{\left(
\frac{1}{z_2^{n+1}}+
\frac{1}{z_2^{n+2}}
\right)}_{(II)} =
}\]</div>
<div class="arithmatex">\[\Large{
= -A \frac{1}{z_1^{n+3}}
-B \frac{1}{z_2^{n+3}} =
a_{n+2}, \text{ Q.E.D.}
}\]</div>
<h2 id="_12">Выводы</h2>
<p>В данной публикации были рассмотрены:</p>
<ul>
<li>получение производящей функции из рекуррентного уравнения;</li>
<li>разложение функции в ряд для нахождения <span class="arithmatex">\(n\)</span>-го члена последовательности;</li>
<li>доказана верность полученной формулы с помощью математической индукции.</li>
</ul>
<p>Очевидно, что полезность данной формулы в случае чисел Фибоначчи сомнительна. Но она может служить полезным примером того, как можно решить линейное рекуррентное уравнение. </p>
<aside class="md-source-file">
<span class="md-source-file__fact">
<span class="md-icon" title="Last update">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M21 13.1c-.1 0-.3.1-.4.2l-1 1 2.1 2.1 1-1c.2-.2.2-.6 0-.8l-1.3-1.3c-.1-.1-.2-.2-.4-.2m-1.9 1.8-6.1 6V23h2.1l6.1-6.1zM12.5 7v5.2l4 2.4-1 1L11 13V7zM11 21.9c-5.1-.5-9-4.8-9-9.9C2 6.5 6.5 2 12 2c5.3 0 9.6 4.1 10 9.3-.3-.1-.6-.2-1-.2s-.7.1-1 .2C19.6 7.2 16.2 4 12 4c-4.4 0-8 3.6-8 8 0 4.1 3.1 7.5 7.1 7.9l-.1.2z"/></svg>
</span>
2025-06-02
</span>
</aside>
</article>
</div>
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
</div>
</main>
<footer class="md-footer">
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-copyright">
Made with
<a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
Material for MkDocs
</a>
</div>
</div>
</div>
</footer>
</div>
<div class="md-dialog" data-md-component="dialog">
<div class="md-dialog__inner md-typeset"></div>
</div>
<div class="md-progress" data-md-component="progress" role="progressbar"></div>
<script id="__config" type="application/json">{"base": "../..", "features": ["navigation.instant", "navigation.instant.progress", "header.autohide"], "search": "../../assets/javascripts/workers/search.d50fe291.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
<script src="../../assets/javascripts/bundle.13a4f30d.min.js"></script>
<script src="../../javascripts/mathjax.js"></script>
<script src="https://unpkg.com/mathjax@3/es5/tex-mml-chtml.js"></script>
</body>
</html>

562
maths/index.html Normal file
View File

@@ -0,0 +1,562 @@
<!doctype html>
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<link rel="canonical" href="https://rustbas.github.io/blog/maths/">
<link rel="next" href="../linux/">
<link rel="icon" href="../assets/images/favicon.png">
<meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.14">
<title>Математика - Очередные записки очередного гика</title>
<link rel="stylesheet" href="../assets/stylesheets/main.342714a4.min.css">
<link rel="stylesheet" href="../assets/stylesheets/palette.06af60db.min.css">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CJetBrains+Mono:400,400i,700,700i&display=fallback">
<style>:root{--md-text-font:"Roboto";--md-code-font:"JetBrains Mono"}</style>
<script>__md_scope=new URL("..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
</head>
<body dir="ltr" data-md-color-scheme="default" data-md-color-primary="green" data-md-color-accent="indigo">
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a href="#_1" class="md-skip">
Skip to content
</a>
</div>
<div data-md-component="announce">
</div>
<header class="md-header md-header--shadow" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="Header">
<a href=".." title="Очередные записки очередного гика" class="md-header__button md-logo" aria-label="Очередные записки очередного гика" data-md-component="logo">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg>
</a>
<label class="md-header__button md-icon" for="__drawer">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
</label>
<div class="md-header__title" data-md-component="header-title">
<div class="md-header__ellipsis">
<div class="md-header__topic">
<span class="md-ellipsis">
Очередные записки очередного гика
</span>
</div>
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
Математика
</span>
</div>
</div>
</div>
<form class="md-header__option" data-md-component="palette">
<input class="md-option" data-md-color-media="" data-md-color-scheme="default" data-md-color-primary="green" data-md-color-accent="indigo" aria-label="Switch to dark mode" type="radio" name="__palette" id="__palette_0">
<label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_1" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M17 7H7a5 5 0 0 0-5 5 5 5 0 0 0 5 5h10a5 5 0 0 0 5-5 5 5 0 0 0-5-5m0 8a3 3 0 0 1-3-3 3 3 0 0 1 3-3 3 3 0 0 1 3 3 3 3 0 0 1-3 3"/></svg>
</label>
<input class="md-option" data-md-color-media="" data-md-color-scheme="slate" data-md-color-primary="teal" data-md-color-accent="indigo" aria-label="Switch to light mode" type="radio" name="__palette" id="__palette_1">
<label class="md-header__button md-icon" title="Switch to light mode" for="__palette_0" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M17 6H7c-3.31 0-6 2.69-6 6s2.69 6 6 6h10c3.31 0 6-2.69 6-6s-2.69-6-6-6m0 10H7c-2.21 0-4-1.79-4-4s1.79-4 4-4h10c2.21 0 4 1.79 4 4s-1.79 4-4 4M7 9c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3"/></svg>
</label>
</form>
<script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script>
<label class="md-header__button md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
</label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="__search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
<label class="md-search__icon md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
</label>
<nav class="md-search__options" aria-label="Search">
<button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
</button>
</nav>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
<div class="md-search-result" data-md-component="search-result">
<div class="md-search-result__meta">
Initializing search
</div>
<ol class="md-search-result__list" role="presentation"></ol>
</div>
</div>
</div>
</div>
</div>
<div class="md-header__source">
<a href="https://github.com/rustbas/blog" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M216.29 158.39H137C97 147.9 6.51 150.63 6.51 233.18c0 30.09 15 51.23 35 61-25.1 23-37 33.85-37 49.21 0 11 4.47 21.14 17.89 26.81C8.13 383.61 0 393.35 0 411.65c0 32.11 28.05 50.82 101.63 50.82 70.75 0 111.79-26.42 111.79-73.18 0-58.66-45.16-56.5-151.63-63l13.43-21.55c27.27 7.58 118.7 10 118.7-67.89 0-18.7-7.73-31.71-15-41.07l37.41-2.84zm-63.42 241.9c0 32.06-104.89 32.1-104.89 2.43 0-8.14 5.27-15 10.57-21.54 77.71 5.3 94.32 3.37 94.32 19.11m-50.81-134.58c-52.8 0-50.46-71.16 1.2-71.16 49.54 0 50.82 71.16-1.2 71.16m133.3 100.51v-32.1c26.75-3.66 27.24-2 27.24-11V203.61c0-8.5-2.05-7.38-27.24-16.26l4.47-32.92H324v168.71c0 6.51.4 7.32 6.51 8.14l20.73 2.84v32.1zm52.45-244.31c-23.17 0-36.59-13.43-36.59-36.61s13.42-35.77 36.59-35.77c23.58 0 37 12.62 37 35.77s-13.42 36.61-37 36.61M512 350.46c-17.49 8.53-43.1 16.26-66.28 16.26-48.38 0-66.67-19.5-66.67-65.46V194.75c0-5.42 1.05-4.06-31.71-4.06V154.5c35.78-4.07 50-22 54.47-66.27h38.63c0 65.83-1.34 61.81 3.26 61.81H501v40.65h-60.56v97.15c0 6.92-4.92 51.41 60.57 26.84z"/></svg>
</div>
<div class="md-source__repository">
GitHub
</div>
</a>
</div>
</nav>
</header>
<div class="md-container" data-md-component="container">
<main class="md-main" data-md-component="main">
<div class="md-main__inner md-grid">
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary" aria-label="Navigation" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href=".." title="Очередные записки очередного гика" class="md-nav__button md-logo" aria-label="Очередные записки очередного гика" data-md-component="logo">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg>
</a>
Очередные записки очередного гика
</label>
<div class="md-nav__source">
<a href="https://github.com/rustbas/blog" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M216.29 158.39H137C97 147.9 6.51 150.63 6.51 233.18c0 30.09 15 51.23 35 61-25.1 23-37 33.85-37 49.21 0 11 4.47 21.14 17.89 26.81C8.13 383.61 0 393.35 0 411.65c0 32.11 28.05 50.82 101.63 50.82 70.75 0 111.79-26.42 111.79-73.18 0-58.66-45.16-56.5-151.63-63l13.43-21.55c27.27 7.58 118.7 10 118.7-67.89 0-18.7-7.73-31.71-15-41.07l37.41-2.84zm-63.42 241.9c0 32.06-104.89 32.1-104.89 2.43 0-8.14 5.27-15 10.57-21.54 77.71 5.3 94.32 3.37 94.32 19.11m-50.81-134.58c-52.8 0-50.46-71.16 1.2-71.16 49.54 0 50.82 71.16-1.2 71.16m133.3 100.51v-32.1c26.75-3.66 27.24-2 27.24-11V203.61c0-8.5-2.05-7.38-27.24-16.26l4.47-32.92H324v168.71c0 6.51.4 7.32 6.51 8.14l20.73 2.84v32.1zm52.45-244.31c-23.17 0-36.59-13.43-36.59-36.61s13.42-35.77 36.59-35.77c23.58 0 37 12.62 37 35.77s-13.42 36.61-37 36.61M512 350.46c-17.49 8.53-43.1 16.26-66.28 16.26-48.38 0-66.67-19.5-66.67-65.46V194.75c0-5.42 1.05-4.06-31.71-4.06V154.5c35.78-4.07 50-22 54.47-66.27h38.63c0 65.83-1.34 61.81 3.26 61.81H501v40.65h-60.56v97.15c0 6.92-4.92 51.41 60.57 26.84z"/></svg>
</div>
<div class="md-source__repository">
GitHub
</div>
</a>
</div>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--active">
<input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
<span class="md-ellipsis">
Математика
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
<span class="md-ellipsis">
Математика
</span>
</a>
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#2024-10-30" class="md-nav__link">
<span class="md-ellipsis">
2024-10-30 Немного про производящие функции
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#2024-09-24" class="md-nav__link">
<span class="md-ellipsis">
2024-09-24 Немного про Байесовскую статистику
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#2020-09-01" class="md-nav__link">
<span class="md-ellipsis">
2020-09-01 Немного про проверку гипотез
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#2025-05-30-numpy" class="md-nav__link">
<span class="md-ellipsis">
2025-05-30 Немного про работу с файлами, numpy и предсказаниях
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../linux/" class="md-nav__link">
<span class="md-ellipsis">
Linux
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../common/" class="md-nav__link">
<span class="md-ellipsis">
Общее
</span>
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#2024-10-30" class="md-nav__link">
<span class="md-ellipsis">
2024-10-30 Немного про производящие функции
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#2024-09-24" class="md-nav__link">
<span class="md-ellipsis">
2024-09-24 Немного про Байесовскую статистику
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#2020-09-01" class="md-nav__link">
<span class="md-ellipsis">
2020-09-01 Немного про проверку гипотез
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#2025-05-30-numpy" class="md-nav__link">
<span class="md-ellipsis">
2025-05-30 Немного про работу с файлами, numpy и предсказаниях
</span>
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content" data-md-component="content">
<article class="md-content__inner md-typeset">
<h1 id="_1">Математика</h1>
<h2 id="2024-10-30">2024-10-30 <a href="gen_fun/">Немного про производящие функции</a></h2>
<h2 id="2024-09-24">2024-09-24 <a href="baes/">Немного про Байесовскую статистику</a></h2>
<h2 id="2020-09-01">2020-09-01 <a href="stat-madness/">Немного про проверку гипотез</a></h2>
<h2 id="2025-05-30-numpy">2025-05-30 <a href="type-pred/">Немного про работу с файлами, numpy и предсказаниях</a></h2>
<aside class="md-source-file">
<span class="md-source-file__fact">
<span class="md-icon" title="Last update">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M21 13.1c-.1 0-.3.1-.4.2l-1 1 2.1 2.1 1-1c.2-.2.2-.6 0-.8l-1.3-1.3c-.1-.1-.2-.2-.4-.2m-1.9 1.8-6.1 6V23h2.1l6.1-6.1zM12.5 7v5.2l4 2.4-1 1L11 13V7zM11 21.9c-5.1-.5-9-4.8-9-9.9C2 6.5 6.5 2 12 2c5.3 0 9.6 4.1 10 9.3-.3-.1-.6-.2-1-.2s-.7.1-1 .2C19.6 7.2 16.2 4 12 4c-4.4 0-8 3.6-8 8 0 4.1 3.1 7.5 7.1 7.9l-.1.2z"/></svg>
</span>
2025-06-02
</span>
</aside>
</article>
</div>
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
</div>
</main>
<footer class="md-footer">
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-copyright">
Made with
<a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
Material for MkDocs
</a>
</div>
</div>
</div>
</footer>
</div>
<div class="md-dialog" data-md-component="dialog">
<div class="md-dialog__inner md-typeset"></div>
</div>
<div class="md-progress" data-md-component="progress" role="progressbar"></div>
<script id="__config" type="application/json">{"base": "..", "features": ["navigation.instant", "navigation.instant.progress", "header.autohide"], "search": "../assets/javascripts/workers/search.d50fe291.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
<script src="../assets/javascripts/bundle.13a4f30d.min.js"></script>
<script src="../javascripts/mathjax.js"></script>
<script src="https://unpkg.com/mathjax@3/es5/tex-mml-chtml.js"></script>
</body>
</html>

View File

@@ -0,0 +1,651 @@
<!doctype html>
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<link rel="canonical" href="https://rustbas.github.io/blog/maths/stat-madness/">
<link rel="icon" href="../../assets/images/favicon.png">
<meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.14">
<title>Немного про проверку гипотез - Очередные записки очередного гика</title>
<link rel="stylesheet" href="../../assets/stylesheets/main.342714a4.min.css">
<link rel="stylesheet" href="../../assets/stylesheets/palette.06af60db.min.css">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CJetBrains+Mono:400,400i,700,700i&display=fallback">
<style>:root{--md-text-font:"Roboto";--md-code-font:"JetBrains Mono"}</style>
<script>__md_scope=new URL("../..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
</head>
<body dir="ltr" data-md-color-scheme="default" data-md-color-primary="green" data-md-color-accent="indigo">
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a href="#_1" class="md-skip">
Skip to content
</a>
</div>
<div data-md-component="announce">
</div>
<header class="md-header md-header--shadow" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="Header">
<a href="../.." title="Очередные записки очередного гика" class="md-header__button md-logo" aria-label="Очередные записки очередного гика" data-md-component="logo">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg>
</a>
<label class="md-header__button md-icon" for="__drawer">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
</label>
<div class="md-header__title" data-md-component="header-title">
<div class="md-header__ellipsis">
<div class="md-header__topic">
<span class="md-ellipsis">
Очередные записки очередного гика
</span>
</div>
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
Немного про проверку гипотез
</span>
</div>
</div>
</div>
<form class="md-header__option" data-md-component="palette">
<input class="md-option" data-md-color-media="" data-md-color-scheme="default" data-md-color-primary="green" data-md-color-accent="indigo" aria-label="Switch to dark mode" type="radio" name="__palette" id="__palette_0">
<label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_1" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M17 7H7a5 5 0 0 0-5 5 5 5 0 0 0 5 5h10a5 5 0 0 0 5-5 5 5 0 0 0-5-5m0 8a3 3 0 0 1-3-3 3 3 0 0 1 3-3 3 3 0 0 1 3 3 3 3 0 0 1-3 3"/></svg>
</label>
<input class="md-option" data-md-color-media="" data-md-color-scheme="slate" data-md-color-primary="teal" data-md-color-accent="indigo" aria-label="Switch to light mode" type="radio" name="__palette" id="__palette_1">
<label class="md-header__button md-icon" title="Switch to light mode" for="__palette_0" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M17 6H7c-3.31 0-6 2.69-6 6s2.69 6 6 6h10c3.31 0 6-2.69 6-6s-2.69-6-6-6m0 10H7c-2.21 0-4-1.79-4-4s1.79-4 4-4h10c2.21 0 4 1.79 4 4s-1.79 4-4 4M7 9c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3"/></svg>
</label>
</form>
<script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script>
<label class="md-header__button md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
</label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="__search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
<label class="md-search__icon md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
</label>
<nav class="md-search__options" aria-label="Search">
<button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
</button>
</nav>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
<div class="md-search-result" data-md-component="search-result">
<div class="md-search-result__meta">
Initializing search
</div>
<ol class="md-search-result__list" role="presentation"></ol>
</div>
</div>
</div>
</div>
</div>
<div class="md-header__source">
<a href="https://github.com/rustbas/blog" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M216.29 158.39H137C97 147.9 6.51 150.63 6.51 233.18c0 30.09 15 51.23 35 61-25.1 23-37 33.85-37 49.21 0 11 4.47 21.14 17.89 26.81C8.13 383.61 0 393.35 0 411.65c0 32.11 28.05 50.82 101.63 50.82 70.75 0 111.79-26.42 111.79-73.18 0-58.66-45.16-56.5-151.63-63l13.43-21.55c27.27 7.58 118.7 10 118.7-67.89 0-18.7-7.73-31.71-15-41.07l37.41-2.84zm-63.42 241.9c0 32.06-104.89 32.1-104.89 2.43 0-8.14 5.27-15 10.57-21.54 77.71 5.3 94.32 3.37 94.32 19.11m-50.81-134.58c-52.8 0-50.46-71.16 1.2-71.16 49.54 0 50.82 71.16-1.2 71.16m133.3 100.51v-32.1c26.75-3.66 27.24-2 27.24-11V203.61c0-8.5-2.05-7.38-27.24-16.26l4.47-32.92H324v168.71c0 6.51.4 7.32 6.51 8.14l20.73 2.84v32.1zm52.45-244.31c-23.17 0-36.59-13.43-36.59-36.61s13.42-35.77 36.59-35.77c23.58 0 37 12.62 37 35.77s-13.42 36.61-37 36.61M512 350.46c-17.49 8.53-43.1 16.26-66.28 16.26-48.38 0-66.67-19.5-66.67-65.46V194.75c0-5.42 1.05-4.06-31.71-4.06V154.5c35.78-4.07 50-22 54.47-66.27h38.63c0 65.83-1.34 61.81 3.26 61.81H501v40.65h-60.56v97.15c0 6.92-4.92 51.41 60.57 26.84z"/></svg>
</div>
<div class="md-source__repository">
GitHub
</div>
</a>
</div>
</nav>
</header>
<div class="md-container" data-md-component="container">
<main class="md-main" data-md-component="main">
<div class="md-main__inner md-grid">
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary" aria-label="Navigation" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href="../.." title="Очередные записки очередного гика" class="md-nav__button md-logo" aria-label="Очередные записки очередного гика" data-md-component="logo">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg>
</a>
Очередные записки очередного гика
</label>
<div class="md-nav__source">
<a href="https://github.com/rustbas/blog" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M216.29 158.39H137C97 147.9 6.51 150.63 6.51 233.18c0 30.09 15 51.23 35 61-25.1 23-37 33.85-37 49.21 0 11 4.47 21.14 17.89 26.81C8.13 383.61 0 393.35 0 411.65c0 32.11 28.05 50.82 101.63 50.82 70.75 0 111.79-26.42 111.79-73.18 0-58.66-45.16-56.5-151.63-63l13.43-21.55c27.27 7.58 118.7 10 118.7-67.89 0-18.7-7.73-31.71-15-41.07l37.41-2.84zm-63.42 241.9c0 32.06-104.89 32.1-104.89 2.43 0-8.14 5.27-15 10.57-21.54 77.71 5.3 94.32 3.37 94.32 19.11m-50.81-134.58c-52.8 0-50.46-71.16 1.2-71.16 49.54 0 50.82 71.16-1.2 71.16m133.3 100.51v-32.1c26.75-3.66 27.24-2 27.24-11V203.61c0-8.5-2.05-7.38-27.24-16.26l4.47-32.92H324v168.71c0 6.51.4 7.32 6.51 8.14l20.73 2.84v32.1zm52.45-244.31c-23.17 0-36.59-13.43-36.59-36.61s13.42-35.77 36.59-35.77c23.58 0 37 12.62 37 35.77s-13.42 36.61-37 36.61M512 350.46c-17.49 8.53-43.1 16.26-66.28 16.26-48.38 0-66.67-19.5-66.67-65.46V194.75c0-5.42 1.05-4.06-31.71-4.06V154.5c35.78-4.07 50-22 54.47-66.27h38.63c0 65.83-1.34 61.81 3.26 61.81H501v40.65h-60.56v97.15c0 6.92-4.92 51.41 60.57 26.84z"/></svg>
</div>
<div class="md-source__repository">
GitHub
</div>
</a>
</div>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../" class="md-nav__link">
<span class="md-ellipsis">
Математика
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../linux/" class="md-nav__link">
<span class="md-ellipsis">
Linux
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../common/" class="md-nav__link">
<span class="md-ellipsis">
Общее
</span>
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#_2" class="md-nav__link">
<span class="md-ellipsis">
Введение
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_3" class="md-nav__link">
<span class="md-ellipsis">
Небольшой ликбез
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#1" class="md-nav__link">
<span class="md-ellipsis">
Стадия 1. Строгие доказательства
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_4" class="md-nav__link">
<span class="md-ellipsis">
Небольшой пример (критерий Стьюдента)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#2" class="md-nav__link">
<span class="md-ellipsis">
Стадия 2. Открытие моделирования
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#3" class="md-nav__link">
<span class="md-ellipsis">
Стадия 3. Бутстрэп
</span>
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content" data-md-component="content">
<article class="md-content__inner md-typeset">
<h1 id="_1">Немного про проверку гипотез</h1>
<h2 id="_2">Введение</h2>
<p>Любые статистические испытания зиждятся на проверке гипотез, например:</p>
<ol>
<li>Проверка действия лекарств.</li>
<li>Установление зависимости между явлениями.</li>
<li>A/B тестирование и пр.</li>
</ol>
<p>В зависимости от вида данных, целей исследования и других факторов
можно по-разному формулировать гипотезы и по-разному их проверять.</p>
<p>Многое зависит от не только знаний и опыта исследователя, но и в целом
от его подхода. В процессе работы можно все меньше уделять внимание
математической составляющей и все больше полагаться на компьютер и его
вычислительные мощности.</p>
<p>Здесь я хочу рассказать о стадиях, через которые проходит исследователь,
в попытках упростить себе жизнь и ускорить процесс проверки гипотез.</p>
<h2 id="_3">Небольшой ликбез</h2>
<p>В статистике, если упростить, проверку гипотезы можно описать так: </p>
<ol>
<li>По данной выборке считается статистика (т.е. функция от выборки).</li>
<li>Из распределения статистики находятся две области, где гипотеза отвергается и где нет. Исходя из этого, принимается решение.</li>
</ol>
<p><strong>N.B.</strong> Проверяется гипотеза, модель постулируется.</p>
<h2 id="1">Стадия 1. Строгие доказательства</h2>
<p>На данной стадии ученый строго выводит распределения статистик, чтобы построить как можно более хорошие критерии. </p>
<div class="arithmatex">\[\Large
\sqrt{n}
\frac
{\overline{\mathbb{X}} - \mu}
{S} =
\sqrt{n}
\frac
{\overline{\mathbb{X}} - \mu}
{\sigma} \cdot
\frac{1}
{\frac{S}{\sigma}} =
\]</div>
<div class="arithmatex">\[\Large
= \sqrt{n}
\frac
{\overline{\mathbb{X}} - \mu}
{\sigma} \cdot
\frac{1}
{\sqrt{\frac{(n-1)S^2}{\sigma^2}\cdot
\frac{1}{n-1}
}}
\]</div>
<p>Получим:</p>
<div class="arithmatex">\[\Large
\begin{matrix}
&amp;\sqrt{n}
\frac{\overline{\mathbb{X}} - \mu}
{\sigma} &amp;\sim &amp;N(0,1) \\
&amp;\frac{(n-1)S^2}{\sigma^2} &amp;\sim &amp;\chi^2(n-1)
\end{matrix}
\]</div>
<p>Таким образом, по <a href="https://ru.wikipedia.org/wiki/Распределение_Стьюдента#Определение">определению</a>:</p>
<div class="arithmatex">\[\Large
\sqrt{n}
\frac
{\overline{\mathbb{X}} - \mu}
{S} \sim t(n-1).
\]</div>
<h2 id="_4">Небольшой пример (критерий Стьюдента)</h2>
<p><strong>Дано</strong>: выборка Х объема 10</p>
<div class="arithmatex">\[\Large
\mathbb{X} = \left(
\begin{matrix}
3.175 \\
4.042 \\
2.127 \\
3.841 \\
1.699 \\
2.223 \\
3.211 \\
3.33 \\
2.447 \\
2.904
\end{matrix}
\right)
\]</div>
<p><strong>Модель</strong>: <span class="arithmatex">\(N(\mu, \theta_2)\)</span></p>
<p><strong>Нулевая гипотеза</strong>: <span class="arithmatex">\(\mu = 3\)</span></p>
<p><strong>Решение</strong>:</p>
<p>Статистика критерия:</p>
<div class="arithmatex">\[\Large
T(\mathbb{X}) =
\sqrt{n}
\frac
{\overline{\mathbb{X}} - \mu}
{S}
\sim
t(n-1)
\]</div>
<p>Статистика равна:</p>
<div class="arithmatex">\[\Large
T(\mathbb{X}) = -1.9066
\]</div>
<p>Пусть уровень значимости <span class="arithmatex">\(\alpha = 0.05\)</span>.</p>
<p>Область, где не отвергается нулевая гипотеза: <span class="arithmatex">\((g_1, g_2) = (-2.262, 2.262)\)</span>, т.е. это область, которую принимает значение статистики при условии верности нулевой гипотезы с вероятностью <span class="arithmatex">\(1 - \alpha = 0.95\)</span>. <span class="arithmatex">\(g_1\)</span> в данном случае это <span class="arithmatex">\(0.025\)</span>-квантиль, а <span class="arithmatex">\(g_2\)</span>, соотвественно, 0.975-квантиль. </p>
<p><img alt="Доверительный интервал" src="../assets/stat-madness/conf_interval.png" /></p>
<p>Красным обозначен интервал <span class="arithmatex">\((g_1, g_2)\)</span></p>
<p>Таким образом, нулевая гипотеза не отвергается, так как значение статистики лежит в данном интервале.</p>
<blockquote>
<p><strong>Примечание</strong>: можно было выбрать доверительный интервал иначе,
но его стараются выбрать так, чтобы минимизировать его длину.</p>
</blockquote>
<h2 id="2">Стадия 2. Открытие моделирования</h2>
<p>Иногда (вернее, даже как правило) распределение статистики вывести
невозможно. В таком случае пользуются моделированием. Идея в том, что
нам известно распределение выборки в случае нулевой гипотезы. Таким
образом, можно многократно генерировать выборки и считать статистику,
таким образом получив ее распределение.</p>
<p><img alt="Открытие моделирования" src="../assets/stat-madness/modeling.png" /></p>
<p>В данном случае, моделирование выборки проводилось
в условиях <span class="arithmatex">\(X \sim N(\mu, S^2)\)</span>.</p>
<p>Можно увидеть некоторое расхождение. В этом, кстати, заключается интересный
момент. Часто критикуются исследования построенные на моделировании, так как
есть ненулевая (хоть и очень маленькая) вероятность, что выборки
сгенерировались так, что полученное распределение статистики плохо отражает
реальность.</p>
<h2 id="3">Стадия 3. Бутстрэп</h2>
<p>Бывают случаи, когда распределение выборки неизвестно совсем
(или его сложно/нельзя в обычном смысле генерировать,
<a href="https://stepik.org/lesson/40491/step/1?unit=24794">пример</a>). В таком случае
постулируют, что данная выборка хорошо отражает генеральную совокупность и в
качестве функции распределения берут эмпирическую функцию распределения.</p>
<div class="arithmatex">\[\Large
F_n(x) = \frac
{\sum_{i=1}^{n} \mathbb{1}(x)}
{n}
\]</div>
<p>где:</p>
<div class="arithmatex">\[\Large
\mathbb{1}(x) =
\begin{cases}
1, x &gt; X_i, \\
0, \text{ иначе.}
\end{cases}
\]</div>
<p>В итоге, получается, что для проверки гипотез не нужно ничего кроме выборки и выдуманной статистики (которая, вообще, может быть любой, от нее зависит только качество получаемого критерия).</p>
<p>Основная идея заключается в том, чтобы генерировать выборки объемом как и данная выборка из следующего распределения:</p>
<div class="arithmatex">\[\Large
\mathcal{F} =
\begin{pmatrix}
X_1 &amp;X_2 &amp;\cdots &amp;X_n \\
\frac{1}{n} &amp;\frac{1}{n} &amp;\cdots &amp;\frac{1}{n}
\end{pmatrix}.
\]</div>
<p><img alt="Результат на выборке объема 10" src="../assets/stat-madness/bootstrap.png" /></p>
<p>Таким образом, из расхождения графиков можно сделать следующие выводы:</p>
<ul>
<li>применение бутстрэпа требует большой объема первоначальной выборки,</li>
<li>наблюдения в выборке должны быть независимыми.</li>
</ul>
<p>Несмотря на это, он часто применяется невпопад, так как не требует особых затрат на реализацию.</p>
<aside class="md-source-file">
<span class="md-source-file__fact">
<span class="md-icon" title="Last update">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M21 13.1c-.1 0-.3.1-.4.2l-1 1 2.1 2.1 1-1c.2-.2.2-.6 0-.8l-1.3-1.3c-.1-.1-.2-.2-.4-.2m-1.9 1.8-6.1 6V23h2.1l6.1-6.1zM12.5 7v5.2l4 2.4-1 1L11 13V7zM11 21.9c-5.1-.5-9-4.8-9-9.9C2 6.5 6.5 2 12 2c5.3 0 9.6 4.1 10 9.3-.3-.1-.6-.2-1-.2s-.7.1-1 .2C19.6 7.2 16.2 4 12 4c-4.4 0-8 3.6-8 8 0 4.1 3.1 7.5 7.1 7.9l-.1.2z"/></svg>
</span>
2025-06-02
</span>
</aside>
</article>
</div>
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
</div>
</main>
<footer class="md-footer">
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-copyright">
Made with
<a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
Material for MkDocs
</a>
</div>
</div>
</div>
</footer>
</div>
<div class="md-dialog" data-md-component="dialog">
<div class="md-dialog__inner md-typeset"></div>
</div>
<div class="md-progress" data-md-component="progress" role="progressbar"></div>
<script id="__config" type="application/json">{"base": "../..", "features": ["navigation.instant", "navigation.instant.progress", "header.autohide"], "search": "../../assets/javascripts/workers/search.d50fe291.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
<script src="../../assets/javascripts/bundle.13a4f30d.min.js"></script>
<script src="../../javascripts/mathjax.js"></script>
<script src="https://unpkg.com/mathjax@3/es5/tex-mml-chtml.js"></script>
</body>
</html>

641
maths/type-pred/index.html Normal file
View File

@@ -0,0 +1,641 @@
<!doctype html>
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<link rel="canonical" href="https://rustbas.github.io/blog/maths/type-pred/">
<link rel="icon" href="../../assets/images/favicon.png">
<meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.14">
<title>Немного про работу с файлами, numpy и предсказаниях - Очередные записки очередного гика</title>
<link rel="stylesheet" href="../../assets/stylesheets/main.342714a4.min.css">
<link rel="stylesheet" href="../../assets/stylesheets/palette.06af60db.min.css">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CJetBrains+Mono:400,400i,700,700i&display=fallback">
<style>:root{--md-text-font:"Roboto";--md-code-font:"JetBrains Mono"}</style>
<script>__md_scope=new URL("../..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
</head>
<body dir="ltr" data-md-color-scheme="default" data-md-color-primary="green" data-md-color-accent="indigo">
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a href="#numpy" class="md-skip">
Skip to content
</a>
</div>
<div data-md-component="announce">
</div>
<header class="md-header md-header--shadow" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="Header">
<a href="../.." title="Очередные записки очередного гика" class="md-header__button md-logo" aria-label="Очередные записки очередного гика" data-md-component="logo">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg>
</a>
<label class="md-header__button md-icon" for="__drawer">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
</label>
<div class="md-header__title" data-md-component="header-title">
<div class="md-header__ellipsis">
<div class="md-header__topic">
<span class="md-ellipsis">
Очередные записки очередного гика
</span>
</div>
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
Немного про работу с файлами, numpy и предсказаниях
</span>
</div>
</div>
</div>
<form class="md-header__option" data-md-component="palette">
<input class="md-option" data-md-color-media="" data-md-color-scheme="default" data-md-color-primary="green" data-md-color-accent="indigo" aria-label="Switch to dark mode" type="radio" name="__palette" id="__palette_0">
<label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_1" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M17 7H7a5 5 0 0 0-5 5 5 5 0 0 0 5 5h10a5 5 0 0 0 5-5 5 5 0 0 0-5-5m0 8a3 3 0 0 1-3-3 3 3 0 0 1 3-3 3 3 0 0 1 3 3 3 3 0 0 1-3 3"/></svg>
</label>
<input class="md-option" data-md-color-media="" data-md-color-scheme="slate" data-md-color-primary="teal" data-md-color-accent="indigo" aria-label="Switch to light mode" type="radio" name="__palette" id="__palette_1">
<label class="md-header__button md-icon" title="Switch to light mode" for="__palette_0" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M17 6H7c-3.31 0-6 2.69-6 6s2.69 6 6 6h10c3.31 0 6-2.69 6-6s-2.69-6-6-6m0 10H7c-2.21 0-4-1.79-4-4s1.79-4 4-4h10c2.21 0 4 1.79 4 4s-1.79 4-4 4M7 9c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3"/></svg>
</label>
</form>
<script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script>
<label class="md-header__button md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
</label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="__search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
<label class="md-search__icon md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
</label>
<nav class="md-search__options" aria-label="Search">
<button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
</button>
</nav>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
<div class="md-search-result" data-md-component="search-result">
<div class="md-search-result__meta">
Initializing search
</div>
<ol class="md-search-result__list" role="presentation"></ol>
</div>
</div>
</div>
</div>
</div>
<div class="md-header__source">
<a href="https://github.com/rustbas/blog" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M216.29 158.39H137C97 147.9 6.51 150.63 6.51 233.18c0 30.09 15 51.23 35 61-25.1 23-37 33.85-37 49.21 0 11 4.47 21.14 17.89 26.81C8.13 383.61 0 393.35 0 411.65c0 32.11 28.05 50.82 101.63 50.82 70.75 0 111.79-26.42 111.79-73.18 0-58.66-45.16-56.5-151.63-63l13.43-21.55c27.27 7.58 118.7 10 118.7-67.89 0-18.7-7.73-31.71-15-41.07l37.41-2.84zm-63.42 241.9c0 32.06-104.89 32.1-104.89 2.43 0-8.14 5.27-15 10.57-21.54 77.71 5.3 94.32 3.37 94.32 19.11m-50.81-134.58c-52.8 0-50.46-71.16 1.2-71.16 49.54 0 50.82 71.16-1.2 71.16m133.3 100.51v-32.1c26.75-3.66 27.24-2 27.24-11V203.61c0-8.5-2.05-7.38-27.24-16.26l4.47-32.92H324v168.71c0 6.51.4 7.32 6.51 8.14l20.73 2.84v32.1zm52.45-244.31c-23.17 0-36.59-13.43-36.59-36.61s13.42-35.77 36.59-35.77c23.58 0 37 12.62 37 35.77s-13.42 36.61-37 36.61M512 350.46c-17.49 8.53-43.1 16.26-66.28 16.26-48.38 0-66.67-19.5-66.67-65.46V194.75c0-5.42 1.05-4.06-31.71-4.06V154.5c35.78-4.07 50-22 54.47-66.27h38.63c0 65.83-1.34 61.81 3.26 61.81H501v40.65h-60.56v97.15c0 6.92-4.92 51.41 60.57 26.84z"/></svg>
</div>
<div class="md-source__repository">
GitHub
</div>
</a>
</div>
</nav>
</header>
<div class="md-container" data-md-component="container">
<main class="md-main" data-md-component="main">
<div class="md-main__inner md-grid">
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary" aria-label="Navigation" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href="../.." title="Очередные записки очередного гика" class="md-nav__button md-logo" aria-label="Очередные записки очередного гика" data-md-component="logo">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg>
</a>
Очередные записки очередного гика
</label>
<div class="md-nav__source">
<a href="https://github.com/rustbas/blog" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M216.29 158.39H137C97 147.9 6.51 150.63 6.51 233.18c0 30.09 15 51.23 35 61-25.1 23-37 33.85-37 49.21 0 11 4.47 21.14 17.89 26.81C8.13 383.61 0 393.35 0 411.65c0 32.11 28.05 50.82 101.63 50.82 70.75 0 111.79-26.42 111.79-73.18 0-58.66-45.16-56.5-151.63-63l13.43-21.55c27.27 7.58 118.7 10 118.7-67.89 0-18.7-7.73-31.71-15-41.07l37.41-2.84zm-63.42 241.9c0 32.06-104.89 32.1-104.89 2.43 0-8.14 5.27-15 10.57-21.54 77.71 5.3 94.32 3.37 94.32 19.11m-50.81-134.58c-52.8 0-50.46-71.16 1.2-71.16 49.54 0 50.82 71.16-1.2 71.16m133.3 100.51v-32.1c26.75-3.66 27.24-2 27.24-11V203.61c0-8.5-2.05-7.38-27.24-16.26l4.47-32.92H324v168.71c0 6.51.4 7.32 6.51 8.14l20.73 2.84v32.1zm52.45-244.31c-23.17 0-36.59-13.43-36.59-36.61s13.42-35.77 36.59-35.77c23.58 0 37 12.62 37 35.77s-13.42 36.61-37 36.61M512 350.46c-17.49 8.53-43.1 16.26-66.28 16.26-48.38 0-66.67-19.5-66.67-65.46V194.75c0-5.42 1.05-4.06-31.71-4.06V154.5c35.78-4.07 50-22 54.47-66.27h38.63c0 65.83-1.34 61.81 3.26 61.81H501v40.65h-60.56v97.15c0 6.92-4.92 51.41 60.57 26.84z"/></svg>
</div>
<div class="md-source__repository">
GitHub
</div>
</a>
</div>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../" class="md-nav__link">
<span class="md-ellipsis">
Математика
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../linux/" class="md-nav__link">
<span class="md-ellipsis">
Linux
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../common/" class="md-nav__link">
<span class="md-ellipsis">
Общее
</span>
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#_1" class="md-nav__link">
<span class="md-ellipsis">
Введение
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_2" class="md-nav__link">
<span class="md-ellipsis">
Как считать сигнатуру файла
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_3" class="md-nav__link">
<span class="md-ellipsis">
Причины использования Си
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_4" class="md-nav__link">
<span class="md-ellipsis">
Чтение файлов в память
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_5" class="md-nav__link">
<span class="md-ellipsis">
Пайплайн обучения нейросети
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_6" class="md-nav__link">
<span class="md-ellipsis">
Результаты и картинки
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_7" class="md-nav__link">
<span class="md-ellipsis">
Выводы
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_8" class="md-nav__link">
<span class="md-ellipsis">
Источники
</span>
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content" data-md-component="content">
<article class="md-content__inner md-typeset">
<h1 id="numpy">Немного про работу с файлами, numpy и предсказаниях</h1>
<h2 id="_1">Введение</h2>
<p>Известно, что файлы в памяти представлены последовательностью байтов.
Структурно, эта последовательность может быть разной. Она может
содержать только ASCII-текст, текст с любой кодировкой, сжатый архив,
mp3, etc. При взаимодействии с файлом (например, открыть файл
текстовым редактором), операционная система не смотрит на
т.н. <strong>расширение файла</strong>, её интересует <em>побайтовое</em> содержание
файла.</p>
<p>В Unix для определения типа файла есть утилита <code>file</code>. Как она
определяет тип я точно не знаю, но могу сказать, что частично метод
основан на <em>"заголовке"</em> файла (первых байтах).</p>
<p>Пример работы <code>file</code> на исполняемом файле:</p>
<div class="highlight"><pre><span></span><code>./program: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, ...
</code></pre></div>
<p>Шестнадцатеричное представление (первые несколько строк) с помощью
<code>xxd</code>:</p>
<div class="highlight"><pre><span></span><code><span class="go">00000000: 7f45 4c46 0201 0100 0000 0000 0000 0000 .ELF............</span>
<span class="go">00000010: 0300 3e00 0100 0000 6010 0000 0000 0000 ..&gt;.....`.......</span>
<span class="go">00000020: 4000 0000 0000 0000 c036 0000 0000 0000 @........6......</span>
<span class="go">00000030: 0000 0000 4000 3800 0d00 4000 1f00 1e00 ....@.8...@.....</span>
</code></pre></div>
<p>В начале видно последовательность <code>ELF</code> -- формат исполняемых файлов в
Unix[1].</p>
<p>Возникает вопрос: <strong>есть какой-то паттерн для различных типов файлов,
который можно увидеть, не считая специальных симвовол в <em>заголовке</em>?</strong></p>
<p>Можно усложнить вопрос: можно ли по какому-то обобщению (<em>сигнатуре</em>)
файла предсказать его тип? Попробуем это выяснить.</p>
<p>Для этого нужно решить следующие задачи:</p>
<ol>
<li>Написать модуль (<strong>на Си</strong>), который по имени файла просчитывает
сигнатуру и возвращает её;</li>
<li>Посмотреть, как выглядят эти сигнатуры;</li>
<li>Попробовать обучить простую нейросеть.</li>
</ol>
<h2 id="_2">Как считать сигнатуру файла</h2>
<p>Возьмем нулевую матрицу <code>M</code> размера 256х256, так как один байт это
число от 0 до 255. Считаем файл в память в виде последовательности
байтов. Теперь будем двигаться по последовательности с окном
размера 2. В этом окне первый элемент будет отвечать за номер строки,
а второй за номер столбца. И каждый раз с окном <code>(x, y)</code> будем
увеличивать элемент матрицы <code>M[x][y]</code> на единицу.</p>
<p><img alt="" src="../assets/type-pred/file_sig.png" /></p>
<h2 id="_3">Причины использования Си</h2>
<p>Если <strong>кратко</strong>: python очень медленный. Например, средний <code>wav</code>-файл
занимает около 10 мегабайт. Это порядка десяти миллионов байт, по
которым нужно пробежать и заполнить матрицу. А для обучения нейросети,
таких файлов должно быть много.</p>
<p><strong>Отдельный интерес</strong>, также, представляет возможность написать модуль
для python на C, который умеет взаимодействовать с API библиотеки
NumPy.</p>
<h2 id="_4">Чтение файлов в память</h2>
<p>Для чтения файла в память, был написан модуль на Си, доступный
репозитории[2]. Здесь кратко опишу, как он работает.</p>
<p>В нем реализована функция <code>signature_from_filepath_by2</code>, которая
получает на вход два параметра: имя файла и уровень <code>verbose</code>. <code>by_2</code>
в названии обусловлено тем, что работа не с матрицами, а <code>n</code>-мерными
тензорами улучшает качество предсказания.</p>
<p>Функция <code>read_file</code> считывает файл в структуру <code>raw_data</code>, которая
представляет собой просто последовательность байтов и размер этой
последовательности. После этого функция <code>build_matrix</code> считывает по
этой струтуре сигнатуру и записывает в <code>matrix</code>.</p>
<p>Далее создается объект <code>PyObject *result</code>, представляющий собой
указатель на массив <code>NumPy</code> типа <code>uint32</code>. На его основе создается
динамический массив <code>result_data</code>.</p>
<p>Так как <code>matrix</code> лежит в памяти последовательно (ввиду того, что
она аллоцирована на стеке), то её можно просто скопировать в
<code>result_data</code>. После всего этого возвращается указатель <code>*result</code>.</p>
<p>Помимо этого в коде много второстепенных действий, которые требует API
Python для работы. Эти подробности я опустил, их можно увидеть в коде,
все достаточно предсказуемо.</p>
<h2 id="_5">Пайплайн обучения нейросети</h2>
<p><strong>Нюанс обучения нейросети</strong>: так как получившиеся матрицы вышли очень
неравномерными, дополнительно они были размыты <a href="https://ru.wikipedia.org/wiki/%D0%A0%D0%B0%D0%B7%D0%BC%D1%8B%D1%82%D0%B8%D0%B5_%D0%BF%D0%BE_%D0%93%D0%B0%D1%83%D1%81%D1%81%D1%83"><em>методом
Гаусса</em></a>.</p>
<p>Для обучения нейросети необходимо создать матрицу меток. Так как
предполагается, что нейросеть будет предсказывать различные типы
файлов, то матрица меток будет иметь размер <code>M*NxM</code>, где:</p>
<ul>
<li><code>M</code> -- количество типов файлов</li>
<li><code>N</code> -- количество файлов в одном типе (берется минимальное из всех,
чтобы обучение было равномерным)</li>
</ul>
<p>Для разбиения на тренировочную и обучающию выборки отлично подходит
функция <code>train_test_split</code> из модуля <code>sklearn.model_selection</code>.</p>
<p>Сам перцептрон будет иметь следующую архитектуру:</p>
<ol>
<li>На входном слое будет 65536 нейронов (<code>256х256</code>). Функцией активации
будет <code>ReLu</code>-функция.</li>
<li>Скрытый слой будет иметь 512 нейронов и <code>sigmoid</code>-функцию активации.</li>
<li>На выходе будет столько нейронов, сколько типов файлов нужно будет
предсказать.</li>
</ol>
<p>Для для задания <code>loss</code>-функции и оптимизатора:</p>
<div class="highlight"><pre><span></span><code><span class="n">loss_fn</span> <span class="o">=</span> <span class="n">nn</span><span class="o">.</span><span class="n">CrossEntropyLoss</span><span class="p">()</span>
<span class="n">optimizer</span> <span class="o">=</span> <span class="n">t</span><span class="o">.</span><span class="n">optim</span><span class="o">.</span><span class="n">SGD</span><span class="p">(</span><span class="n">model</span><span class="o">.</span><span class="n">parameters</span><span class="p">(),</span> <span class="n">lr</span><span class="o">=</span><span class="mf">1e-3</span><span class="p">)</span>
</code></pre></div>
<p>Цикл обучения в данном случае состоял из 250 эпох. </p>
<p>Пайплайн обучения можно будет найти в репозитории
<a href="https://github.com/rustbas/filetype-prediction">проекта</a>, вместе с
инструкцией по воспроизведению результатов (кроме того факта, что
файлы различных типов нужно будет скачать самому).</p>
<h2 id="_6">Результаты и картинки</h2>
<p>Усреденные сигнатуры различных типов файлов можно увидеть ниже.</p>
<p><img alt="" src="../assets/type-pred/heatmaps.png" /></p>
<p>Также, показатели обучения:</p>
<p><img alt="" src="../assets/type-pred/stats.png" /></p>
<h2 id="_7">Выводы</h2>
<p>По итогу, можно сказать, что в некоторых случаях, <em>сигнатура</em> файла
является неплохим предиктором его типа. </p>
<p>Гипотетически, это можно использовать для следующих идей:</p>
<ol>
<li>Восстановление частично поврежденных файлов, так как можно попытаться
угадать его структуру и восстановить её.</li>
<li>Определение исполняемых файлов при анализе вредоносного ПО.</li>
<li>Обнаружение скрытых данных (когда сигнатура файла и его тип не
соответствуют друг другу).</li>
</ol>
<h2 id="_8">Источники</h2>
<ol>
<li><a href="https://ru.wikipedia.org/wiki/Executable_and_Linkable_Format">Википедия про ELF-формат</a>;</li>
<li><a href="https://github.com/rustbas/filetype-prediction">Репозиторий проекта</a>;</li>
<li><a href="https://youtu.be/AUWxl0WdiNI?si=mklboGVUC-mZ-d1M">Основание идеи заметки</a>;<ol>
<li><a href="https://youtu.be/4bM3Gut1hIk?si=zSGWLHKTKW7bStPb">Пояснение про сигнатуру</a>;</li>
</ol>
</li>
<li><a href="https://youtu.be/45TOazYbedI?si=jykTbnbjcyzTsN0r">Модули для Python</a>.</li>
</ol>
<aside class="md-source-file">
<span class="md-source-file__fact">
<span class="md-icon" title="Last update">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M21 13.1c-.1 0-.3.1-.4.2l-1 1 2.1 2.1 1-1c.2-.2.2-.6 0-.8l-1.3-1.3c-.1-.1-.2-.2-.4-.2m-1.9 1.8-6.1 6V23h2.1l6.1-6.1zM12.5 7v5.2l4 2.4-1 1L11 13V7zM11 21.9c-5.1-.5-9-4.8-9-9.9C2 6.5 6.5 2 12 2c5.3 0 9.6 4.1 10 9.3-.3-.1-.6-.2-1-.2s-.7.1-1 .2C19.6 7.2 16.2 4 12 4c-4.4 0-8 3.6-8 8 0 4.1 3.1 7.5 7.1 7.9l-.1.2z"/></svg>
</span>
2025-06-02
</span>
</aside>
</article>
</div>
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
</div>
</main>
<footer class="md-footer">
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-copyright">
Made with
<a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
Material for MkDocs
</a>
</div>
</div>
</div>
</footer>
</div>
<div class="md-dialog" data-md-component="dialog">
<div class="md-dialog__inner md-typeset"></div>
</div>
<div class="md-progress" data-md-component="progress" role="progressbar"></div>
<script id="__config" type="application/json">{"base": "../..", "features": ["navigation.instant", "navigation.instant.progress", "header.autohide"], "search": "../../assets/javascripts/workers/search.d50fe291.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
<script src="../../assets/javascripts/bundle.13a4f30d.min.js"></script>
<script src="../../javascripts/mathjax.js"></script>
<script src="https://unpkg.com/mathjax@3/es5/tex-mml-chtml.js"></script>
</body>
</html>