<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl">
	<id>http://brain.fuw.edu.pl/edu/index.php?action=history&amp;feed=atom&amp;title=Uczenie_maszynowe_i_sztuczne_sieci_neuronowe%2FWyk%C5%82ad_12</id>
	<title>Uczenie maszynowe i sztuczne sieci neuronowe/Wykład 12 - Historia wersji</title>
	<link rel="self" type="application/atom+xml" href="http://brain.fuw.edu.pl/edu/index.php?action=history&amp;feed=atom&amp;title=Uczenie_maszynowe_i_sztuczne_sieci_neuronowe%2FWyk%C5%82ad_12"/>
	<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Uczenie_maszynowe_i_sztuczne_sieci_neuronowe/Wyk%C5%82ad_12&amp;action=history"/>
	<updated>2026-05-04T01:44:49Z</updated>
	<subtitle>Historia wersji tej strony wiki</subtitle>
	<generator>MediaWiki 1.34.1</generator>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Uczenie_maszynowe_i_sztuczne_sieci_neuronowe/Wyk%C5%82ad_12&amp;diff=823&amp;oldid=prev</id>
		<title>Jarekz: /* Przykładowa implementacja kontrolera wahadła */</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Uczenie_maszynowe_i_sztuczne_sieci_neuronowe/Wyk%C5%82ad_12&amp;diff=823&amp;oldid=prev"/>
		<updated>2015-05-21T18:15:19Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Przykładowa implementacja kontrolera wahadła&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;pl&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;← poprzednia wersja&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;Wersja z 18:15, 21 maj 2015&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l198&quot; &gt;Linia 198:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Linia 198:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;===Przykładowa implementacja kontrolera wahadła===&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;===Przykładowa implementacja kontrolera wahadła===&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Poniższy przykład zaczerpnięto z: http://mechanistician.blogspot.com/2009/05/lec17-fitted-value-iteration_31.html:&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Poniższy przykład zaczerpnięto z: http://mechanistician.blogspot.com/2009/05/lec17-fitted-value-iteration_31.html:&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;source lang = &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;py&lt;/del&gt;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;source lang = &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;python&lt;/ins&gt;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;# -*- coding: utf-8 -*-&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;# -*- coding: utf-8 -*-&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;import matplotlib&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;import matplotlib&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Jarekz</name></author>
		
	</entry>
	<entry>
		<id>http://brain.fuw.edu.pl/edu/index.php?title=Uczenie_maszynowe_i_sztuczne_sieci_neuronowe/Wyk%C5%82ad_12&amp;diff=821&amp;oldid=prev</id>
		<title>Jarekz: Utworzono nową stronę &quot;==Uogólnienie koncepcji MDP na przypadki ciągłe==  Klasycznym przykładem problemu, który można sformułować w postaci ciągłego procesu decyzyjnego Markowa jest...&quot;</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Uczenie_maszynowe_i_sztuczne_sieci_neuronowe/Wyk%C5%82ad_12&amp;diff=821&amp;oldid=prev"/>
		<updated>2015-05-21T18:14:00Z</updated>

		<summary type="html">&lt;p&gt;Utworzono nową stronę &amp;quot;==Uogólnienie koncepcji MDP na przypadki ciągłe==  Klasycznym przykładem problemu, który można sformułować w postaci ciągłego procesu decyzyjnego Markowa jest...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nowa strona&lt;/b&gt;&lt;/p&gt;&lt;div&gt;==Uogólnienie koncepcji MDP na przypadki ciągłe==&lt;br /&gt;
