Uczenie maszynowe i sztuczne sieci neuronowe/Ćwiczenia 1: Różnice pomiędzy wersjami

Z Brain-wiki
 
(Nie pokazano 3 wersji utworzonych przez jednego użytkownika)
Linia 88: Linia 88:
 
* dla przypomnienia: odwrotność macierzy można obliczyć w numpy funkcją: <tt>numpy.linalg.inv</tt>
 
* dla przypomnienia: odwrotność macierzy można obliczyć w numpy funkcją: <tt>numpy.linalg.inv</tt>
  
==Algortym gradientowy zbiorczy ==
+
 
Proszę napisać funkcję, która znajduje optymalne parametry theta wg. algorytmy gradientowego zbiorczego. Funkcja jako argumenty przyjmuje ciąg uczący, wartości początkowe theta i parametr szybkości zbiegania alpha.
+
 
 +
==Algorytm gradientowy stochastyczny ==
 +
Proszę napisać funkcję, która znajduje optymalne parametry theta wg. algorytmu gradientowego stochastycznego. Funkcja jako argumenty przyjmuje ciąg uczący, wartości początkowe theta i parametr szybkości zbiegania alpha.
 
Na wyjściu funkcja powinna zwracać wyestymowane wartości parametrów.
 
Na wyjściu funkcja powinna zwracać wyestymowane wartości parametrów.
  
 
W ramach ilustracji po każdej iteracji proszę dorysować prostą parametryzowaną przez aktualne wartości parametrów. Prostą animację można wykonać [[TI/Matplotlib#Prosta_animacja| analogicznie jak tu]].
 
W ramach ilustracji po każdej iteracji proszę dorysować prostą parametryzowaną przez aktualne wartości parametrów. Prostą animację można wykonać [[TI/Matplotlib#Prosta_animacja| analogicznie jak tu]].
  
==Algorytm gradientowy stochastyczny ==
+
==Algortym gradientowy zbiorczy ==
Proszę napisać funkcję, która znajduje optymalne parametry theta wg. algorytmu gradientowego stochastycznego. Funkcja jako argumenty przyjmuje ciąg uczący, wartości początkowe theta i parametr szybkości zbiegania alpha.
+
Proszę napisać funkcję, która znajduje optymalne parametry theta wg. algorytmy gradientowego zbiorczego. Funkcja jako argumenty przyjmuje ciąg uczący, wartości początkowe theta i parametr szybkości zbiegania alpha.
 
Na wyjściu funkcja powinna zwracać wyestymowane wartości parametrów.
 
Na wyjściu funkcja powinna zwracać wyestymowane wartości parametrów.
  
W ramach ilustracji po każdej iteracji proszę dorysować prostą parametryzowaną przez aktualne wartości parametrów. Prostą animację można wykonać [[TI:Programowanie_z_Pythonem/Matplotlib#Prosta_animacja| analogicznie jak tu]].
+
W ramach ilustracji po każdej iteracji proszę dorysować prostą parametryzowaną przez aktualne wartości parametrów. Prostą animację można wykonać [[TI/Matplotlib#Prosta_animacja| analogicznie jak tu]].
  
 
==Porównanie algorytmów==
 
==Porównanie algorytmów==
Linia 106: Linia 108:
  
  
 +
<!--
 
==Przykładowe kody ==
 
==Przykładowe kody ==
 
<source lang = python>
 
<source lang = python>
Linia 186: Linia 189:
 
py.show()
 
py.show()
 
</source>
 
</source>
 +
-->

Aktualna wersja na dzień 16:20, 1 mar 2016

Powtórka podstawowych rachunków wektorowych i macierzowych w ptyhonie

Wektor wierszowy i kolumnowy

Natywnym typem zmiennych w numpy są tablice czyli array. Aczkolwiek są one wielowymiarowe i przy pomocy indeksowania i pobierania wycinków można się nimi sprawnie posługiwać to nie są one domyślnie macierzami w sensie matematycznym. Aby uprawiać przy ich pomocy algebrę musimy nadać im kształt :-). Służy do tego metoda reshape. Aby zbadać własności tych obiektów proszę wykonać następujący kod:

import numpy as np
x = np.array([1,2,3,4])
print len(x), x.shape
print 'x: ',x
print 'transponowany x: ',x.T

Czy tablica x i transponowana tablica x się różnią?

A teraz proszę wykonać następujący kod:

import numpy as np
x = np.array([1,2,3,4]).reshape(4,1)
print len(x), x.shape
print 'x: ',x
print 'transponowany x: ',x.T

Proszę sprawdzić kształt i transpozycję macierzy 2x2, np.

[math]A = \left[ \begin{array}{cc} 1 & 2 \\ 3 & 4 \end{array} \right] [/math]
A = np.array([[1,2],[3,4]])

Operator * służy do mnożenia macierzy element po elemencie, albo do mnożenia macierzy przez skalar:

print A*A
print 2*A
v = np.array([3])
print v*A

Do wykonywania mnożenia w sensie macierzowym służy funkcja np.dot:

print np.dot(A,A)

Co robią następujące polecenia:

import numpy as np
x = np.array([1,2,3,4]).reshape(4,1)
print np.dot(x.T,x)
print np.dot(x,x.T)

Zapoznanie się z regresją liniową

W poniższych ćwiczeniach korzystać będziemy z następującej funkcji generującej dane. Proszę ją wykonać i obejrzeć dane. (X,Y) to ciąg uczący.

# -*- coding: utf-8 -*-
import scipy.stats as st
import pylab as py
import numpy as np


def symuluj_dane(theta, ile=30, odch_std = 3):
	# symuowana zalezność ma nastepującą postać y = theta[0] + theta[1]*x 
	# wartości parametrów  
	X = np.ones((ile,2)).reshape(ile,2) # X ma być macierzą, w której wierszach zapisane są kolejne wejścia ciągu
	X[:,1] = np.linspace(0, 10,ile)
	#błąd 
	epsilon = st.norm.rvs(size = ile, loc=0, scale = odch_std).reshape(ile,1)
	#epsilon = (st.uniform.rvs(size = ile, loc=-0.5, scale = odch_std)**3).reshape(ile,1)
		
	Y =  np.dot(X,theta) + epsilon 
	return (X,Y)

theta = np.array([1.,3.]).reshape(2,1) # theta ma być wektorem kolumnowym
(X,Y) = symuluj_dane(theta,  ile = 7, odch_std = 3) #symulujemy dane
py.plot(X[:,1], Y,'bo') # przedstawiamy nasze dane na wykresie
py.show()

Algorytm równań normalnych

Proszę napisać funkcję, która:

  • na wejściu przyjmuje ciąg uczący, implementuje wzór na parametry optymalne na podstawie równań normalnych.
  • Funkcja powinna zwracać estymowane parametry theta.
  • Proszę dorysować prostą reprezentującą hipotezę do wykresu punktów ciągu uczącego.
  • dla przypomnienia: odwrotność macierzy można obliczyć w numpy funkcją: numpy.linalg.inv


Algorytm gradientowy stochastyczny

Proszę napisać funkcję, która znajduje optymalne parametry theta wg. algorytmu gradientowego stochastycznego. Funkcja jako argumenty przyjmuje ciąg uczący, wartości początkowe theta i parametr szybkości zbiegania alpha. Na wyjściu funkcja powinna zwracać wyestymowane wartości parametrów.

W ramach ilustracji po każdej iteracji proszę dorysować prostą parametryzowaną przez aktualne wartości parametrów. Prostą animację można wykonać analogicznie jak tu.

Algortym gradientowy zbiorczy

Proszę napisać funkcję, która znajduje optymalne parametry theta wg. algorytmy gradientowego zbiorczego. Funkcja jako argumenty przyjmuje ciąg uczący, wartości początkowe theta i parametr szybkości zbiegania alpha. Na wyjściu funkcja powinna zwracać wyestymowane wartości parametrów.

W ramach ilustracji po każdej iteracji proszę dorysować prostą parametryzowaną przez aktualne wartości parametrów. Prostą animację można wykonać analogicznie jak tu.

Porównanie algorytmów

  • Proszę sprawdzić zbieżność algorytmów w zależności od parametrów szybkości zbiegania.
  • Proszę sprawdzić czy algorytmy optymalizacyjne działają poprawnie dla danych gdzie błąd podlega innym rozkładom prawdopodobieństwa niż normalny. np. rozkład jednorodny lub t o 3 st. swobody.
*