
Uczenie maszynowe i sztuczne sieci neuronowe/Ćwiczenia 5
Uczenie_maszynowe_i_sztuczne_sieci_neuronowe_cw/Regresja_NN
Regresja
Jednowymiarowa
W tym ćwiczeniu chcemy zastosować sieć do wykonania regresji nieliniowej.
Załóżmy, że mamy generator który dostarcza żądaną ilość par liczb zgodnie z pewnym modelem, np.:
def gen(ile):
x = np.sort(5*np.random.rand(ile))
y = (1+10*x+x**2)/(1+2*x**2)
y+= 0.1*y*np.random.randn(ile)
return(x,y)
- Niech generator dostarcza nam po 10 par liczb. Proszę narysować kilka realizacji.
- Proszę skonstruować sieć, którą można nauczyć zależności między punktami wejściowymi (x) i wyjściowymi (y). W tym celu najlepiej wykorzystać sieć z nieliniową warstwą ukrytą i liniową warstwę wyjściową. Taka kombinacja warstw nieliniowej i liniowej pozwala na reprezentację dowolniej ciągłej funkcji, pod warunkiem użycia właściwej ilości neuronów w warstwie ukrytej. Liniowa warstwa wyjściowa pozwala na rozszerzenie zbioru wartości.
- Proszę wykreślić funkcję reprezentowaną przez sieć na tle punktów zbioru uczącego i prawdziwej (niezaszumionej) relacji y(x).
- Czy dla ustalonej architektury sieci (rozmiarów warstw) i ustalonego zbioru uczącego sieć zbiega do jednego rozwiązania? Dlaczego?
- Podobnie jak w poprzednim zadaniu proszę zbadać ewolucję:
- wag
- błędu na zbiorze uczącym
- błędu na zbiorze monitorującym
- Powyższe zależności proszę zaobserwować dla kilku rozmiarów warstwy ukrytej.
Analiza krzywych uczenia
Na jakość regresji wpływ mogą mieć trzy czynniki:
- stopień skomplikowania wewnętrznej reprezentacji (tu: ilość jednostek ukrytych):
- za dużo jednostek pozwala dobrze dopasować się do szczegółów w zbiorze uczącym, może jednak prowadzić do złej generalizacji
- zbyt uboga reprezentacja (tu: za mało jednostek ukrytych) prowadzi do zbyt dużych błędów na obu zbiorach
- ilość przykładów w ciągu uczącym:
- zbyt mała może powodować błędy generalizacji poprzez słabe pokrycie przestrzeni wejść
- zbyt duża: niepotrzebnie podnosi czas uczenia i (w realnym świecie) koszty pozyskania przykładów
Oprócz wspomnianego już analizowania wykresów błędów na zbiorze treningowym i monitorującym pomocne może być przyjrzenie się wykresom błędów popełnianych na zbiorze uczącym i monitorującym w zależności od liczby przykładów w tych zbiorach.
- Dla kilku ustalonych architektur zbadaj zależność błędu od rozmiaru zbioru uczącego.
Dwuwymiarowa
W zadaniu tym chciałbym abyście zbadali na ile złożona (ile neuronów ukrytych) musi być sieć modelująca/interpolująca funkcję:
- [math] f(x,y) = 0.1 + \frac{1 + \sin(2x + 3y)}{3.5 + \sin(x-y)}[/math]
dla [math]x,y \in [-2,2][/math]
- Proszę wykreślić tą funkcję.
- Jako ciąg uczący proszę wykorzystać pary wejścia spróbkowane co 0.2 i odpowiadające im wartości funkcji.
- Test proszę przeprowadzić na danych próbkowanych gęściej, ale tak aby w zbiorze testowym nie było punktów ze zbioru uczącego (np.: np.arange(-2+0.05195,2,0.05195)).
Przydatne mogą być funkcje do:
- generowania danych np.:
def gen(vec):
x = vec
y = vec
f = np.zeros((len(x),len(y)))
for i, x_i in enumerate(x):
for j, y_j in enumerate(y):
f[i,j] = 0.1 + (1+np.sin(2*x_i + 3*y_j))/(3.5 + np.sin(x_i - y_j))
return(x,y,f)
(x,y,f)= gen(np.arange(-2,2,0.2))
- rysowania powierzchni 3D
from matplotlib.pyplot import plot, show, figure, draw
from mpl_toolkits.mplot3d import axes3d
def rysuj3d(x,y,f,fig):
X,Y = np.meshgrid(x,y)
ax = fig.gca(projection='3d')
ax.plot_surface(X, Y, f, rstride=3, cstride=3, alpha=0.3)
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('f')
def scatter3d(x,y,f,fig,kolor):
X,Y = np.meshgrid(x,y)
ax = fig.gca(projection='3d')
ax.scatter(X, Y, f, c=kolor,marker='o')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('f')
#przykładowe użycie:
(x,y,f)= gen(np.arange(-2,2,0.2))
fig = figure()
rysuj3d(x,y,f,fig)
scatter3d(x,y,f,fig,'b')
show
Uczenie_maszynowe_i_sztuczne_sieci_neuronowe_cw/Regresja_NN