&lt;br /&gt;
Klasycznym przykładem problemu, który można sformułować w postaci ciągłego procesu decyzyjnego Markowa jest sterowanie odwróconego wahadła. Możemy sobie wyobrazić, że mamy wózek o masie &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; który może poruszać się po 1-wymiarowym torze i na tym wózku na zawiasie o jednym stopniu swobody umieszczony jest nieważki pręt o długości &amp;lt;math&amp;gt;l&amp;lt;/math&amp;gt; na którego końcu znajduje się punktowa masa &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt;. Zadaniem naszym jest utrzymanie wahadła w pionie poprzez przykładanie do wózka odpowiedniej siły &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;.&lt;br /&gt;
Przestrzeń stanu dla tego problemu jest 4-wymiarowa, bo mamy &amp;lt;math&amp;gt;(x,\dot{x}, \theta , \dot{\theta })&amp;lt;/math&amp;gt;&lt;br /&gt;
[[Plik:Cart-pendulum.png]]&lt;br /&gt;
&lt;br /&gt;
Najprostszym pomysłem na zastosowanie do tego przykładu (lub podobnych) metod uczenia z wymuszaniem (RL) jest dyskretyzacja przestrzeni stanów i przestrzeni akcji i zastosowanie algorytmów typu iteracja funkcji wartościującej lub iteracja strategii. Pomysł ten napotyka w praktyce na bardzo poważny problem ze skalowaniem znany jako &amp;quot;klątwa wymiarów&amp;quot;. Polega ona na tym, że jeśli każdy z &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; wymiarów przestrzeni próbkujemy na &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; poziomów to otrzymujemy siatkę o &amp;lt;math&amp;gt;k^{n}&amp;lt;/math&amp;gt; węzłów. Widać zatem, że złożoność obliczeniowa będzie rosła wykładniczo z wymiarami przestrzeni.&lt;br /&gt;
&lt;br /&gt;
==Dyskretyzacja akcji==&lt;br /&gt;
&lt;br /&gt;
Zazwyczaj w interesujących problemach przestrzeń akcji jest mniej wymiarowa niż przestrzeń stanów (pomyślmy o tym, że sterowanie obiektami w wielu grach da się zrealizować za pomocą klawiszy strzałek).&lt;br /&gt;
&lt;br /&gt;
Zanim przejdziemy do konkretnego algorytmu, wprowadzimy najpierw koncepcję symulatora/modelu dla MDP. Model jest sposobem na opis &amp;lt;math&amp;gt;P_{sa}&amp;lt;/math&amp;gt;.&lt;br /&gt;
Zakładamy, że model to &amp;quot;czarna skrzynka&amp;quot; (kawałek kodu/program), która otrzymuje na wejściu stany i akcje a na wyjściu zwraca nowe stany.&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;(s,a) \rightarrow  [model] \rightarrow s'&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W naszym przykładzie z wahadłem modelem jest układ równań opisujących dynamikę wózka i wahadła:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\left( M + m \right) \ddot{x} - m \ell \ddot{\theta }\cos \theta + m \ell \dot{\theta }^2 \sin \theta = F&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\ell \ddot{\theta }- g \sin \theta = \ddot{x} \cos \theta &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Możemy go przepisać jako układ równań pierwszego rzędu w którym stan jest 4-wymiarowym wektorem:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;&lt;br /&gt;
s = \left[&lt;br /&gt;
\begin{array}{ccc}&lt;br /&gt;
x \\&lt;br /&gt;
\dot{x} \\&lt;br /&gt;
\theta \\&lt;br /&gt;
\dot{\theta }\end{array}&lt;br /&gt;
\right]&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nasz symulator mógłby działać np. rozwiązując ten układ równań metodą Eulera pierwszego rzędu:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;&lt;br /&gt;
s_{t+1} = s_{t} + \Delta t \dot{s}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jeśli nie umiemy wypisać równań dynamiki układu ale mamy fizyczny model i np. operatora tego modelu to można spróbować rozwiązać go przez obserwację wielu realizacji zachowania układu (model, operator), wg poniższego algorytmu:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	Obserwujemy &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; realizacji stanów i akcji, które doprowadziły do przejść między stanami:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt; s_{0}^{(1)}&lt;br /&gt;
\left.\begin{array}{c}a_{0}^{(1)} \\ \rightarrow \\ \end{array}\right.&lt;br /&gt;
s_{1}^{(1)}&lt;br /&gt;
\left.\begin{array}{c}a_{1}^{(1)} \\ \rightarrow \\ \end{array}\right.&lt;br /&gt;
s_{2}^{(1)}&lt;br /&gt;
\cdots \left.\begin{array}{c}a_{T-1}^{(1)} \\ \rightarrow \\ \end{array}\right.&lt;br /&gt;
s_{T}^{(1)}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt; \vdots &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt; s_{0}^{(m)}&lt;br /&gt;
\left.\begin{array}{c}a_{0}^{(m)} \\ \rightarrow \\ \end{array}\right.&lt;br /&gt;
s_{1}^{(m)}&lt;br /&gt;
\left.\begin{array}{c}a_{1}^{(m)} \\ \rightarrow \\ \end{array}\right.&lt;br /&gt;
s_{2}^{(m)}&lt;br /&gt;
\cdots \left.\begin{array}{c}a_{T-1}^{(m)} \\ \rightarrow \\ \end{array}\right.&lt;br /&gt;
s_{T}^{(m)}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Te realizacje dostarczają nam zbioru uczącego &amp;lt;math&amp;gt;\left\lbrace  (s_{t},a_{t}), s_{t+1}\right\rbrace &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	Za pomocą jednego z algorytmów uczenia z nauczycielem (np. regresja liniowa, regresja liniowa z jądrem, sieci warstwowe z algorytmem wstecznej propagacji błędów itd.) wytwarzamy przybliżenie odwzorowania&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;s_{t_+1} = f(s_{t},a_{t})&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dla ustalenia uwagi załóżmy, że w naszym przykładzie z wahadłem będzie to odwzorowanie liniowe postaci:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;s_{t+1} = A s_{t} + B a_{t}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; jest macierzą (&amp;lt;math&amp;gt;4 \times 4&amp;lt;/math&amp;gt;), zaś &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; jest wektorem (u nas 4 wymiarowym).&lt;br /&gt;
Zadaniem algorytmu uczącego byłoby wyznaczenie &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; takich, że:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;\arg \min _{A,B} \sum _{i=1}^{m}\sum _{t=0}^{T-1}||s_{t+1}^{(i)} - (A s_{t}^{(i)} +B a_{t}^{(i)})||^{2} &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	Teraz mamy dopasowany model, w wersji deterministycznej:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;s_{t+1} = As_{t} + Ba_{t}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Możemy też rozważać wersję stochastyczną postaci:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;s_{t+1} = As_{t} + Ba_{t} + \epsilon _{t}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\epsilon \sim N(0,\sigma ^{2})&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Estymacja funkcji wartościującej==&lt;br /&gt;
&lt;br /&gt;
W przypadku stanów dyskretnych podawaliśmy funkcję wartościującą &amp;lt;math&amp;gt;V(s)&amp;lt;/math&amp;gt; w postaci tablicy wartości: dla każdego stanu mieliśmy przypisaną jakąś liczbę. Funkcję &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt; można było znaleźć rozwiązując równania Bellmana (dla &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; stanów mieliśmy układ &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; równań liniowych z &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; niewiadomymi). W przypadku ciągłym nie da się zastosować tego podejścia bezpośrednio. Musimy dopasować jakąś funkcję ciągłą, która przybliżałaby &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;. Można zastosować podejście analogiczne jak przy regresji. Najpierw trzeba wybrać jakieś cechy &amp;lt;math&amp;gt;\phi (s)&amp;lt;/math&amp;gt;, którymi będziemy charakteryzować stan &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;. W najprostszym przypadku może to być sam stan: &amp;lt;math&amp;gt;\phi (s) = s&amp;lt;/math&amp;gt; (w przypadku wahadła &amp;lt;math&amp;gt;[x,\dot{x}, \theta , \dot{\theta }]^{T}&amp;lt;/math&amp;gt;). Ale może okazać się korzystne wzbogacenie wektora cech o jakieś dodatkowe składowe np.:&lt;br /&gt;
&amp;lt;math&amp;gt;\phi (s) = [1, x, \dot{x}, \dot{x} ^{2}, \theta x, \dot{\theta }^{2}, \dots ]^{T}&amp;lt;/math&amp;gt;&lt;br /&gt;
Wówczas funkcję wartościującą można przybliżyć przez:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;V(s) = \beta ^{T} \phi (s) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\beta &amp;lt;/math&amp;gt; to wektor parametrów regresji liniowej (Jest to równanie analogiczne do tego, które stosowaliśmy przy regresji liniowej &amp;lt;math&amp;gt;\rightarrow &amp;lt;/math&amp;gt; tam mieliśmy &amp;lt;math&amp;gt;y = h_{\theta }(x) = \theta ^{T} \phi (x)&amp;lt;/math&amp;gt;, tu żeby nie przeciążać notacji wektor parametrów regresji nazwaliśmy &amp;lt;math&amp;gt;\beta &amp;lt;/math&amp;gt;.)&lt;br /&gt;
&lt;br /&gt;
Przypomnijmy, że najważniejszym punktem algorytmu iteracji funkcji wartościującej było uaktualnianie funkcji wartości zgodnie z równaniem:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;V(s) = R(s) + \gamma \max _{a} \sum _{s^{\prime }} P_{sa}V(s^{\prime })&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
co bardziej ogólnie można wyrazić:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;V(s) = R(s) + \gamma \max _{a} E_{s^{\prime } \sim P_{sa}}[V(s^{\prime })]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Widać, że przejście do przypadku ciągłych stanów wymaga znalezienia sposobu wyznaczania wartości oczekiwanej: &amp;lt;math&amp;gt;E_{s^{\prime } \sim P_{sa}}[V(s^{\prime })]&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Po tym wstępie przyjrzyjmy się algorytmowi dopasowywanej funkcji wartościującej:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	Losowo próbkuj &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; stanów &amp;lt;math&amp;gt; s^{1}, s^{(2)}, \dots , s^{(m)} \in S&amp;lt;/math&amp;gt;&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	Inicjalizuj &amp;lt;math&amp;gt;\beta = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	Powtarzaj {&lt;br /&gt;
:Dla &amp;lt;math&amp;gt;i = 1, \dots , m \lbrace &amp;lt;/math&amp;gt;&lt;br /&gt;
::Dla każdej akcji &amp;lt;math&amp;gt;a \in A&amp;lt;/math&amp;gt; {&lt;br /&gt;
:::Próbkuj &amp;lt;math&amp;gt;s_{1}^{\prime }, s_{2}^{\prime }, \dots , s_{k}^{\prime } \sim P_{s^{(i)}a}&amp;lt;/math&amp;gt; (używając modelu/symulatora MDP)&lt;br /&gt;
:::przypisz &amp;lt;math&amp;gt;q(a) = \frac{1}{k} \sum _{j=1}^{k} R(s^{(i)}) + \gamma V(s_{j}^{\prime })&amp;lt;/math&amp;gt;&lt;br /&gt;
:::// wielkość &amp;lt;math&amp;gt;q(a)&amp;lt;/math&amp;gt; jest estymatorem &amp;lt;math&amp;gt;R(s) + \gamma E_{s^{\prime } \sim P_{sa}}[V(s^{\prime })]&amp;lt;/math&amp;gt;&lt;br /&gt;
:::}&lt;br /&gt;
::Przypisz &amp;lt;math&amp;gt;y^{(i)} = \max _{a} q(a)&amp;lt;/math&amp;gt;&lt;br /&gt;
::// tak obliczone &amp;lt;math&amp;gt;y^{(i)}&amp;lt;/math&amp;gt; jest estymatorem &amp;lt;math&amp;gt;R(s) + \gamma \max _{a} E_{s^{\prime } \sim P_{sa}}[V(s^{\prime })]&amp;lt;/math&amp;gt;&lt;br /&gt;
::}&lt;br /&gt;
&lt;br /&gt;
:// w wersji dyskretnej alg. iteracji f. wartościującej uaktualnialiśmy&lt;br /&gt;
://&amp;lt;math&amp;gt;V(s^{(i)}) = y^{(i)}&amp;lt;/math&amp;gt;&lt;br /&gt;
://w tym algorytmie, ponieważ &amp;lt;math&amp;gt;V(s)&amp;lt;/math&amp;gt; nie jest tablicą ale funkcją ciągłą&lt;br /&gt;
://dopasowujemy parametry f. wartościującej (jeśli jest liniowa to np. za pomocą regresji liniowej,&lt;br /&gt;
://można w tym kroku zastosować jakiś inny algorytm uczenia z nauczycielem)&lt;br /&gt;
:Przypisz &amp;lt;math&amp;gt;\beta = \arg \min _{\beta } \frac{1}{2} \sum _{i=1}^{m}(\beta ^{T} \phi (s^{(i)}) - y(i))^{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zauważmy, że w przypadku gdy model/symulator MDP jest deterministyczny to można uprościć powyższy algorytm kładąc &amp;lt;math&amp;gt;k=1&amp;lt;/math&amp;gt;. Jest tak ponieważ wartość oczekiwana w przypadku deterministycznym jest dokładnie równa wartości obliczonej jako &amp;lt;math&amp;gt;V(s^{\prime })&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;s^{\prime }&amp;lt;/math&amp;gt; jest jednoznaczne mając &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; i &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;). W przypadku stochastycznym trzeba empirycznie stwierdzić do jakich stanów &amp;lt;math&amp;gt;s^{\prime }&amp;lt;/math&amp;gt; przejdziemy i jaka jest średnia &amp;lt;math&amp;gt;V(s^{\prime })&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Jeśli chodzi o funkcję nagrody &amp;lt;math&amp;gt;R(s)&amp;lt;/math&amp;gt; zwykle ją zadajemy zgodnie z intuicją wynikającą z problemu. W przypadku wahadła można przyjąć np.:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt; R = \left\lbrace  \begin{array}{ r l}&lt;br /&gt;
-1 &amp;amp; \text{gdy wahadło się przewróci } \\&lt;br /&gt;
0 &amp;amp; \text{w przeciwnym razie}&lt;br /&gt;
\end{array} \right.&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Jak wyznaczyć strategię?===&lt;br /&gt;
&lt;br /&gt;
Algorytm estymowanej funkcji wartościującej oblicza przybliżoną postać funkcji &amp;lt;math&amp;gt;V^{*}&amp;lt;/math&amp;gt;. Akcje podejmujemy wtedy w następujący sposób:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;a = \arg \max _{a} E_{s^{\prime } \sim P_{sa} } [V(s^{\prime })]&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
W ogólnym przypadku stochastycznym dla policzenia wartości oczekiwanej w powyższym wzorze konieczne jest pobranie próbki stanów &amp;lt;math&amp;gt;s^{\prime } \sim P_{sa}&amp;lt;/math&amp;gt; i obliczenie wartości średniej &amp;lt;math&amp;gt;V(s^{\prime })&amp;lt;/math&amp;gt;. Istnieją jednak dwa ważne przypadki kiedy można uprościć obliczenia wartości oczekiwanej:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	dla modelu/symulator deterministycznego do obliczenia wartości oczekiwanej wystarczy wyliczyć &amp;lt;math&amp;gt;V(s^{\prime })&amp;lt;/math&amp;gt; i wybrać tą akcję, która prowadzi do stanu &amp;lt;math&amp;gt;s^{\prime }&amp;lt;/math&amp;gt; o największej funkcji wartościującej. Zatem mamy:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;a = \arg \max _{a} V(f(s,a))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;li&amp;gt;&lt;br /&gt;
	dla stochastycznego symulatora/modelu postaci:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;s_{t+1} = f(s_{t},a_{t}) + \epsilon _{t}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
