{"id":38,"date":"2014-11-23T11:10:47","date_gmt":"2014-11-23T10:10:47","guid":{"rendered":"http:\/\/www.mlguru.cz\/?p=38"},"modified":"2017-08-12T15:35:19","modified_gmt":"2017-08-12T13:35:19","slug":"pravdepodobnostni-programovaci-jazyky","status":"publish","type":"post","link":"https:\/\/www.mlguru.com\/cs\/pravdepodobnostni-programovaci-jazyky\/","title":{"rendered":"Pravd\u011bpodobnostn\u00ed programovac\u00ed jazyky"},"content":{"rendered":"<p><a href=\"http:\/\/www.mlguru.cz\/wp-content\/uploads\/2014\/11\/bayes.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft wp-image-86 size-full\" src=\"http:\/\/www.mlguru.cz\/wp-content\/uploads\/2014\/11\/bayes.jpg\" alt=\"Bayes\" width=\"200\" height=\"140\" \/><\/a><\/p>\n<p>Posledn\u00edch n\u011bkolik let se hodn\u011b mluv\u00ed a p\u00ed\u0161e o\u00a0datech a jejich anal\u00fdze. Zejm\u00e9na o tom, jak rychle zpracov\u00e1vat <a title=\"velk\" href=\"http:\/\/en.wikipedia.org\/wiki\/Big_data\" target=\"_blank\" rel=\"noopener\">velk\u00e1 data<\/a> pomoc\u00ed modern\u00edch technologi\u00ed\u00a0postaven\u00fdch na <a title=\"Ma\" href=\"http:\/\/en.wikipedia.org\/wiki\/MapReduce\" target=\"_blank\" rel=\"noopener\">MapReduce<\/a>\u00a0modelu. Existuje velk\u00e9 mno\u017estv\u00ed\u00a0firem, kter\u00e9 nab\u00edzej\u00ed slu\u017eby zprost\u0159edkov\u00e1vaj\u00edc\u00ed vhled do dat pomoc\u00ed vizualizac\u00ed jednoduch\u00fdch statistik. K dispozici je i \u0159ada knihoven a framework\u016f umo\u017e\u0148uj\u00edc\u00edch vyvozovat z dat netrivi\u00e1ln\u00ed z\u00e1v\u011bry s vyu\u017eit\u00edm standardn\u00edch algoritm\u016f strojov\u00e9ho u\u010den\u00ed pro klasifikaci, shlukov\u00e1n\u00ed apod. (za v\u0161echny jmenujme nap\u0159. <a href=\"http:\/\/mahout.apache.org\/\" target=\"_blank\" rel=\"noopener\">Apache Mahout<\/a>). Relativn\u011b m\u00e1lo pozornosti je v\u0161ak v\u011bnov\u00e1no obecn\u00fdm <a href=\"http:\/\/en.wikipedia.org\/wiki\/Unsupervised_learning\" target=\"_blank\" rel=\"noopener\">unsupervised<\/a>\u00a0n\u00e1stroj\u016fm pro vyvozov\u00e1n\u00ed informac\u00ed z nestrukturovan\u00fdch dat, kter\u00fdch je v\u011bt\u0161ina. P\u0159itom informace skryt\u00e9 v takov\u00fdch datech jsou \u010dasto nejzaj\u00edmav\u011bj\u0161\u00ed.<\/p>\n<p>Jedn\u00edm z nejelegantn\u011bj\u0161\u00edch p\u0159\u00edstup\u016f k unsupervised modelov\u00e1n\u00ed dat jsou <a title=\"P\" href=\"http:\/\/en.wikipedia.org\/wiki\/Probabilistic_programming_language\" target=\"_blank\" rel=\"noopener\">pravd\u011bpodobnostn\u00ed programovac\u00ed jazyky<\/a>. Jedn\u00e1 se o vysoko\u00farov\u0148ov\u00e9 jazyky, kter\u00e9 umo\u017e\u0148uj\u00ed snadno popsat\u00a0pravd\u011bpodobnostn\u00ed model reprezentuj\u00edc\u00ed data a automaticky\u00a0z n\u011bho vyvozovat nezn\u00e1m\u00e9 parametry. Interpret pravd\u011bpodobnostn\u00edho programovac\u00edho jazyka se s\u00e1m postar\u00e1 o inferenci, co\u017e program\u00e1torovi\u00a0u\u0161et\u0159\u00ed drahocenn\u00fd \u010das str\u00e1ven\u00fd s odvozov\u00e1n\u00ed vztah\u016f a implementac\u00ed k\u00f3du. Ve skute\u010dnosti u\u017eivatel pravd\u011bpodobnostn\u00edho jazyka v\u016fbec nemus\u00ed um\u011bt programovat v b\u011b\u017en\u00e9m slova smyslu, ale vysta\u010d\u00ed si se znalost\u00ed statistiky a obecn\u00e9ho charakteru sv\u00fdch dat.<\/p>\n<p>Nejd\u016fle\u017eit\u011bj\u0161\u00ed \u010d\u00e1st\u00ed k\u00f3du v pravd\u011bpodobnostn\u00edch programovac\u00edch jazyc\u00edch je n\u00e1vrh <a href=\"http:\/\/en.wikipedia.org\/wiki\/Generative_model\" target=\"_blank\" rel=\"noopener\">generativn\u00edho modelu<\/a>. Jedn\u00e1 se o pravd\u011bpodobnostn\u00ed model, kter\u00fd v z\u00e1sad\u011b popisuje, jak\u00fdm zp\u016fsobem by mohla b\u00fdt vygenerov\u00e1na analyzovan\u00e1 data, kdybychom znali v\u0161echny jeho parametry. Z\u00e1kladn\u00edmi kameny takov\u00e9ho modelu jsou vhodn\u011b poskl\u00e1dan\u00e1\u00a0pravd\u011bpodobnostn\u00ed rozd\u011blen\u00ed. Architektura modelu je volena tak, aby co nejl\u00e9pe popisovala obecn\u00fd charakter dat. Inferenc\u00ed se rozum\u00ed\u00a0proces nalezen\u00ed takov\u00fdch parametr\u016f, kter\u00e9 maximalizuj\u00ed pravd\u011bpodobnost generov\u00e1n\u00ed poskytnut\u00fdch dat pomoc\u00ed zvolen\u00e9ho modelu.<\/p>\n<p>Na \u00favod za\u010dn\u011bme s jednoduch\u00fdm ilustra\u010dn\u00edm\u00a0probl\u00e9mem. M\u011bjme datov\u00fd soubor, ve kter\u00e9m jsou ulo\u017een\u00e9 v\u00fd\u0161ky v\u0161ech dosp\u011bl\u00fdch lid\u00ed v n\u011bjak\u00e9m m\u011bst\u011b a \u0159ekn\u011bme, \u017ee n\u00e1s zaj\u00edm\u00e1 pr\u016fm\u011brn\u00e1 hodnota\u00a0\u03bc a sm\u011brodatn\u00e1 odchylka\u00a0\u03c3 t\u011bchto hodnot. V\u00edme, \u017ee v\u00fd\u0161ka lid\u00ed je rozd\u011blena podle norm\u00e1ln\u00edho rozd\u011blen\u00ed<\/p>\n<p align=\"center\"><img src='https:\/\/s0.wp.com\/latex.php?latex=N+%28x+%7C+%5Cmu%2C+%5Csigma%5E2%29+%3D+%5Cdfrac%7B1%7D%7B%5Csigma%5Csqrt%7B2%5Cpi%7D%7D+e%5E%7B%5Cdfrac%7B-%28x-%5Cmu%29%5E2%7D%7B2%5Csigma%5E2%7D%7D+&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='N (x | \\mu, \\sigma^2) = \\dfrac{1}{\\sigma\\sqrt{2\\pi}} e^{\\dfrac{-(x-\\mu)^2}{2\\sigma^2}} ' title='N (x | \\mu, \\sigma^2) = \\dfrac{1}{\\sigma\\sqrt{2\\pi}} e^{\\dfrac{-(x-\\mu)^2}{2\\sigma^2}} ' class='latex' \/><\/p>\n<p style=\"text-align: left;\">jak je ilustrov\u00e1no na obr\u00e1zku 1.<\/p>\n<div id=\"attachment_54\" style=\"width: 310px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/www.mlguru.cz\/wp-content\/uploads\/2014\/11\/normal_distribution.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-54\" class=\"wp-image-54 size-medium\" src=\"http:\/\/www.mlguru.cz\/wp-content\/uploads\/2014\/11\/normal_distribution-300x215.png\" alt=\"Pravd\u011bpodobnostn\u00ed rozd\u011blen\u00ed v\u00fd\u0161ek lid\u00ed v \u010cesk\u00e9 republice.\" width=\"300\" height=\"215\" \/><\/a><p id=\"caption-attachment-54\" class=\"wp-caption-text\">Obr. 1: Pravd\u011bpodobnostn\u00ed rozd\u011blen\u00ed v\u00fd\u0161ek lid\u00ed.<\/p><\/div>\n<p>Proto sta\u010d\u00ed ve zvolen\u00e9m jazyce zapsat, \u017ee je ka\u017ed\u00e1 hodnota ve\u00a0vstupn\u00edch datech generov\u00e1na z norm\u00e1ln\u00edho rozd\u011blen\u00ed a \u017ee chceme nal\u00e9zt takov\u00e9 hodnoty jeho dvou parametr\u016f, kter\u00e9 jsou optim\u00e1ln\u00ed vzhledem k analyzovan\u00fdm dat\u016fm. Tato \u00faloha se d\u00e1 samoz\u0159ejm\u011b \u0159e\u0161it jednodu\u0161eji, nebo\u0165 se vztahy pro v\u00fdpo\u010det t\u011bchto parametr\u016f daj\u00ed snadno odvodit. Existuj\u00ed v\u0161ak \u00falohy, kde je odvozen\u00ed obt\u00ed\u017en\u00e9, nebo dokonce nen\u00ed v\u016fbec mo\u017en\u00e9. P\u0159\u00edkladem je n\u00e1sleduj\u00edc\u00ed roz\u0161\u00ed\u0159en\u00ed probl\u00e9mu.<\/p>\n<p>M\u011bjme stejn\u00e1 vstupn\u00ed data jako v p\u0159edchoz\u00edm p\u0159\u00edkladu, ale dejme si za c\u00edl zjistit, jak\u00e1 je pr\u016fm\u011brn\u00e1 v\u00fd\u0161ka mu\u017e\u016f a pr\u016fm\u011brn\u00e1 v\u00fd\u0161ka \u017een v t\u011bchto datech. Na prvn\u00ed pohled se m\u016f\u017ee zd\u00e1t, \u017ee se tyto \u00fadaje zjistit nedaj\u00ed, lze v\u0161ak vyu\u017e\u00edt obecn\u00fdch znalost\u00ed, kter\u00e9 m\u00e1me:<\/p>\n<ul>\n<li>jak v\u00fd\u0161ky mu\u017e\u016f, tak i v\u00fd\u0161ky \u017een jsou rozd\u011bleny podle norm\u00e1ln\u00edho rozd\u011blen\u00ed, ov\u0161em s r\u016fzn\u00fdmi st\u0159edn\u00edmi\u00a0hodnotami<\/li>\n<li>mu\u017ei jsou v pr\u016fm\u011bru vy\u0161\u0161\u00ed ne\u017e \u017eeny<\/li>\n<li>v populaci je v p\u0159ibli\u017en\u011b\u00a0stejn\u00e9 mno\u017estv\u00ed mu\u017e\u016f i \u017een<\/li>\n<\/ul>\n<p>Jednou z mo\u017enost\u00ed, jak popsat data tak, abychom z nich byli schopn\u00ed odvodit pr\u016fm\u011brnou v\u00fd\u0161ku \u017een i mu\u017e\u016f p\u0159edstavuje n\u00e1sleduj\u00edc\u00ed generativn\u00ed proces:<\/p>\n<ol>\n<li>vyber hodnoty\u00a0\u03bc<sub>mu\u017e<\/sub>, \u03bc<sub>\u017eena<\/sub>\u00a0tak, \u017ee \u03bc<sub>mu\u017e<\/sub>\u00a0\u2265 \u03bc<sub>\u017eena<\/sub><\/li>\n<li>u ka\u017ed\u00e9ho \u010dlov\u011bka si ho\u010f minc\u00ed a podle v\u00fdsledku rozhodni, zda se jedn\u00e1 o mu\u017ee nebo \u017eenu<\/li>\n<li>v p\u0159\u00edpad\u011b, \u017ee jde o mu\u017ee, vyber jeho v\u00fd\u0161ku z norm\u00e1ln\u00edho rozd\u011blen\u00ed N(\u03bc<sub>mu\u017e<\/sub>, \u03c3<sup>2<\/sup>)<\/li>\n<li>v p\u0159\u00edpad\u011b, \u017ee jde o \u017eenu, vyber jej\u00ed v\u00fd\u0161ku z norm\u00e1ln\u00edho rozd\u011blen\u00ed N(\u03bc<sub>\u017eena<\/sub>, \u03c3<sup>2<\/sup>)<\/li>\n<\/ol>\n<p>Pot\u00e9 u\u017e sta\u010d\u00ed interpretu jazyka sd\u011blit, aby nalezl takov\u00e9 hodnoty \u03bc<sub>mu\u017e,\u00a0<\/sub>\u03bc<sub>\u017eena<\/sub> a\u00a0\u03c3, kter\u00e9 maximalizuj\u00ed pravd\u011bpodobnost dat p\u0159i dan\u00e9m modelu.<\/p>\n<h2>Programovac\u00ed jazyk JAGS<\/h2>\n<p>Jedn\u00edm z nejpou\u017e\u00edvan\u011bj\u0161\u00edch pravd\u011bpodobnostn\u00edch programovac\u00edch jazyk\u016f v sou\u010dasnosti je jazyk <a title=\"JAGS\" href=\"http:\/\/mcmc-jags.sourceforge.net\/\" target=\"_blank\" rel=\"noopener\">JAGS<\/a>. Jedn\u00e1 se o open source variantu jazyk\u016f <a href=\"http:\/\/www.mrc-bsu.cam.ac.uk\/software\/bugs\/the-bugs-project-winbugs\/\" target=\"_blank\" rel=\"noopener\">WinBugs<\/a> a <a href=\"http:\/\/www.openbugs.net\/\" target=\"_blank\" rel=\"noopener\">OpenBugs<\/a>, kter\u00e1 pou\u017e\u00edv\u00e1 stejnou syntax, ale je napsan\u00e1 v jazyce C++. To umo\u017e\u0148uje snadnou p\u0159enositelnost\u00a0na r\u016fzn\u00e9 platformy. Vzhledem k tomu, \u017ee JAGS nem\u00e1 grafick\u00e9 u\u017eivatelsk\u00e9 rozhran\u00ed a nen\u00ed v n\u011bm mo\u017en\u00e9 \u0159e\u0161it p\u0159edzpracov\u00e1n\u00ed a n\u00e1slednou anal\u00fdzu\u00a0dat, je nejvhodn\u011bj\u0161\u00ed ho pou\u017e\u00edt jako knihovnu volanou z jin\u00e9ho programovac\u00edho jazyka. Nej\u010dast\u011bj\u0161\u00ed\u00a0volbou je jazyk <a href=\"http:\/\/www.r-project.org\/\" target=\"_blank\" rel=\"noopener\">R<\/a>, kter\u00fd\u00a0je i syntakticky velmi podobn\u00fd. Pro inferenci pou\u017e\u00edv\u00e1 JAGS simulaci <a href=\"http:\/\/en.wikipedia.org\/wiki\/Markov_chain_Monte_Carlo\" target=\"_blank\" rel=\"noopener\">Markov Chain Monte Carlo<\/a>\u00a0(MCMC). Ta spo\u010d\u00edv\u00e1 v tom, \u017ee jsou hodnoty nezn\u00e1m\u00fdch n\u00e1hodn\u00fdch prom\u011bnn\u00fdch po p\u0159edchoz\u00ed\u00a0inicializaci postupn\u011b samplov\u00e1ny, \u010d\u00edm\u017e se jejich odhad neust\u00e1le zp\u0159es\u0148uje. Po ur\u010dit\u00e9m po\u010dtu iterac\u00ed algoritmu pravd\u011bpodobnostn\u00ed rozd\u011blen\u00ed hodnot t\u011bchto prom\u011bnn\u00fdch zkonverguje. Pot\u00e9 je mo\u017en\u00e9 spustit dal\u0161\u00ed f\u00e1zi algoritmu, ve kter\u00e9 u\u017e se sampluj\u00ed jen prom\u011bnn\u00e9, jejich\u017e hodnoty chceme odvodit. Vzorky dat z t\u00e9to f\u00e1ze se zpr\u016fm\u011bruj\u00ed, \u010d\u00edm\u017e z\u00edsk\u00e1me o\u010dek\u00e1van\u00e9 hodnoty.<\/p>\n<p>Pro pou\u017eit\u00ed v jazyce R je nejprve nutn\u00e9 nainstalovat <a title=\"J\" href=\"http:\/\/mcmc-jags.sourceforge.net\/\" target=\"_blank\" rel=\"noopener\">interpret jazyka JAGS<\/a>, kter\u00fd je k dispozici\u00a0pro r\u016fzn\u00e9 opera\u010dn\u00ed syst\u00e9my, p\u0159\u00edpadn\u011b je mo\u017en\u00e9 jej zkompilovat p\u0159\u00edmo ze zdrojov\u00fdch k\u00f3d\u016f. Druh\u00fdm krokem je instalace bal\u00ed\u010dku <a href=\"http:\/\/cran.r-project.org\/web\/packages\/rjags\/index.html\" target=\"_blank\" rel=\"noopener\">rjags<\/a>\u00a0do R. To je mo\u017en\u00e9 prov\u00e9st nap\u0159. p\u0159\u00edkazem<\/p>\n<pre class=\"brush: r; title: ; notranslate\" title=\"\">\r\ninstall.packages(&amp;quot;rjags&amp;quot;)\r\n<\/pre>\n<p>p\u0159\u00edmo v interaktivn\u00edm re\u017eimu interpretu jazyka R.<\/p>\n<p>Nyn\u00ed ji\u017e m\u00e1me p\u0159ipraveno v\u0161e k tomu, abychom mohli za\u010d\u00edt programovat. Vra\u0165me se k prvn\u00edmu p\u0159\u00edkladu s v\u00fd\u0161kami lid\u00ed ve m\u011bst\u011b. Vzhledem k tomu, \u017ee vzorek v\u00fd\u0161ek lid\u00ed nem\u00e1me k dispozici, vytvo\u0159me si ho um\u011ble:<\/p>\n<pre class=\"brush: r; title: ; notranslate\" title=\"\">\r\n\r\nN &amp;lt;- 10000\r\nx &amp;lt;- rnorm(N, 173, 10)\r\n<\/pre>\n<p>Uveden\u00fd p\u0159\u00edklad vygeneruje n\u00e1hodn\u00fd vektor 10000 vzork\u016f v\u00fd\u0161ek z norm\u00e1ln\u00edho rozd\u011blen\u00ed se st\u0159edn\u00ed hodnotou 173 a sm\u011brodatnou odchylkou 10. Na\u0161\u00edm c\u00edlem te\u010f bude pouze na z\u00e1klad\u011b t\u011bchto n\u00e1hodn\u00fdch dat zp\u011btn\u011b odvodit nezn\u00e1m\u00e9 parametry rozd\u011blen\u00ed. Kompletn\u00ed k\u00f3d v jazyce JAGS, kter\u00fd ulo\u017e\u00edme do souboru \"vysky.bug\", vypad\u00e1 n\u00e1sledovn\u011b:<\/p>\n<pre class=\"brush: r; title: ; notranslate\" title=\"\">\r\nmodel {\r\n    for (i in 1:N) {\r\n        x&#x5B;i] ~ dnorm(mu, tau)\r\n    }\r\n    mu ~ dnorm(170, 0.0001)\r\n    sigma ~ dunif(0, 50)\r\n    tau &amp;lt;- pow(sigma, -2)\r\n}\r\n<\/pre>\n<p>Ka\u017ed\u00fd k\u00f3d v jazyce JAGS obvykle za\u010d\u00edn\u00e1 kl\u00ed\u010dov\u00fdm slovem <em>model,<\/em> kter\u00e9 oznamuje, \u017ee bude n\u00e1sledovat definice pravd\u011bpodobnostn\u00edho modelu. Na \u0159\u00e1dc\u00edch 2-4 popisujeme generov\u00e1n\u00ed\u00a0v\u00fd\u0161ek jednotliv\u00fdch osob\u00a0z norm\u00e1ln\u00edho rozd\u011blen\u00ed s parametry <em>mu<\/em> a <em>tau.\u00a0<\/em>Zd\u016frazn\u011bme, \u017ee v jazyce JAGS nen\u00ed druh\u00fdm parametrem norm\u00e1ln\u00edho rozd\u011blen\u00ed sm\u011brodatn\u00e1 odchylka, n\u00fdbr\u017e p\u0159evr\u00e1cen\u00e1 hodnota rozptylu. Hodnoty <em>mu<\/em> jsou na \u0159\u00e1dku 5 generov\u00e1ny z norm\u00e1ln\u00edho rozd\u011blen\u00ed. To je v tomto p\u0159\u00edpad\u011b hrub\u00fdm odhadem, kter\u00fd nen\u00ed\u00a0informativn\u00ed a m\u00e1 zanedbateln\u00fd vliv na v\u00fdsledek inference. Podobn\u011b jsou hodnoty <em>sigma<\/em> generov\u00e1ny z rovnom\u011brn\u00e9ho rozd\u011blen\u00ed z intervalu 0 a\u017e 50. To je op\u011bt neinformativn\u00ed hrub\u00fd odhad, nebo\u0165 skute\u010dn\u00e1 sm\u011brodatn\u00e1 odchylka v\u00fd\u0161ek lid\u00ed je ur\u010dit\u011b ni\u017e\u0161\u00ed ne\u017e 50 cm. Kone\u010dn\u011b \u0159\u00e1dek 7 definuje vztah mezi <em>tau<\/em> a <em>sigma<\/em>. V\u0161imn\u011bme si, \u017ee zat\u00edmco u generov\u00e1n\u00ed z pravd\u011bpodobnostn\u00edho rozd\u011blen\u00ed je pou\u017eit symbol '~', u deterministick\u00e9ho vztahu je to symbol '&lt;-'.<\/p>\n<p>Nyn\u00ed u\u017e m\u016f\u017eeme p\u0159istoupit k samotn\u00e9 MCMC simulaci v jazyce R:<\/p>\n<pre class=\"brush: r; title: ; notranslate\" title=\"\">\r\n\r\nlibrary('rjags')\r\n\r\njags &amp;lt;- jags.model('vysky.bug', data = list('x' = x, 'N' = N))\r\nupdate(jags, 1000)\r\njags.samples(jags, c('mu', 'sigma'), 1000)\r\n\r\n<\/pre>\n<p>Na prvn\u00edm \u0159\u00e1dku nejprve na\u010dteme knihovnu 'rjags' do pam\u011bti. Na \u0159\u00e1dku 3 nahrajeme JAGS model ze souboru \"vysky.bug\" a p\u0159i\u0159ad\u00edme vstupn\u00ed data. P\u0159\u00edkaz <em>update<\/em> na dal\u0161\u00edm \u0159\u00e1dku provede po\u017eadovan\u00fd po\u010det iterac\u00ed. Minim\u00e1ln\u00ed po\u010det iterac\u00ed pro dosa\u017een\u00ed konvergence z\u00e1vis\u00ed jak na datech, tak na slo\u017eitosti modelu a ned\u00e1 se nijak jednodu\u0161e stanovit p\u0159edem. U slo\u017eit\u011bj\u0161\u00edch model\u016f je vhodn\u00e9 nap\u0159. sledovat <a title=\"perplex\" href=\"http:\/\/en.wikipedia.org\/wiki\/Perplexity\" target=\"_blank\" rel=\"noopener\">perplexitu<\/a> na odlo\u017een\u00fdch datech a samplov\u00e1n\u00ed zastavit ve chv\u00edli, kdy perplexita p\u0159estane klesat. Pro tento jednoduch\u00fd p\u0159\u00edklad by v\u0161ak 1000 iterac\u00ed m\u011blo bez probl\u00e9mu sta\u010dit. Kone\u010dn\u011b posledn\u00ed p\u0159\u00edkaz <em>samples<\/em>\u00a0provede dal\u0161\u00edch 1000 iterac\u00ed, u kter\u00fdch si v\u0161ak zaznamen\u00e1v\u00e1 samplovan\u00e9 hodnoty prom\u011bnn\u00fdch <em>mu<\/em>\u00a0a <em>sigma<\/em>, kter\u00e9 po skon\u010den\u00ed zpr\u016fm\u011bruje a vyp\u00ed\u0161e na v\u00fdstup. Tyto hodnoty by zhruba m\u011bly odpov\u00eddat parametr\u016fm, kter\u00e9 byly pou\u017eity pro um\u011bl\u00e9 vygenerov\u00e1n\u00ed vstupn\u00edch dat, tedy <em>mu<\/em>\u00a0\u2248 173 a sigma\u00a0\u2248 10. Je d\u016fle\u017eit\u00e9 si uv\u011bdomit, \u017ee se jedn\u00e1 o stochastick\u00fd proces, tak\u017ee v\u00fdsledek bude p\u0159i ka\u017ed\u00e9m spu\u0161t\u011bn\u00ed trochu jin\u00fd.<\/p>\n<p>Druh\u00fd p\u0159\u00edklad, kter\u00fd si klade za c\u00edl odhadnout pr\u016fm\u011brn\u00e9 v\u00fd\u0161ky mu\u017e\u016f a \u017een je nepatrn\u011b slo\u017eit\u011bj\u0161\u00ed. Za\u010dn\u011bme vygenerov\u00e1n\u00edm um\u011bl\u00fdch dat:<\/p>\n<pre class=\"brush: r; title: ; notranslate\" title=\"\">\r\n\r\nmuzi &amp;lt;- rnorm(5000, 180, 10)\r\nzeny &amp;lt;- rnorm(5000, 167, 10)\r\nx &amp;lt;- sample(c(muzi, zeny))\r\nN &amp;lt;- 10000\r\n\r\n<\/pre>\n<p>Nejprve vygenerujeme zvl\u00e1\u0161\u0165 vektor v\u00fd\u0161ek mu\u017e\u016f a zvl\u00e1\u0161'\u0165 vektor v\u00fd\u0161ek \u017een z norm\u00e1ln\u00edch rozd\u011blen\u00ed. Ob\u011b rozd\u011blen\u00ed maj\u00ed stejnou sm\u011brodatnou odchylku, ale r\u016fzn\u00e9 st\u0159edn\u00ed hodnoty. D\u00e1le tyto seznamy spoj\u00edme a n\u00e1hodn\u011b zam\u00edch\u00e1me, abychom si \u00falohu znesnadnili.<\/p>\n<p>Nyn\u00ed se pod\u00edvejme na z\u00e1pis modelu v jazyce JAGS:<\/p>\n<pre class=\"brush: r; title: ; notranslate\" title=\"\">\r\nmodel {\r\n    for( i in 1 : N ) {\r\n        T&#x5B;i] ~ dcat(P&#x5B;])\r\n        x&#x5B;i] ~ dnorm(mu&#x5B;T&#x5B;i]], tau)\r\n    }\r\n    theta ~ dnorm(0.0, 0.0001)\r\n    mu&#x5B;1] ~ dnorm(170.0, 0.0001)\r\n    mu&#x5B;2] &amp;lt;- mu&#x5B;1] + abs(theta)\r\n    P&#x5B;1] &amp;lt;- 0.5\r\n    P&#x5B;2] &amp;lt;- 0.5\r\n    sigma ~ dunif(0, 50)\r\n    tau &amp;lt;- pow(sigma, -2)\r\n}\r\n<\/pre>\n<p>Prom\u011bnn\u00e1 <em>mu\u00a0<\/em>je tentokr\u00e1t vektor d\u00e9lky 2, ve kter\u00e9m prvn\u00ed slo\u017eka reprezentuje st\u0159edn\u00ed hodnotu v\u00fd\u0161ky mu\u017e\u016f a druh\u00e1 st\u0159edn\u00ed hodnotu v\u00fd\u0161ky \u017een. Pro ka\u017ed\u00e9ho \u010dlov\u011bka se nejprve vybere, zda se jedn\u00e1 o mu\u017ee nebo o \u017eenu. To je reprezentov\u00e1no vektorem <em>T<\/em> d\u00e9lky <em>N<\/em>, kde 1 zna\u010d\u00ed \u017eenu a 2 mu\u017ee.\u00a0Tato rozhodnut\u00ed jsou n\u00e1hodn\u00e1, p\u0159i\u010dem\u017e ob\u011b mo\u017enosti maj\u00ed stejnou pravd\u011bpodobnost. Hodnota <em>mu[1]<\/em> je generov\u00e1na z neinformativn\u00edho norm\u00e1ln\u00edho rozd\u011blen\u00ed jako v p\u0159edchoz\u00edm p\u0159\u00edkladu, hodnota <em>mu[2]<\/em>\u00a0je definov\u00e1na jako<em> mu[1] + abs(theta)<\/em>, kde <em>theta<\/em> je z neinformativn\u00edho rozd\u011blen\u00ed s nulovou st\u0159edn\u00ed hodnotou. D\u00edky tomu, \u017ee je <em>theta<\/em> p\u0159i\u010dtena v absolutn\u00ed hodnot\u011b, je v\u017edy dosa\u017eeno vztahu<em>\u00a0mu[1] \u2264 mu[2]<\/em>. U sm\u011brodatn\u00e9 odchylky v\u00fd\u0161ek p\u0159edpokl\u00e1d\u00e1me, \u017ee je stejn\u00e1 u mu\u017e\u016f i u \u017een a je generov\u00e1na stejn\u00fdm zp\u016fsobem jako d\u0159\u00edve. Spu\u0161t\u011bn\u00ed simulace je mo\u017en\u00e9 prov\u00e9st stejn\u011b jako v p\u0159edchoz\u00edm p\u0159\u00edkladu s t\u00edm rozd\u00edlem, \u017ee na v\u00fdstupu v p\u0159\u00edpad\u011b prom\u011bnn\u00e9 <em>mu\u00a0<\/em>dostaneme\u00a0m\u00edsto skal\u00e1ru vektor.<\/p>\n<p>Na posledn\u00edm p\u0159\u00edkladu si uk\u00e1\u017eeme, \u017ee se pravd\u011bpodobnostn\u00ed programovac\u00ed jazyky daj\u00ed pou\u017e\u00edt nejen pro p\u0159\u00edmo\u010darou statistickou anal\u00fdzu dat, ale i pro probl\u00e9my, kter\u00e9 se typicky \u0159e\u0161\u00ed jin\u00fdmi zp\u016fsoby. Takovou \u00falohou je nap\u0159\u00edklad <a href=\"http:\/\/en.wikipedia.org\/wiki\/Regression_analysis\">regrese<\/a>. C\u00edlem\u00a0regresn\u00ed anal\u00fdzy je nalezen\u00ed parametr\u016f k\u0159ivky tak, aby co nejl\u00e9pe aproximovala n\u011bjakou mno\u017einu bod\u016f. K\u0159ivkou m\u016f\u017ee b\u00fdt nap\u0159\u00edklad polynom t\u0159et\u00edho stupn\u011b<\/p>\n<p align=\"center\"><img src='https:\/\/s0.wp.com\/latex.php?latex=y%28x%29+%3D+w_3x%5E3+%2B+w_2x%5E2+%2Bw_1x+%2B+w_0+&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='y(x) = w_3x^3 + w_2x^2 +w_1x + w_0 ' title='y(x) = w_3x^3 + w_2x^2 +w_1x + w_0 ' class='latex' \/><\/p>\n<p>a hledan\u00fdmi parametry koeficienty <em><strong>w<\/strong> = (w<sub>3<\/sub>, w<sub>2<\/sub>, w<sub>1<\/sub>, w<sub>0<\/sub>),<\/em> jak je ilustrov\u00e1no na obr\u00e1zku 2.<\/p>\n<p>&nbsp;<\/p>\n<div id=\"attachment_96\" style=\"width: 310px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/www.mlguru.cz\/wp-content\/uploads\/2014\/11\/regression.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-96\" class=\"size-medium wp-image-96\" src=\"http:\/\/www.mlguru.cz\/wp-content\/uploads\/2014\/11\/regression-300x191.png\" alt=\"Obr. 2: Regresn\u00ed anal\u00fdza.\" width=\"300\" height=\"191\" srcset=\"https:\/\/www.mlguru.com\/wp-content\/uploads\/2014\/11\/regression-300x191.png 300w, https:\/\/www.mlguru.com\/wp-content\/uploads\/2014\/11\/regression-1024x652.png 1024w, https:\/\/www.mlguru.com\/wp-content\/uploads\/2014\/11\/regression.png 2000w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><p id=\"caption-attachment-96\" class=\"wp-caption-text\">Obr. 2: Regresn\u00ed anal\u00fdza.<\/p><\/div>\n<p>Modr\u00e9 body zde reprezentuj\u00ed prokl\u00e1dan\u00e1 data, \u010derven\u00e1 k\u0159ivka je grafem hledan\u00e9ho polynomu. Typicky se tato \u00faloha \u0159e\u0161\u00ed hled\u00e1n\u00edm nejmen\u0161\u00ed sumy \u010dtverc\u016f chyb, lze na ni v\u0161ak nahl\u00ed\u017eet i Bayesovskou perspektivou. To, \u017ee modr\u00e9 body nele\u017e\u00ed p\u0159esn\u011b na \u010derven\u00e9 k\u0159ivce je obvykle zp\u016fsobeno n\u011bjak\u00fdm \u0161umem, distribuovan\u00fdm podle norm\u00e1ln\u00edho rozd\u011blen\u00ed se st\u0159edn\u00ed hodnotou le\u017e\u00edc\u00ed na k\u0159ivce. To je v obr\u00e1zku zn\u00e1zorn\u011bno modrou k\u0159ivkou. Lze tedy snadno navrhnou generativn\u00ed model, kter\u00fd bude popisovat, jak by vznikla vstupn\u00ed data, kdybychom znali parametry prokl\u00e1dan\u00e9 k\u0159ivky.<\/p>\n<p>Nejprve si op\u011bt vytvo\u0159me syntetick\u00e1 data:<\/p>\n<pre class=\"brush: r; title: ; notranslate\" title=\"\">\r\n\r\nx &amp;lt;- seq(-10, 10, by = 0.01)\r\nN &amp;lt;- length(x)\r\nw3 &amp;lt;- 1\r\nw2 &amp;lt;- 0\r\nw1 &amp;lt;- -1\r\nw0 &amp;lt;- 10\r\nepsilon &amp;lt;- rnorm(N, 0, 5)\r\ny &amp;lt;- w3*x^3 + w2*x^2 + w1*x + w0 + epsilon\r\n\r\n<\/pre>\n<p>Z k\u00f3du je vid\u011bt, \u017ee jsou\u00a0body rozprost\u0159eny podle norm\u00e1ln\u00edho rozd\u011blen\u00ed se sm\u011brodatnou odchylkou 5 kolem k\u0159ivky s rovnic\u00ed<\/p>\n<p align=\"center\"><img src='https:\/\/s0.wp.com\/latex.php?latex=y%28x%29+%3D+w_3x%5E3+-+w_1x+%2B+10&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='y(x) = w_3x^3 - w_1x + 10' title='y(x) = w_3x^3 - w_1x + 10' class='latex' \/><\/p>\n<p style=\"text-align: left;\">N\u00e1sleduje popis generativn\u00edho modelu v jazyce JAGS, kter\u00fd ulo\u017eme do souboru 'regression.bug':<\/p>\n<pre class=\"brush: r; title: ; notranslate\" title=\"\">\r\nmodel {\r\n    for (i in 1:N) {\r\n        y&#x5B;i] ~ dnorm(y0&#x5B;i], tau)\r\n        y0&#x5B;i] &amp;lt;- w3*pow(x&#x5B;i], 3) + w2*pow(x&#x5B;i], 2) + w1*x&#x5B;i] + w0\r\n    }\r\n    w3 ~ dnorm(0, 0.0001)\r\n    w2 ~ dnorm(0, 0.0001)\r\n    w1 ~ dnorm(0, 0.0001)\r\n    w0 ~ dnorm(0, 0.0001)\r\n    tau &amp;lt;- pow(sigma, -2)\r\n    sigma ~ dunif(0, 100)\r\n}\r\n<\/pre>\n<p>Vid\u00edme, \u017ee jsou datov\u00e9 body generov\u00e1ny z norm\u00e1ln\u00edho rozd\u011blen\u00ed se st\u0159edn\u00ed hodnotou\u00a0<em>w3*pow(x[i], 3) + w2*pow(x[i], 2) + w1*x[i] + w0<\/em> a sm\u011brodatnou odchylkou <em>sigma<\/em>. Parametry w3, w2, w1, w0 jsou generov\u00e1ny z neinformativn\u00edho norm\u00e1ln\u00edho rozd\u011blen\u00ed. Pro \u00faplnost dopl\u0148me k\u00f3d pro nalezen\u00ed optim\u00e1ln\u00edch hodnot t\u011bchto parametr\u016f:<\/p>\n<pre class=\"brush: r; title: ; notranslate\" title=\"\">\r\n\r\njags &amp;lt;- jags.model('regression.bug', data = list('x' = x, 'y' = y, 'N' = N))\r\nupdate(jags, 1000)\r\njags.samples(jags, c('w3', 'w2', 'w1', 'w0'), 1000)\r\n\r\n<\/pre>\n<p>C\u00edlem p\u0159edstaven\u00ed uveden\u00fdch\u00a0p\u0159\u00edklad\u016f bylo ilustrovat zp\u016fsob pou\u017eit\u00ed pravd\u011bpodobnostn\u00edch programovac\u00edch jazyk\u016f. Ve skute\u010dnosti existuj\u00ed pro v\u0161echny t\u0159i \u00falohy efektivn\u011bj\u0161\u00ed \u0159e\u0161en\u00ed. Ta v\u0161ak vy\u017eaduj\u00ed odvozov\u00e1n\u00ed vztah\u016f a v\u00fdrazn\u011b v\u011bt\u0161\u00ed mno\u017estv\u00ed programov\u00e9ho k\u00f3du.\u00a0N\u011bkter\u00e9 modely jako nap\u0159. <a title=\"LA\" href=\"http:\/\/en.wikipedia.org\/wiki\/Latent_Dirichlet_allocation\" target=\"_blank\" rel=\"noopener\">LDA<\/a>\u00a0nav\u00edc efektivn\u011bji \u0159e\u0161it nejdou (nebo alespo\u0148 \u017e\u00e1dn\u00e9\u00a0takov\u00e9 \u0159e\u0161en\u00ed nen\u00ed zn\u00e1m\u00e9) a pravd\u011bpodobnostn\u00ed programovac\u00ed jazyky jsou tak\u00a0nejlep\u0161\u00ed volbou pro jednoduch\u00e9 experimenty. Pro dal\u0161\u00ed inspiraci lze pou\u017e\u00edt jako zdroj p\u0159\u00edklad\u016f <a href=\"http:\/\/www.openbugs.net\/w\/Examples\" target=\"_blank\" rel=\"noopener\">archiv<\/a> na webu projektu OpenBugs.<\/p>\n<p>Zdroje obr\u00e1zk\u016f:<\/p>\n<ul>\n<li>http:\/\/research.microsoft.com\/en-us\/um\/people\/cmbishop\/PRML\/webfigs.htm<\/li>\n<li>http:\/\/www.sentientdevelopments.com\/2006\/01\/economist-bayes-helps-explain-how-mind.html<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Posledn\u00edch n\u011bkolik let se hodn\u011b mluv\u00ed a p\u00ed\u0161e o\u00a0datech a jejich anal\u00fdze. Zejm\u00e9na o tom, jak rychle zpracov\u00e1vat velk\u00e1 data pomoc\u00ed modern\u00edch technologi\u00ed\u00a0postaven\u00fdch na MapReduce\u00a0modelu. Existuje velk\u00e9 mno\u017estv\u00ed\u00a0firem, kter\u00e9 nab\u00edzej\u00ed slu\u017eby zprost\u0159edkov\u00e1vaj\u00edc\u00ed vhled do dat pomoc\u00ed vizualizac\u00ed jednoduch\u00fdch statistik. K dispozici je i \u0159ada knihoven a framework\u016f umo\u017e\u0148uj\u00edc\u00edch vyvozovat z dat netrivi\u00e1ln\u00ed z\u00e1v\u011bry s vyu\u017eit\u00edm [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":86,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_exactmetrics_skip_tracking":false,"_exactmetrics_sitenote_active":false,"_exactmetrics_sitenote_note":"","_exactmetrics_sitenote_category":0,"footnotes":""},"categories":[3,4,2],"tags":[],"class_list":["post-38","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-analyza-dat","category-programovaci-jazyky","category-statistika"],"_links":{"self":[{"href":"https:\/\/www.mlguru.com\/cs\/wp-json\/wp\/v2\/posts\/38","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mlguru.com\/cs\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.mlguru.com\/cs\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.mlguru.com\/cs\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.mlguru.com\/cs\/wp-json\/wp\/v2\/comments?post=38"}],"version-history":[{"count":94,"href":"https:\/\/www.mlguru.com\/cs\/wp-json\/wp\/v2\/posts\/38\/revisions"}],"predecessor-version":[{"id":430,"href":"https:\/\/www.mlguru.com\/cs\/wp-json\/wp\/v2\/posts\/38\/revisions\/430"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mlguru.com\/cs\/wp-json\/wp\/v2\/media\/86"}],"wp:attachment":[{"href":"https:\/\/www.mlguru.com\/cs\/wp-json\/wp\/v2\/media?parent=38"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.mlguru.com\/cs\/wp-json\/wp\/v2\/categories?post=38"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.mlguru.com\/cs\/wp-json\/wp\/v2\/tags?post=38"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}