<?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%2F%C4%86wiczenia_11</id>
	<title>Uczenie maszynowe i sztuczne sieci neuronowe/Ćwiczenia 11 - 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%2F%C4%86wiczenia_11"/>
	<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Uczenie_maszynowe_i_sztuczne_sieci_neuronowe/%C4%86wiczenia_11&amp;action=history"/>
	<updated>2026-05-03T19:53:07Z</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/%C4%86wiczenia_11&amp;diff=7657&amp;oldid=prev</id>
		<title>Jarekz o 17:19, 21 mar 2018</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Uczenie_maszynowe_i_sztuczne_sieci_neuronowe/%C4%86wiczenia_11&amp;diff=7657&amp;oldid=prev"/>
		<updated>2018-03-21T17:19:20Z</updated>

		<summary type="html">&lt;p&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 17:19, 21 mar 2018&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-l1&quot; &gt;Linia 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Linia 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&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;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[Uczenie_maszynowe_i_sztuczne_sieci_neuronowe_cw]]/Uczenie bez nadzoru&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&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;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&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;=Algorytm k-means=&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;=Algorytm k-means=&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;Algorytm k-means jest zaimplementowany w module &amp;lt;tt&amp;gt;scipy.cluster.vq&amp;lt;/tt&amp;gt; (vq: vector quantization) ([[http://docs.scipy.org/doc/scipy/reference/cluster.vq.html dokumentacja]]). Mamy tam funkcję  &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;Algorytm k-means jest zaimplementowany w module &amp;lt;tt&amp;gt;scipy.cluster.vq&amp;lt;/tt&amp;gt; (vq: vector quantization) ([[http://docs.scipy.org/doc/scipy/reference/cluster.vq.html dokumentacja]]). Mamy tam funkcję  &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/%C4%86wiczenia_11&amp;diff=844&amp;oldid=prev</id>
		<title>Jarekz: Utworzono nową stronę &quot;=Algorytm k-means= Algorytm k-means jest zaimplementowany w module &lt;tt&gt;scipy.cluster.vq&lt;/tt&gt; (vq: vector quantization) (http://docs.scipy.org/doc/scipy/reference/clust...&quot;</title>
		<link rel="alternate" type="text/html" href="http://brain.fuw.edu.pl/edu/index.php?title=Uczenie_maszynowe_i_sztuczne_sieci_neuronowe/%C4%86wiczenia_11&amp;diff=844&amp;oldid=prev"/>
		<updated>2015-05-21T18:49:12Z</updated>

		<summary type="html">&lt;p&gt;Utworzono nową stronę &amp;quot;=Algorytm k-means= Algorytm k-means jest zaimplementowany w module &amp;lt;tt&amp;gt;scipy.cluster.vq&amp;lt;/tt&amp;gt; (vq: vector quantization) (http://docs.scipy.org/doc/scipy/reference/clust...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nowa strona&lt;/b&gt;&lt;/p&gt;&lt;div&gt;=Algorytm k-means=&lt;br /&gt;
Algorytm k-means jest zaimplementowany w module &amp;lt;tt&amp;gt;scipy.cluster.vq&amp;lt;/tt&amp;gt; (vq: vector quantization) ([[http://docs.scipy.org/doc/scipy/reference/cluster.vq.html dokumentacja]]). Mamy tam funkcję &lt;br /&gt;
 &amp;lt;tt&amp;gt;kmeans(obs, k_or_guess, iter=20, thresh=1e-05)&amp;lt;/tt&amp;gt; &lt;br /&gt;
optymalizującą położenia centroidów, oraz pomocniczą funkcję&lt;br /&gt;
 &amp;lt;tt&amp;gt;vq&amp;lt;/tt&amp;gt;&lt;br /&gt;
przypisującą poszczególne obserwacje do skupisk reprezentowanych przez centroidy.&lt;br /&gt;
&lt;br /&gt;
Przed zapuszczeniem algorytmu k-means na danych dobrze jest przeskalować każdą z cech w macierzy wejściowej, tak aby miała jednostkową wariancję. Można to zrobić za pomoca funkcji &amp;lt;tt&amp;gt;whiten&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Przykładowy kod.===&lt;br /&gt;
Kod ten pokazuje jak:&lt;br /&gt;
* wygenerować symulowane dane&lt;br /&gt;
* przeskalować je, tak aby miały jednostkową wariancję w każdej z cech.&lt;br /&gt;
* podzielić je na dwa skupiska&lt;br /&gt;
* zilustrować wynik&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
from pylab import plot,show&lt;br /&gt;
from numpy import vstack,array&lt;br /&gt;
from numpy.random import rand&lt;br /&gt;
from scipy.cluster.vq import kmeans,vq,whiten&lt;br /&gt;
&lt;br /&gt;
# generujemy dane: &lt;br /&gt;
# - 150 dwuwymiarowych punktów z rozkładu jednorodnego ze średnią (1,1)&lt;br /&gt;
# - 150 dwuwymiarowych punktów z rozkładu jednorodnego ze średnią  (0.5,0.5)&lt;br /&gt;
&lt;br /&gt;
data = vstack((rand(150,2) + array([.5,.5]),rand(150,2)))&lt;br /&gt;
data =  whiten(data)&lt;br /&gt;
# policz K-Means dla  K = 2 (2 skupiska)&lt;br /&gt;
centroids,_ = kmeans(data,2)&lt;br /&gt;
# przypisz wektory wejściowe do skupisk&lt;br /&gt;
idx,_ = vq(data,centroids)&lt;br /&gt;
&lt;br /&gt;
# narysuj wyniki&lt;br /&gt;
plot(data[idx==0,0],data[idx==0,1],'ob',&lt;br /&gt;
     data[idx==1,0],data[idx==1,1],'or')&lt;br /&gt;
plot(centroids[:,0],centroids[:,1],'sg',markersize=8)&lt;br /&gt;
show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Segmentacja obrazu algorytmem k-means=&lt;br /&gt;
W tym ćwiczeniu zapoznamy się z zastosowaniem algorytmu analizy skupień do segmetacji obrazu. Segmentacja tegotypu może stanowic etap wstępnego przetwarzania na potrzeby np.  detekcji obiektów lub klasyfikacji.  W zadaniu tym zapoznamy sie także z metodą dobierania atumatycznie ilości skupisk.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Obrazek na którym będziemy pracować, proszę go zapisać w bieżącym katalogu:&lt;br /&gt;
&lt;br /&gt;
[[Plik:Skan.png]]&lt;br /&gt;
&lt;br /&gt;
Najpierw importujemy i oglądamy obrazek:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
from pylab import plot,show,figure,imshow,cm, imread, axis&lt;br /&gt;
import numpy as np&lt;br /&gt;
from scipy.cluster.vq import kmeans,vq&lt;br /&gt;
&lt;br /&gt;
im = imread('Skan.png')&lt;br /&gt;
# Oryginalny obrazek miał przestrzeń barwną RGB.&lt;br /&gt;
# Spłaszczamy przestrzeń barwną obrazka&lt;br /&gt;
im = im.mean(axis=2)&lt;br /&gt;
#oglądamy obrazek&lt;br /&gt;
imshow(im, cmap=cm.gray)&lt;br /&gt;
axis('off')&lt;br /&gt;
show()&lt;br /&gt;
imshow(im, cmap=cm.gray)&lt;br /&gt;
axis('off')&lt;br /&gt;
show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Teraz zamieniamy rysunek (dwuwymiarowa tablica 256x256) na wektor (o długości 256*256 )&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
data = im[:]&lt;br /&gt;
data.shape = 256*256,1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Teraz będziemy próbować podzielić ten wektor na skupiska (w liczbie od 2 do 9). &lt;br /&gt;
Dla każdej konkretnej ilości skupisk obliczamy dwie wielkości:&lt;br /&gt;
:&amp;lt;math&amp;gt;J_{intra}(K)&amp;lt;/math&amp;gt; - to jest miara odległości wewwnątrz centrów: [[Uczenie_maszynowe_i_sztuczne_sieci_neuronowe/Wykład_10#Algorytm_k-.C5.9Brednich: |równanie na J ]]&lt;br /&gt;
:&amp;lt;math&amp;gt;J_{inter}(K) = \min_{j&amp;lt;i} \sqrt{ (\mu_i -\mu_j)^T(\mu_i - \mu_j)} &amp;lt;/math&amp;gt; : to najmniejsza odległości między centrami &lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
K_max = 9&lt;br /&gt;
J_inter = np.ones(K_max)*1e16&lt;br /&gt;
J_intra = np.zeros(K_max)&lt;br /&gt;
centroids =[]&lt;br /&gt;
for K in range(2,K_max):&lt;br /&gt;
    trial =0&lt;br /&gt;
    while (len(centroids)&amp;lt;K)&amp;amp;(trial&amp;lt;20):&lt;br /&gt;
        centroids,J_intra[K] = kmeans(data,K)&lt;br /&gt;
        trial+=1&lt;br /&gt;
    print 'K: ',K, len(centroids)&lt;br /&gt;
    for ki in range(len(centroids)):&lt;br /&gt;
        for kj in range(ki):&lt;br /&gt;
            print ki, kj&lt;br /&gt;
            print centroids[ki]&lt;br /&gt;
            print centroids[kj]&lt;br /&gt;
            ################&lt;br /&gt;
## dopisz kod obliczający odległość między centrami i oznacz ją d&lt;br /&gt;
            ################&lt;br /&gt;
            # jeśli uzyskana odległość jest mniejsza niż dotychczas zapamiętana to ją zapamiętujemy:&lt;br /&gt;
            if J_inter[K]&amp;gt;d:&lt;br /&gt;
                J_inter[K]=d&lt;br /&gt;
    print K, J_intra[K],J_inter[K]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wykreślamy stosunek &amp;lt;math&amp;gt;,J_{intra}/J_{inter}&amp;lt;/math&amp;gt; i znajdujemy K dla którego jest najmniejszy:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
figure(1)&lt;br /&gt;
plot(range(2,K_max),J_intra[2:]/J_inter[2:])&lt;br /&gt;
K_opt = np.argmin(J_intra[2:]/J_inter[2:])+2&lt;br /&gt;
&lt;br /&gt;
print K_opt&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dla tej optymalnej ilości skupisk znajdujemy położenia centrów i przypisujemy klasę dla każdego punktu danych:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
centroids,J_intra[K] = kmeans(data,K_opt)&lt;br /&gt;
&lt;br /&gt;
# przypisujemy klasę&lt;br /&gt;
idx,_ = vq(data,centroids)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Formatujemy wektor w obrazek i podziwiamy efekt:&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
idx.shape = 256,256&lt;br /&gt;
figure(2)&lt;br /&gt;
imshow(idx, cmap=cm.gray)&lt;br /&gt;
&lt;br /&gt;
show()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Dla porównania proszę wykreślić histogram odcieni szarości dla wekotra &amp;lt;tt&amp;gt;data&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=Algorytm EM: implementacja =&lt;br /&gt;
W celu zapoznania się z [[Uczenie_maszynowe_i_sztuczne_sieci_neuronowe/Wykład_10#Algorytm_expectation_maximization_.28EM.29 |algorytmem EM]] zaimplementujemy go. &lt;br /&gt;
&lt;br /&gt;
Program, który powstanie po uzupełnieniu kodu powinien ilustrować dopasowywanie modelu EM do danych będzących sumą dwóch rozkładów gaussowskich:&lt;br /&gt;
&lt;br /&gt;
[[Plik:Gauss_mix.png]] &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Funkcje pomocnicze  ==&lt;br /&gt;
Najpierw standardowe importy i kilka funkcji pomocniczych: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
# -*- coding: utf-8 -*-&lt;br /&gt;
import matplotlib&lt;br /&gt;
matplotlib.use('TkAgg')&lt;br /&gt;
import pylab as py&lt;br /&gt;
import random, copy&lt;br /&gt;
import numpy as np&lt;br /&gt;
import sys&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def pnorm(x, m, s):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    Oblicza gęstość wielowymiarowego rozkładu normalnego dla punktów&lt;br /&gt;
    w wektorze x&lt;br /&gt;
    Parametry rozkładu :&lt;br /&gt;
    m - średnia&lt;br /&gt;
    s- macierz kowariancji&lt;br /&gt;
    dla zwiększenia czytelności kodu stosujemy typ matrix&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    xm = np.matrix(x-m)&lt;br /&gt;
    xmt = np.matrix(x-m).transpose()&lt;br /&gt;
    for i in xrange(len(s)): # zabezpieczenie dla większej stabliności numerycznej&lt;br /&gt;
        if s[i,i] &amp;lt;= sys.float_info[3]: # min float&lt;br /&gt;
            s[i,i] = sys.float_info[3]&lt;br /&gt;
    sinv = np.linalg.inv(s)&lt;br /&gt;
&lt;br /&gt;
    return (2.0*np.pi)**(-len(x)/2.0)*(1.0/np.sqrt(np.linalg.det(s)))\&lt;br /&gt;
            *np.exp(-0.5*(xm*sinv*xmt))&lt;br /&gt;
&lt;br /&gt;
def draw_params(t,nbclusters):&lt;br /&gt;
        '''funkcja do losowania parametrów początkowych&lt;br /&gt;
        t - zbiór treningowy&lt;br /&gt;
        '''&lt;br /&gt;
        nbobs,nbfeatures = t.shape&lt;br /&gt;
        # inicjuje średnie przez losowanie punktu ze zbioru danych&lt;br /&gt;
        tmpmu = np.array([t[random.uniform(0,nbobs),:]],np.float64)&lt;br /&gt;
        # kowariancje inicjowane są jako macierze diagonalne , wariancja dla każdej cechy inicjowana jest jako wariancja tej cechy dla całego zbioru &lt;br /&gt;
        sigma = np.zeros((nbfeatures,nbfeatures))&lt;br /&gt;
        for f in range(nbfeatures):&lt;br /&gt;
            sigma[f,f] = np.var(t[:,f])&lt;br /&gt;
        #phi inicjujemy tak, że każda składowa mieszanki ma takie samee prawdopodobieństwo&lt;br /&gt;
        phi = 1.0/nbclusters&lt;br /&gt;
        print 'INIT:',tmpmu,sigma,phi&lt;br /&gt;
        return {'mu': tmpmu,\&lt;br /&gt;
                'sigma': sigma,\&lt;br /&gt;
                'phi': phi}&lt;br /&gt;
&lt;br /&gt;
def plot_gauss(mu,sigma):&lt;br /&gt;
    ''' Funkcja rysująca kontury funkcji gęstości prawdopodobieństwa &lt;br /&gt;
       dwuwymiarowego rozkładu Gaussa'''&lt;br /&gt;
&lt;br /&gt;
    x = np.arange(-6.0, 6.0001, 0.1)&lt;br /&gt;
    y = np.arange(-6.0, 6.0001, 0.1)&lt;br /&gt;
    X,Y = np.meshgrid(x, y)&lt;br /&gt;
    X.shape = 1,len(x)*len(y)&lt;br /&gt;
    Y.shape = 1,len(x)*len(y)&lt;br /&gt;
    P = np.vstack((X,Y))&lt;br /&gt;
    invS = np.linalg.inv(sigma)&lt;br /&gt;
    R = P.T-mu&lt;br /&gt;
    z = np.zeros(len(R))&lt;br /&gt;
    for i in range(len(R)):&lt;br /&gt;
        z[i] = np.exp(-0.5*np.dot( R[i,:].T,np.dot(invS,R[i,:])))&lt;br /&gt;
        &lt;br /&gt;
    z.shape = len(x),len(y)&lt;br /&gt;
    py.contourf(x,y,z,alpha = 0.5)&lt;br /&gt;
    py.plot(mu[0],mu[1],'o')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Szkielet algorytmu ==&lt;br /&gt;
Poniższy kod to szkielet właściwej funkcji wykonującej optymalizację. Trzeba go uzupełnić implementując równania z [[Uczenie_maszynowe_i_sztuczne_sieci_neuronowe/Wykład_10#Algorytm_expectation_maximization_.28EM.29 |wykładu]]. Proszę uważnie czytać komentarze. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
def expectation_maximization(t, nbclusters=2, nbiter=3, normalize=False,\&lt;br /&gt;
        epsilon=0.001, monotony=False, datasetinit=True):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    t - zbiór treningowy, &lt;br /&gt;
    Każdy wiersz t jest przykładem (obserwacją), każda kolumna to cecha &lt;br /&gt;
    'nbclusters' ilość klastrów, z których budujemy model mieszany&lt;br /&gt;
    'nbiter' ilość iteracji&lt;br /&gt;
    'epsilon' kryterium zbieżności&lt;br /&gt;
   &lt;br /&gt;
     Powtórz kroki E i M aż do spełnienia warunku |E_t - E_{t-1}| &amp;lt; ε&lt;br /&gt;
     &lt;br /&gt;
    Funkcja zwraca parametry modelu (centra i macerze kowariancji Gaussów i ich wagi \phi) oraz &lt;br /&gt;
    etykiety punktów zbioru treningowego oznaczające do którego z Gaussów w modelowanej mieszance należą.&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    nbobs,nbfeatures = t.shape&lt;br /&gt;
   &lt;br /&gt;
    ### Opcjonalna normalizacja&lt;br /&gt;
    if normalize:&lt;br /&gt;
        for f in xrange(nbfeatures):&lt;br /&gt;
            t[:,f] /= np.std(t[:,f])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    result = {}&lt;br /&gt;
    random.seed()&lt;br /&gt;
&lt;br /&gt;
    # szykujemy tablice na prawdopodobieństwa warunowe&lt;br /&gt;
    Pz = np.zeros((nbobs,nbclusters)) # P(z|x): opisywane równaniami (2) i (3) z wykładu &lt;br /&gt;
    Px = np.zeros((nbobs,nbclusters)) # P(x|z): opisywane równaniem (4)  &lt;br /&gt;
    &lt;br /&gt;
    # inicjujemy parametry dla każdego składnika mieszankni&lt;br /&gt;
    # params będzie listą taką, że params[i] to słownik&lt;br /&gt;
    # zawierający parametry i-tego składnika mieszanki&lt;br /&gt;
    params = []&lt;br /&gt;
    for i in xrange(nbclusters):&lt;br /&gt;
        params.append( draw_params(t,nbclusters) )&lt;br /&gt;
&lt;br /&gt;
    old_log_estimate = sys.maxint                   # init&lt;br /&gt;
    log_estimate = sys.maxint/2 + epsilon      # init&lt;br /&gt;
    estimation_round = 0    &lt;br /&gt;
&lt;br /&gt;
    # powtarzaj aż zbiegniesz &lt;br /&gt;
    while (abs(log_estimate - old_log_estimate) &amp;gt; epsilon\&lt;br /&gt;
                and (not monotony or log_estimate &amp;lt; old_log_estimate)):&lt;br /&gt;
        restart = False&lt;br /&gt;
        old_log_estimate = log_estimate   &lt;br /&gt;
        ########################################################&lt;br /&gt;
        # krok E: oblicz Pz dla każdego przykładu (czyli w oznaczeniach z wykładu w_i^j)&lt;br /&gt;
        ########################################################&lt;br /&gt;
        # obliczamy prawdopodobieństwa  Px[j,i] = P(x_j|z_j=i)  &lt;br /&gt;
        for j in xrange(nbobs): # iterujemy po przykładach&lt;br /&gt;
            for i in xrange(nbclusters): # iterujemy po składnikach&lt;br /&gt;
                Px[j,i] = pnorm(t[j,:], params[i]['mu'], params[i]['sigma']) #  (równanie 4)&lt;br /&gt;
&lt;br /&gt;
        #  obliczamy prawdopodobieństwa Pz[j,i] = P(z_j=i|x_j)   &lt;br /&gt;
        #  najpierw licznik równania (3)   &lt;br /&gt;
        for j in xrange(nbobs): &lt;br /&gt;
            for i in xrange(nbclusters):&lt;br /&gt;
                Pz[j,i] = .............*params[i]['phi']&lt;br /&gt;
        #  mianownik równania (3)&lt;br /&gt;
        for j in xrange(nbobs): &lt;br /&gt;
            tmpSum = 0.0&lt;br /&gt;
            for i in xrange(nbclusters):&lt;br /&gt;
                tmpSum += ..................&lt;br /&gt;
        # składamy w całość Pz[j,i] = P(z_j=i|x_j)&lt;br /&gt;
            Pz[j,:] /= tmpSum&lt;br /&gt;
        &lt;br /&gt;
        ###########################################################&lt;br /&gt;
        # krok M: uaktualnij paramertry (sets {mu, sigma, phi}) #&lt;br /&gt;
        ###########################################################&lt;br /&gt;
        #print &amp;quot;iter:&amp;quot;, iteration, &amp;quot; estimation#:&amp;quot;, estimation_round,\&lt;br /&gt;
        #            &amp;quot; params:&amp;quot;, params&lt;br /&gt;
        for i in xrange(nbclusters):&lt;br /&gt;
            print &amp;quot;------------------&amp;quot;&lt;br /&gt;
            # parametr phi: równanie (6)&lt;br /&gt;
            Sum_w = np.sum(Pz[:,i])&lt;br /&gt;
            params[i]['phi'] = Sum_w/nbobs&lt;br /&gt;
            if params[i]['phi'] &amp;lt;= 1.0/nbobs:           # restartujemy jeśli zanika nam któraś składowa mieszanki&lt;br /&gt;
                restart = True                          &lt;br /&gt;
                print &amp;quot;Restarting, p:&amp;quot;,params[i]['phi'] &lt;br /&gt;
                break&lt;br /&gt;
            print 'i: ',i,' phi: ', params[i]['phi']&lt;br /&gt;
            # średnia: równanie (7)&lt;br /&gt;
            m = np.zeros(nbfeatures)&lt;br /&gt;
            for j in xrange(nbobs):&lt;br /&gt;
                m += ......................&lt;br /&gt;
            params[i]['mu'] = m/Sum_w&lt;br /&gt;
            print 'i: ',i,' mu: ', params[i]['mu']&lt;br /&gt;
            &lt;br /&gt;
            # macierz kowariancji: równanie (8)&lt;br /&gt;
            s = np.matrix(np.zeros((nbfeatures,nbfeatures)))&lt;br /&gt;
            for j in xrange(nbobs):&lt;br /&gt;
                roznica = np.matrix(t[j,:]-params[i]['mu'])&lt;br /&gt;
                s += Pz[j,i]*(roznica.T*roznica)&lt;br /&gt;
            params[i]['sigma'] = s/Sum_w&lt;br /&gt;
            &lt;br /&gt;
            print params[i]['sigma']&lt;br /&gt;
            &lt;br /&gt;
            ### Testujemy czy składniki się nie sklejają i w razie potrzeby restartujemy&lt;br /&gt;
            if not restart:&lt;br /&gt;
                restart = True&lt;br /&gt;
                for i in xrange(1,nbclusters):&lt;br /&gt;
                    if not np.allclose(params[i]['mu'], params[i-1]['mu'])\&lt;br /&gt;
                    or not np.allclose(params[i]['sigma'], params[i-1]['sigma']):&lt;br /&gt;
                        restart = False&lt;br /&gt;
                        break&lt;br /&gt;
            if restart:                &lt;br /&gt;
                old_log_estimate = sys.maxint                 # init&lt;br /&gt;
                log_estimate = sys.maxint/2 + epsilon    # init&lt;br /&gt;
                params = [draw_params(t,nbclusters) for i in xrange(nbclusters)] # losujemy nowe parametry startowe&lt;br /&gt;
                print 'RESTART'&lt;br /&gt;
                continue&lt;br /&gt;
            &lt;br /&gt;
            &lt;br /&gt;
            ####################################&lt;br /&gt;
            # liczymy estymatę log wiarygodności: równaie (1)  #&lt;br /&gt;
            ####################################&lt;br /&gt;
            log_estimate = np.sum([np.log(np.sum(\&lt;br /&gt;
                    [Px[j,i]*params[i]['phi'] for i in xrange(nbclusters)]))\&lt;br /&gt;
                    for j in xrange(nbobs)])&lt;br /&gt;
            print &amp;quot;(EM) poprzednia i aktualna estymata log wiarygodności: &amp;quot;,\&lt;br /&gt;
                    old_log_estimate, log_estimate&lt;br /&gt;
            estimation_round += 1&lt;br /&gt;
        ##########################&lt;br /&gt;
        #  rysujemy aktualny stan modelu&lt;br /&gt;
        ##########################&lt;br /&gt;
        py.ioff()&lt;br /&gt;
        py.clf()&lt;br /&gt;
        py.ion()&lt;br /&gt;
        for i in xrange(nbclusters):&lt;br /&gt;
            plot_gauss(np.array(params[i]['mu']),np.array(params[i]['sigma']))&lt;br /&gt;
        py.plot(x[:,0],x[:,1],'g.')&lt;br /&gt;
        py.axis('equal')&lt;br /&gt;
        py.draw()&lt;br /&gt;
 &lt;br /&gt;
        &lt;br /&gt;
        # Pakujemy wyniki&lt;br /&gt;
            result['quality'] = -log_estimate&lt;br /&gt;
            result['params'] = copy.deepcopy(params)&lt;br /&gt;
            result['clusters'] = [[o for o in xrange(nbobs)\&lt;br /&gt;
                    if Px[o,c] == max(Px[o,:])]\&lt;br /&gt;
                    for c in xrange(nbclusters)]&lt;br /&gt;
    return result&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
def expectation_maximization(t, nbclusters=2, nbiter=3, normalize=False,\&lt;br /&gt;
        epsilon=0.001, monotony=False, datasetinit=True):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    t - zbiór treningowy, &lt;br /&gt;
    Każdy wiersz t jest przykładem (obserwacją), każda kolumna to cecha &lt;br /&gt;
    'nbclusters' ilość klastrów, z których budujemy model mieszany&lt;br /&gt;
    'nbiter' ilość iteracji&lt;br /&gt;
    'epsilon' kryterium zbieżności&lt;br /&gt;
   &lt;br /&gt;
     Powtórz kroki E i M aż do spełnienia warunku |E_t - E_{t-1}| &amp;lt; ε&lt;br /&gt;
     &lt;br /&gt;
    Funkcja zwraca parametry modelu (centra i macerze kowariancji Gaussów i ich wagi \phi) oraz &lt;br /&gt;
    etykiety punktów zbioru treningowego oznaczające do którego z Gaussów w modelowanej mieszance należą.&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    nbobs,nbfeatures = t.shape&lt;br /&gt;
   &lt;br /&gt;
    ### Opcjonalna normalizacja&lt;br /&gt;
    if normalize:&lt;br /&gt;
        for f in xrange(nbfeatures):&lt;br /&gt;
            t[:,f] /= np.std(t[:,f])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    result = {}&lt;br /&gt;
    quality = 0.0 # suma odległości od centrów&lt;br /&gt;
    random.seed()&lt;br /&gt;
&lt;br /&gt;
    # szykujemy tablice na prawdopodobieństwa warunowe&lt;br /&gt;
    Pz = np.zeros((nbobs,nbclusters)) # P(z|x): opisywane równaniami (2) i (3) z wykładu &lt;br /&gt;
    Px = np.zeros((nbobs,nbclusters)) # P(x|z): opisywane równaniem (4)  &lt;br /&gt;
    &lt;br /&gt;
    # inicjujemy parametry dla każdego składnika mieszankni&lt;br /&gt;
    # params będzie listą taką, że params[i] to słownik&lt;br /&gt;
    # zawierający parametry i-tego składnika mieszanki&lt;br /&gt;
    params = []&lt;br /&gt;
    for i in xrange(nbclusters):&lt;br /&gt;
        params.append( draw_params(t,nbclusters) )&lt;br /&gt;
&lt;br /&gt;
    old_log_estimate = sys.maxint                   # init&lt;br /&gt;
    log_estimate = sys.maxint/2 + epsilon      # init&lt;br /&gt;
    estimation_round = 0    &lt;br /&gt;
&lt;br /&gt;
    # powtarzaj aż zbiegniesz &lt;br /&gt;
    while (abs(log_estimate - old_log_estimate) &amp;gt; epsilon\&lt;br /&gt;
                and (not monotony or log_estimate &amp;lt; old_log_estimate)):&lt;br /&gt;
        restart = False&lt;br /&gt;
        old_log_estimate = log_estimate   &lt;br /&gt;
        ########################################################&lt;br /&gt;
        # krok E: oblicz Pz dla każdego przykładu (czyli w oznaczeniach z wykładu w_i^j)&lt;br /&gt;
        ########################################################&lt;br /&gt;
        # obliczamy prawdopodobieństwa  Px[j,i] = P(x_j|z_j=i)  &lt;br /&gt;
        for j in xrange(nbobs): # iterujemy po przykładach&lt;br /&gt;
            for i in xrange(nbclusters): # iterujemy po składnikach&lt;br /&gt;
                Px[j,i] = pnorm(t[j,:], params[i]['mu'], params[i]['sigma']) #  (równanie 4)&lt;br /&gt;
&lt;br /&gt;
        #  obliczamy prawdopodobieństwa Pz[j,i] = P(z_j=i|x_j)      &lt;br /&gt;
        for j in xrange(nbobs): # licznik równania (3)&lt;br /&gt;
            for i in xrange(nbclusters):&lt;br /&gt;
                Pz[j,i] = Px[j,i]*params[i]['phi']&lt;br /&gt;
        for j in xrange(nbobs): # mianownik&lt;br /&gt;
            tmpSum = 0.0&lt;br /&gt;
            for i in xrange(nbclusters):&lt;br /&gt;
                tmpSum += params[i]['phi']*Px[j,i]&lt;br /&gt;
        # składamy w całość Pz[j,i] = P(z_j=i|x_j)&lt;br /&gt;
            Pz[j,:] /= tmpSum&lt;br /&gt;
        &lt;br /&gt;
        ###########################################################&lt;br /&gt;
        # krok M: uaktualnij paramertry (sets {mu, sigma, phi}) #&lt;br /&gt;
        ###########################################################&lt;br /&gt;
        #print &amp;quot;iter:&amp;quot;, iteration, &amp;quot; estimation#:&amp;quot;, estimation_round,\&lt;br /&gt;
        #            &amp;quot; params:&amp;quot;, params&lt;br /&gt;
        for i in xrange(nbclusters):&lt;br /&gt;
            print &amp;quot;------------------&amp;quot;&lt;br /&gt;
            # parametr phi&lt;br /&gt;
            Sum_w = np.sum(Pz[:,i])&lt;br /&gt;
            params[i]['phi'] = Sum_w/nbobs&lt;br /&gt;
            if params[i]['phi'] &amp;lt;= 1.0/nbobs:           # restartujemy jeśli zanika nam któraś składowa mieszanki&lt;br /&gt;
                restart = True                          &lt;br /&gt;
                print &amp;quot;Restarting, p:&amp;quot;,params[i]['phi'] &lt;br /&gt;
                break&lt;br /&gt;
            print 'i: ',i,' phi: ', params[i]['phi']&lt;br /&gt;
            # średnia&lt;br /&gt;
            m = np.zeros(nbfeatures)&lt;br /&gt;
            for j in xrange(nbobs):&lt;br /&gt;
                m += Pz[j,i]*t[j,:]&lt;br /&gt;
            params[i]['mu'] = m/Sum_w&lt;br /&gt;
            print 'i: ',i,' mu: ', params[i]['mu']&lt;br /&gt;
            &lt;br /&gt;
            # macierz kowariancji&lt;br /&gt;
            s = np.matrix(np.zeros((nbfeatures,nbfeatures)))&lt;br /&gt;
            for j in xrange(nbobs):&lt;br /&gt;
                roznica = np.matrix(t[j,:]-params[i]['mu'])&lt;br /&gt;
                s += Pz[j,i]*(roznica.T*roznica)&lt;br /&gt;
            params[i]['sigma'] = s/Sum_w&lt;br /&gt;
            &lt;br /&gt;
            print params[i]['sigma']&lt;br /&gt;
            &lt;br /&gt;
            ### Test bound conditions and restart consequently if needed&lt;br /&gt;
            if not restart:&lt;br /&gt;
                restart = True&lt;br /&gt;
                for i in xrange(1,nbclusters):&lt;br /&gt;
                    if not np.allclose(params[i]['mu'], params[i-1]['mu'])\&lt;br /&gt;
                    or not np.allclose(params[i]['sigma'], params[i-1]['sigma']):&lt;br /&gt;
                        restart = False&lt;br /&gt;
                        break&lt;br /&gt;
            if restart:                # restart if all converges to only&lt;br /&gt;
                old_log_estimate = sys.maxint          # init, not true/real&lt;br /&gt;
                log_estimate = sys.maxint/2 + epsilon # init, not true/real&lt;br /&gt;
                params = [draw_params(t,nbclusters) for i in xrange(nbclusters)]&lt;br /&gt;
                print 'RESTART'&lt;br /&gt;
                continue&lt;br /&gt;
            ### /Test bound conditions and restart&lt;br /&gt;
            &lt;br /&gt;
            ####################################&lt;br /&gt;
            # Step 4: compute the log estimate #&lt;br /&gt;
            ####################################&lt;br /&gt;
            log_estimate = np.sum([np.log(np.sum(\&lt;br /&gt;
                    [Px[j,i]*params[i]['phi'] for i in xrange(nbclusters)]))\&lt;br /&gt;
                    for j in xrange(nbobs)])&lt;br /&gt;
            print &amp;quot;(EM) old and new log estimate: &amp;quot;,\&lt;br /&gt;
                    old_log_estimate, log_estimate&lt;br /&gt;
            estimation_round += 1&lt;br /&gt;
        ##########################&lt;br /&gt;
        # plot the results&lt;br /&gt;
        ##########################&lt;br /&gt;
        py.ioff()&lt;br /&gt;
        py.clf()&lt;br /&gt;
        py.ion()&lt;br /&gt;
        for i in xrange(nbclusters):&lt;br /&gt;
            plot_gauss(np.array(params[i]['mu']),np.array(params[i]['sigma']))&lt;br /&gt;
        py.plot(x[:,0],x[:,1],'g.')&lt;br /&gt;
        py.axis('equal')&lt;br /&gt;
        py.draw()&lt;br /&gt;
 &lt;br /&gt;
        &lt;br /&gt;
        # Pick/save the best clustering as the final result&lt;br /&gt;
        quality = -log_estimate&lt;br /&gt;
        if not quality in result or quality &amp;gt; result['quality']:&lt;br /&gt;
            result['quality'] = quality&lt;br /&gt;
            result['params'] = copy.deepcopy(params)&lt;br /&gt;
            result['clusters'] = [[o for o in xrange(nbobs)\&lt;br /&gt;
                    if Px[o,c] == max(Px[o,:])]\&lt;br /&gt;
                    for c in xrange(nbclusters)]&lt;br /&gt;
    return result&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Program==&lt;br /&gt;
Przykładowy program korzystający z powyższych funkcji:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
&lt;br /&gt;
##########################################&lt;br /&gt;
#   PROGRAM&lt;br /&gt;
#########################################&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# robimy mieszankę dwóch gaussów:&lt;br /&gt;
#parametry rozkładu&lt;br /&gt;
# wektor średnich:&lt;br /&gt;
mu1 = [-2,-3] &lt;br /&gt;
# macierz kowariancji:&lt;br /&gt;
Sigma1 = np.array([[1, 0.5],&lt;br /&gt;
                  [0.5, 1]])&lt;br /&gt;
# generujemy dane: &lt;br /&gt;
x1 = np.random.multivariate_normal(mu1, Sigma1, 150) #&lt;br /&gt;
mu2 = [-0.5,2] &lt;br /&gt;
# macierz kowariancji:&lt;br /&gt;
Sigma2 = np.array([[3, 0.5],&lt;br /&gt;
                  [0.5, 1]])&lt;br /&gt;
# generujemy dane: &lt;br /&gt;
x2 = np.random.multivariate_normal(mu2, Sigma2, 150) #&lt;br /&gt;
# łączymy x1 i x2 aby otrzymac jeden zbiór&lt;br /&gt;
x = np.vstack((x1,x2))&lt;br /&gt;
py.plot(x[:,0],x[:,1],'g.')&lt;br /&gt;
py.axis('equal')&lt;br /&gt;
py.show()&lt;br /&gt;
py.figure()&lt;br /&gt;
res = expectation_maximization(x, nbclusters=2, nbiter=3, normalize=False,\&lt;br /&gt;
        epsilon=0.001, monotony=False, datasetinit=True)&lt;br /&gt;
py.ioff()&lt;br /&gt;
py.show()&lt;br /&gt;
# wypisz parametry&lt;br /&gt;
print 'Dopasowany model: '&lt;br /&gt;
print res['params']&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aby obliczyć gęstość prawdopodobieństwa rozkładu mieszanego dla pewnego nowego punktu &amp;quot;x&amp;quot; możemy zastosować poniższą funkcję: &lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
def prob_mix(params, x):&lt;br /&gt;
    '''params - parametry dopasowanego gaussowskiego modelu mieszanego&lt;br /&gt;
    x - punkt wejścowy,&lt;br /&gt;
    &lt;br /&gt;
    funkcja zwraca gestość prawdopodobieństwa, dla x w rozkładzie mieszanym&lt;br /&gt;
    '''&lt;br /&gt;
    prob = 0&lt;br /&gt;
    for i in range(len(params)):&lt;br /&gt;
        prob+= pnorm(x, params[i]['mu'], params[i]['sigma']) * params[i]['phi']&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    return prob&lt;br /&gt;
#---------------- przykładowe użycie: ----------------&lt;br /&gt;
x=(6,-4)&lt;br /&gt;
print 'P(x=(',str(x),')):', prob_mix(res['params'], x)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang = python&amp;gt;&lt;br /&gt;
def expectation_maximization(t, nbclusters=2, nbiter=3, normalize=False,\&lt;br /&gt;
        epsilon=0.001, monotony=False, datasetinit=True):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    t - zbiór treningowy, &lt;br /&gt;
    Każdy wiersz t jest przykładem (obserwacją), każda kolumna to cecha &lt;br /&gt;
    'nbclusters' ilość klastrów, z których budujemy model mieszany&lt;br /&gt;
    'nbiter' ilość iteracji&lt;br /&gt;
    'epsilon' kryterium zbieżności&lt;br /&gt;
   &lt;br /&gt;
     Powtórz kroki E i M aż do spełnienia warunku |E_t - E_{t-1}| &amp;lt; ε&lt;br /&gt;
     &lt;br /&gt;
    Funkcja zwraca parametry modelu (centra i macerze kowariancji Gaussów i ich wagi \phi) oraz &lt;br /&gt;
    etykiety punktów zbioru treningowego oznaczające do którego z Gaussów w modelowanej mieszance należą.&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    nbobs,nbfeatures = t.shape&lt;br /&gt;
   &lt;br /&gt;
    ### Opcjonalna normalizacja&lt;br /&gt;
    if normalize:&lt;br /&gt;
        for f in xrange(nbfeatures):&lt;br /&gt;
            t[:,f] /= np.std(t[:,f])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    result = {}&lt;br /&gt;
    quality = 0.0 # suma odległości od centrów&lt;br /&gt;
    random.seed()&lt;br /&gt;
&lt;br /&gt;
    # szykujemy tablice na prawdopodobieństwa warunowe&lt;br /&gt;
    Pz = np.zeros((nbobs,nbclusters)) # P(z|x): opisywane równaniami (2) i (3) z wykładu &lt;br /&gt;
    Px = np.zeros((nbobs,nbclusters)) # P(x|z): opisywane równaniem (4)  &lt;br /&gt;
    &lt;br /&gt;
    # inicjujemy parametry dla każdego składnika mieszankni&lt;br /&gt;
    # params będzie listą taką, że params[i] to słownik&lt;br /&gt;
    # zawierający parametry i-tego składnika mieszanki&lt;br /&gt;
    params = []&lt;br /&gt;
    for i in xrange(nbclusters):&lt;br /&gt;
        params.append( draw_params(t,nbclusters) )&lt;br /&gt;
&lt;br /&gt;
    old_log_estimate = sys.maxint                   # init&lt;br /&gt;
    log_estimate = sys.maxint/2 + epsilon      # init&lt;br /&gt;
    estimation_round = 0    &lt;br /&gt;
&lt;br /&gt;
    # powtarzaj aż zbiegniesz &lt;br /&gt;
    while (abs(log_estimate - old_log_estimate) &amp;gt; epsilon\&lt;br /&gt;
                and (not monotony or log_estimate &amp;lt; old_log_estimate)):&lt;br /&gt;
        restart = False&lt;br /&gt;
        old_log_estimate = log_estimate   &lt;br /&gt;
        ########################################################&lt;br /&gt;
        # krok E: oblicz Pz dla każdego przykładu (czyli w oznaczeniach z wykładu w_i^j)&lt;br /&gt;
        ########################################################&lt;br /&gt;
        # obliczamy prawdopodobieństwa  Px[j,i] = P(x_j|z_j=i)  &lt;br /&gt;
        for j in xrange(nbobs): # iterujemy po przykładach&lt;br /&gt;
            for i in xrange(nbclusters): # iterujemy po składnikach&lt;br /&gt;
                Px[j,i] = pnorm(t[j,:], params[i]['mu'], params[i]['sigma']) #  (równanie 4)&lt;br /&gt;
&lt;br /&gt;
        #  obliczamy prawdopodobieństwa Pz[j,i] = P(z_j=i|x_j)   &lt;br /&gt;
        #  najpierw licznik równania (3)   &lt;br /&gt;
        for j in xrange(nbobs): &lt;br /&gt;
            for i in xrange(nbclusters):&lt;br /&gt;
                Pz[j,i] = .............*params[i]['phi']&lt;br /&gt;
        #  mianownik równania (3)&lt;br /&gt;
        for j in xrange(nbobs): &lt;br /&gt;
            tmpSum = 0.0&lt;br /&gt;
            for i in xrange(nbclusters):&lt;br /&gt;
                tmpSum += ..................&lt;br /&gt;
        # składamy w całość Pz[j,i] = P(z_j=i|x_j)&lt;br /&gt;
            Pz[j,:] /= tmpSum&lt;br /&gt;
        &lt;br /&gt;
        ###########################################################&lt;br /&gt;
        # krok M: uaktualnij paramertry (sets {mu, sigma, phi}) #&lt;br /&gt;
        ###########################################################&lt;br /&gt;
        #print &amp;quot;iter:&amp;quot;, iteration, &amp;quot; estimation#:&amp;quot;, estimation_round,\&lt;br /&gt;
        #            &amp;quot; params:&amp;quot;, params&lt;br /&gt;
        for i in xrange(nbclusters):&lt;br /&gt;
            print &amp;quot;------------------&amp;quot;&lt;br /&gt;
            # parametr phi: równanie (6)&lt;br /&gt;
            Sum_w = np.sum(Pz[:,i])&lt;br /&gt;
            params[i]['phi'] = Sum_w/nbobs&lt;br /&gt;
            if params[i]['phi'] &amp;lt;= 1.0/nbobs:           # restartujemy jeśli zanika nam któraś składowa mieszanki&lt;br /&gt;
                restart = True                          &lt;br /&gt;
                print &amp;quot;Restarting, p:&amp;quot;,params[i]['phi'] &lt;br /&gt;
                break&lt;br /&gt;
            print 'i: ',i,' phi: ', params[i]['phi']&lt;br /&gt;
            # średnia: równanie (7)&lt;br /&gt;
            m = np.zeros(nbfeatures)&lt;br /&gt;
            for j in xrange(nbobs):&lt;br /&gt;
                m += ......................&lt;br /&gt;
            params[i]['mu'] = m/Sum_w&lt;br /&gt;
            print 'i: ',i,' mu: ', params[i]['mu']&lt;br /&gt;
            &lt;br /&gt;
            # macierz kowariancji: równanie (8)&lt;br /&gt;
            s = np.matrix(np.zeros((nbfeatures,nbfeatures)))&lt;br /&gt;
            for j in xrange(nbobs):&lt;br /&gt;
                roznica = np.matrix(t[j,:]-params[i]['mu'])&lt;br /&gt;
                s += Pz[j,i]*(roznica.T*roznica)&lt;br /&gt;
            params[i]['sigma'] = s/Sum_w&lt;br /&gt;
            &lt;br /&gt;
            print params[i]['sigma']&lt;br /&gt;
            &lt;br /&gt;
            ### Test bound conditions and restart consequently if needed&lt;br /&gt;
            if not restart:&lt;br /&gt;
                restart = True&lt;br /&gt;
                for i in xrange(1,nbclusters):&lt;br /&gt;
                    if not np.allclose(params[i]['mu'], params[i-1]['mu'])\&lt;br /&gt;
                    or not np.allclose(params[i]['sigma'], params[i-1]['sigma']):&lt;br /&gt;
                        restart = False&lt;br /&gt;
                        break&lt;br /&gt;
            if restart:                &lt;br /&gt;
                old_log_estimate = sys.maxint                 # init&lt;br /&gt;
                log_estimate = sys.maxint/2 + epsilon    # init&lt;br /&gt;
                params = [draw_params(t,nbclusters) for i in xrange(nbclusters)] # losujemy nowe parametry startowe&lt;br /&gt;
                print 'RESTART'&lt;br /&gt;
                continue&lt;br /&gt;
            &lt;br /&gt;
            &lt;br /&gt;
            ####################################&lt;br /&gt;
            # Step 4: liczy estymatę log wiarygodności: równaie (1)  #&lt;br /&gt;
            ####################################&lt;br /&gt;
            log_estimate = np.sum([np.log(np.sum(\&lt;br /&gt;
                    [Px[j,i]*params[i]['phi'] for i in xrange(nbclusters)]))\&lt;br /&gt;
                    for j in xrange(nbobs)])&lt;br /&gt;
            print &amp;quot;(EM) poprzednia i aktualna estymata log wiarygodności: &amp;quot;,\&lt;br /&gt;
                    old_log_estimate, log_estimate&lt;br /&gt;
            estimation_round += 1&lt;br /&gt;
        ##########################&lt;br /&gt;
        #  rysujemy aktualny stan modelu&lt;br /&gt;
        ##########################&lt;br /&gt;
        py.ioff()&lt;br /&gt;
        py.clf()&lt;br /&gt;
        py.ion()&lt;br /&gt;
        for i in xrange(nbclusters):&lt;br /&gt;
            plot_gauss(np.array(params[i]['mu']),np.array(params[i]['sigma']))&lt;br /&gt;
        py.plot(x[:,0],x[:,1],'g.')&lt;br /&gt;
        py.axis('equal')&lt;br /&gt;
        py.draw()&lt;br /&gt;
 &lt;br /&gt;
        &lt;br /&gt;
        # Pakujemy wyniki&lt;br /&gt;
        quality = -log_estimate&lt;br /&gt;
        if not quality in result or quality &amp;gt; result['quality']:&lt;br /&gt;
            result['quality'] = quality&lt;br /&gt;
            result['params'] = copy.deepcopy(params)&lt;br /&gt;
            result['clusters'] = [[o for o in xrange(nbobs)\&lt;br /&gt;
                    if Px[o,c] == max(Px[o,:])]\&lt;br /&gt;
                    for c in xrange(nbclusters)]&lt;br /&gt;
    return result&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
##########################################&lt;br /&gt;
#   PROGRAM&lt;br /&gt;
#########################################&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# robimy mieszankę dwóch gaussów:&lt;br /&gt;
#parametry rozkładu&lt;br /&gt;
# wektor średnich:&lt;br /&gt;
mu1 = [-2,-3] &lt;br /&gt;
# macierz kowariancji:&lt;br /&gt;
Sigma1 = np.array([[1, 0.5],&lt;br /&gt;
                  [0.5, 1]])&lt;br /&gt;
# generujemy dane: &lt;br /&gt;
x1 = np.random.multivariate_normal(mu1, Sigma1, 150) #&lt;br /&gt;
mu2 = [-0.5,2] &lt;br /&gt;
# macierz kowariancji:&lt;br /&gt;
Sigma2 = np.array([[3, 0.5],&lt;br /&gt;
                  [0.5, 1]])&lt;br /&gt;
# generujemy dane: &lt;br /&gt;
x2 = np.random.multivariate_normal(mu2, Sigma2, 150) #&lt;br /&gt;
# łączymy x1 i x2 aby otrzymac jeden zbiór&lt;br /&gt;
x = np.vstack((x1,x2))&lt;br /&gt;
py.plot(x[:,0],x[:,1],'g.')&lt;br /&gt;
py.axis('equal')&lt;br /&gt;
py.show()&lt;br /&gt;
py.figure()&lt;br /&gt;
res = expectation_maximization(x, nbclusters=2, nbiter=3, normalize=False,\&lt;br /&gt;
        epsilon=0.001, monotony=False, datasetinit=True)&lt;br /&gt;
py.ioff()&lt;br /&gt;
py.show()&lt;br /&gt;
print res&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jarekz</name></author>
		
	</entry>
</feed>