gdzie &amp;lt;math&amp;gt;\epsilon _{t}&amp;lt;/math&amp;gt; jest próbką szumu gusowskiego &amp;lt;math&amp;gt;\sim N(0,\sigma ^{2})&amp;lt;/math&amp;gt;.&lt;br /&gt;
W tym przypadku można zastosować przybliżenie:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;E_{s^{\prime }\sim P_{sa}}[V^{*}(s^{\prime })] \approx V^{*}(E[s^{\prime }]) = V^{*}(f(s,a))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
I w tym przybliżeniu akcję wybieramy jako:&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;a = \arg \max _{a} V(f(s,a))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Np. w naszym przykładzie&lt;br /&gt;
&lt;br /&gt;
::&amp;lt;math&amp;gt;V^{*}(s) = \beta ^{T} \phi (s) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Przykładowa implementacja kontrolera wahadła===&lt;br /&gt;
Poniższy przykład zaczerpnięto z: http://mechanistician.blogspot.com/2009/05/lec17-fitted-value-iteration_31.html:&lt;br /&gt;
&amp;lt;source lang = py&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import matplotlib&lt;br /&gt;
matplotlib.use('TkAgg')&lt;br /&gt;
import sys&lt;br /&gt;
from pylab import *&lt;br /&gt;
from numpy import *&lt;br /&gt;
&lt;br /&gt;
#To add more artificial features just append them to feats.&lt;br /&gt;
def get_feat_vec(x,x_dot,theta,theta_dot):&lt;br /&gt;
    feats=[1.0,&lt;br /&gt;
           x,&lt;br /&gt;
           x_dot,&lt;br /&gt;
           theta,&lt;br /&gt;
           theta_dot,&lt;br /&gt;
           x_dot**2,&lt;br /&gt;
           theta_dot**2,&lt;br /&gt;
           theta*x]&lt;br /&gt;
    return array(feats).reshape(1,len(feats))&lt;br /&gt;
&lt;br /&gt;
#Displays the cart pole graph.&lt;br /&gt;
class show_cart_params: pass&lt;br /&gt;
show_cart_args=show_cart_params()&lt;br /&gt;
show_cart_args.first=True&lt;br /&gt;
show_cart_args.trial=0&lt;br /&gt;
def show_cart(x,x_dot,theta,theta_dot):&lt;br /&gt;
    figure(1)&lt;br /&gt;
    length=3&lt;br /&gt;
    x1=x&lt;br /&gt;
    y1=0&lt;br /&gt;
    x2=x+length*sin(theta)&lt;br /&gt;
    y2=length*cos(theta)&lt;br /&gt;
    cart_linex1,cart_liney1=[x-.4,x+.4],[-.25,-.25]&lt;br /&gt;
    cart_linex2,cart_liney2=[x+.4,x+.4],[-.25,0]&lt;br /&gt;
    cart_linex3,cart_liney3=[x+.4,x-.4],[0,0]&lt;br /&gt;
    cart_linex4,cart_liney4=[x-.4,x-.4],[0,-.25]&lt;br /&gt;
    base_linex,base_liney=[x,x],[-.5,-.25]&lt;br /&gt;
    axis([-3,3,-0.5,3.5])&lt;br /&gt;
    global show_cart_args&lt;br /&gt;
    &lt;br /&gt;
    if show_cart_args.first:&lt;br /&gt;
        show_cart_args.first=False &lt;br /&gt;
        show_cart_args.pend_line,=plot([x1,x2],[y1,y2],c='black')&lt;br /&gt;
        show_cart_args.cart_line1,=plot(cart_linex1,cart_liney1,c='cyan')&lt;br /&gt;
        show_cart_args.cart_line2,=plot(cart_linex2,cart_liney2,c='cyan')&lt;br /&gt;
        show_cart_args.cart_line3,=plot(cart_linex3,cart_liney3,c='cyan')&lt;br /&gt;
        show_cart_args.cart_line4,=plot(cart_linex4,cart_liney4,c='cyan')&lt;br /&gt;
        show_cart_args.base_line,=plot(base_linex,base_liney,c='cyan')&lt;br /&gt;
&lt;br /&gt;
    show_cart_args.pend_line.set_data([x1,x2],[y1,y2])&lt;br /&gt;
    show_cart_args.cart_line1.set_data(cart_linex1,cart_liney1)&lt;br /&gt;
    show_cart_args.cart_line2.set_data(cart_linex2,cart_liney2)&lt;br /&gt;
    show_cart_args.cart_line3.set_data(cart_linex3,cart_liney3)&lt;br /&gt;
    show_cart_args.cart_line4.set_data(cart_linex4,cart_liney4)&lt;br /&gt;
    show_cart_args.base_line.set_data(base_linex,base_liney)&lt;br /&gt;
    if show_cart_args.trial!=num_failures:&lt;br /&gt;
        title('trial #%d'%num_failures)&lt;br /&gt;
        show_cart_args.trial=num_failures&lt;br /&gt;
    draw()&lt;br /&gt;
&lt;br /&gt;
#Returns whether or not the system is out of bounds.&lt;br /&gt;
def is_terminal(x,theta):&lt;br /&gt;
    return -2.4&amp;gt;x or x&amp;gt;2.4 or -twelve_degrees&amp;gt;theta or theta&amp;gt;twelve_degrees&lt;br /&gt;
&lt;br /&gt;
#Simulates cart pole dynamics.&lt;br /&gt;
def cart_pole(action,x,x_dot,theta,theta_dot):   &lt;br /&gt;
    gravity=9.8&lt;br /&gt;
    masscart=1.0&lt;br /&gt;
    masspole=.3&lt;br /&gt;
    total_mass=masspole+masscart&lt;br /&gt;
    length=.7&lt;br /&gt;
    polemass_length=masspole*length&lt;br /&gt;
    force_mag=10.0&lt;br /&gt;
    tau=.02&lt;br /&gt;
    fourthirds=1.3333333333333&lt;br /&gt;
&lt;br /&gt;
    action_flip_prob=0.0&lt;br /&gt;
    force_noise_factor=0.0&lt;br /&gt;
    no_control_prob=0.0&lt;br /&gt;
&lt;br /&gt;
    if action_flip_prob&amp;gt;random.random():&lt;br /&gt;
        action=1-action&lt;br /&gt;
&lt;br /&gt;
    if action&amp;gt;0:&lt;br /&gt;
        force=force_mag&lt;br /&gt;
    else:&lt;br /&gt;
        force=-force_mag&lt;br /&gt;
&lt;br /&gt;
    force=force* \&lt;br /&gt;
           (1-force_noise_factor+random.random()*2*force_noise_factor)&lt;br /&gt;
&lt;br /&gt;
    if no_control_prob&amp;gt;random.random():&lt;br /&gt;
        force=0&lt;br /&gt;
&lt;br /&gt;
    costheta=cos(theta)&lt;br /&gt;
    sintheta=sin(theta)&lt;br /&gt;
&lt;br /&gt;
    temp=(force+polemass_length*theta_dot*theta_dot*sintheta)/total_mass&lt;br /&gt;
    thetaacc=(gravity*sintheta-costheta*temp)/(length*(fourthirds \&lt;br /&gt;
            -masspole*costheta*costheta/total_mass))&lt;br /&gt;
    xacc=temp-polemass_length*thetaacc*costheta/total_mass&lt;br /&gt;
&lt;br /&gt;
    new_x=x+tau*x_dot&lt;br /&gt;
    new_x_dot=x_dot+tau*xacc&lt;br /&gt;
    new_theta=theta+tau*theta_dot&lt;br /&gt;
    new_theta_dot=theta_dot+tau*thetaacc&lt;br /&gt;
&lt;br /&gt;
    return get_feat_vec(new_x,new_x_dot,new_theta,new_theta_dot)&lt;br /&gt;
&lt;br /&gt;
#################################################&lt;br /&gt;
#             Symulacja&lt;br /&gt;
#################################################&lt;br /&gt;
&lt;br /&gt;
gamma=0.995&lt;br /&gt;
feat_vec=get_feat_vec(0,0,0,0)&lt;br /&gt;
n=shape(feat_vec)[1]&lt;br /&gt;
twelve_degrees=0.2094384&lt;br /&gt;
m=100000&lt;br /&gt;
w_vec=zeros((n,1))&lt;br /&gt;
feat_mat=ones((m,n))&lt;br /&gt;
diff=sys.maxint&lt;br /&gt;
new_diff=diff-1&lt;br /&gt;
epochs=0&lt;br /&gt;
&lt;br /&gt;
#generate a bunch of state samples to fit the value function&lt;br /&gt;
x=random.uniform(-1.1,1.1);x_dot=0.0;theta=0.0;theta_dot=0.0&lt;br /&gt;
for i in range(m):&lt;br /&gt;
    if random.random()&amp;gt;.5:&lt;br /&gt;
        action=1&lt;br /&gt;
    else:&lt;br /&gt;
        action=0    &lt;br /&gt;
        &lt;br /&gt;
    feat_vec=cart_pole(action,x,x_dot,theta,theta_dot)&lt;br /&gt;
    feat_mat[i,:]=feat_vec&lt;br /&gt;
&lt;br /&gt;
    if is_terminal(feat_vec[0,1],feat_vec[0,3]):&lt;br /&gt;
        x=random.uniform(-1.1,1.1);x_dot=0.0&lt;br /&gt;
        theta=random.uniform(-twelve_degrees,twelve_degrees);theta_dot=0.0&lt;br /&gt;
    else:&lt;br /&gt;
        x=feat_vec[0,1];x_dot=feat_vec[0,2]&lt;br /&gt;
        theta=feat_vec[0,3];theta_dot=feat_vec[0,4]&lt;br /&gt;
&lt;br /&gt;
#Iteratively score each of the generated states and use the&lt;br /&gt;
#resulting feature,target tuple to estimate the parameters&lt;br /&gt;
#of a linear function.&lt;br /&gt;
while 10&amp;gt;epochs and diff&amp;gt;new_diff:&lt;br /&gt;
    diff=new_diff&lt;br /&gt;
    epochs+=1&lt;br /&gt;
&lt;br /&gt;
    y_vec=zeros((m,1))   &lt;br /&gt;
    for i in range(m):&lt;br /&gt;
        feat_vec=feat_mat[i,:].reshape(1,n)&lt;br /&gt;
        x=feat_vec[0,1];x_dot=feat_vec[0,2]&lt;br /&gt;
        theta=feat_vec[0,3];theta_dot=feat_vec[0,4]&lt;br /&gt;
&lt;br /&gt;
        # POBRANIE NAGRODY DLA AKTUALNEGO STANU&lt;br /&gt;
        if is_terminal(x,theta):&lt;br /&gt;
            R=-1.0&lt;br /&gt;
        else:&lt;br /&gt;
            R=0.0         &lt;br /&gt;
        &lt;br /&gt;
        # OBLICZENIE FUNKCJI WARTOŚCIUJĄCEJ DLA AKCJI = 0 &lt;br /&gt;
        feat_vec0=cart_pole(0,x,x_dot,theta,theta_dot)&lt;br /&gt;
        score1=R+gamma*dot(feat_vec0,w_vec)&lt;br /&gt;
        # OBLICZENIE FUNKCJI WARTOŚCIUJĄCEJ DLA AKCJI = 1 &lt;br /&gt;
        feat_vec1=cart_pole(1,x,x_dot,theta,theta_dot)&lt;br /&gt;
        score2=R+gamma*dot(feat_vec1,w_vec)&lt;br /&gt;
        &lt;br /&gt;
        if score1&amp;gt;score2:&lt;br /&gt;
            action=0&lt;br /&gt;
            score=score1&lt;br /&gt;
        elif score2&amp;gt;score1:&lt;br /&gt;
            action=1&lt;br /&gt;
            score=score2&lt;br /&gt;
        else:&lt;br /&gt;
            if random.random()&amp;gt;.5:&lt;br /&gt;
                action=1&lt;br /&gt;
                score=score2&lt;br /&gt;
            else:&lt;br /&gt;
                action=0&lt;br /&gt;
                score=score1&lt;br /&gt;
&lt;br /&gt;
        y_vec[i,0]=score&lt;br /&gt;
    &lt;br /&gt;
    result=linalg.lstsq(feat_mat,y_vec) # tu fitujemy model liniowy&lt;br /&gt;
    w_new=result[0]&lt;br /&gt;
    new_diff=result[1]&lt;br /&gt;
    w_vec=w_new+0#copy&lt;br /&gt;
&lt;br /&gt;
###### Ilustracja działania nauczonego kontrolera ##########&lt;br /&gt;
&lt;br /&gt;
ion()&lt;br /&gt;
time=0&lt;br /&gt;
time_steps_to_failure={}&lt;br /&gt;
num_failures=0&lt;br /&gt;
time_at_start_of_current_trial=0&lt;br /&gt;
x=random.uniform(-1.1,1.1);x_dot=0.0;theta=0.0;theta_dot=0.0&lt;br /&gt;
display_started=False&lt;br /&gt;
max_num_failures_to_run=250&lt;br /&gt;
&lt;br /&gt;
#Run the learned controller a few times to plot and compare&lt;br /&gt;
#against the discretized version.&lt;br /&gt;
while max_num_failures_to_run&amp;gt;num_failures:&lt;br /&gt;
    &lt;br /&gt;
    feat_vec0=cart_pole(0,x,x_dot,theta,theta_dot)&lt;br /&gt;
    score1=dot(feat_vec0,w_vec)&lt;br /&gt;
    &lt;br /&gt;
    feat_vec1=cart_pole(1,x,x_dot,theta,theta_dot)&lt;br /&gt;
    score2=dot(feat_vec1,w_vec)&lt;br /&gt;
    &lt;br /&gt;
    if score1&amp;gt;score2:&lt;br /&gt;
        action=0&lt;br /&gt;
    elif score2&amp;gt;score1:&lt;br /&gt;
        action=1&lt;br /&gt;
    else:&lt;br /&gt;
        if random.random()&amp;gt;.5:&lt;br /&gt;
            action=1&lt;br /&gt;
        else:&lt;br /&gt;
            action=0&lt;br /&gt;
&lt;br /&gt;
    feat_vec=cart_pole(action,x,x_dot,theta,theta_dot)&lt;br /&gt;
    x=feat_vec[0,1];x_dot=feat_vec[0,2]&lt;br /&gt;
    theta=feat_vec[0,3];theta_dot=feat_vec[0,4]&lt;br /&gt;
    time+=1&lt;br /&gt;
&lt;br /&gt;
    if display_started:&lt;br /&gt;
        show_cart(x,x_dot,theta,theta_dot)&lt;br /&gt;
&lt;br /&gt;
    if is_terminal(x,theta):&lt;br /&gt;
        num_failures+=1&lt;br /&gt;
        if num_failures&amp;gt;max_num_failures_to_run-2:&lt;br /&gt;
            display_started=True&lt;br /&gt;
&lt;br /&gt;
        time_steps_to_failure[num_failures]= \&lt;br /&gt;
            time-time_at_start_of_current_trial&lt;br /&gt;
        time_at_start_of_current_trial=time&lt;br /&gt;
&lt;br /&gt;
        x=random.uniform(-1.1,1.1);x_dot=0.0;theta=0.0;theta_dot=0.0&lt;br /&gt;
&lt;br /&gt;
#Plot learning curve:&lt;br /&gt;
figure(2)&lt;br /&gt;
plot(time_steps_to_failure.values(),'k')&lt;br /&gt;
title('Time steps per trial')&lt;br /&gt;
ioff()&lt;br /&gt;
show()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jarekz</name></author>
		
	</entry>
</feed>