Cześć
Jaki jest warunek stopu tego algorytmu? Zawsze byłem kiepski w tych zbiorach a teraz to się na mnie mści :(
Cześć
Jaki jest warunek stopu tego algorytmu? Zawsze byłem kiepski w tych zbiorach a teraz to się na mnie mści :(
No ale przeciez masz to samo napisane też słownie. Warunek jest taki że odpowiedź sieci dla każdego elementu zbioru uczącego ma być poprawna. Tzn w tym przypadku jak bardzo chcesz:
Masz zbiór uczący zawierający pary (x,y) gdzie x jest wejściem a y oczekiwanym wyjściem.
A = {zbiór takich x
dla których wartość y
jest różna od odpowiedzi sieci dla argumentu x
przy wagach w
}
Póki ten zbiór nie jest pusty masz jakieś elementy zbioru uczącego które nie są poprawnie klasyfikowane.
ok czyli jesli mam takie punkty:
to wykres wygląda w ten sposób? Wagi ustawiłem kolejno na : w0 = 0,3 w1 = -1, w2 = -0,2. Liczyłem tą linie według wzoru:
x2 = a* x1 + b
gdzie a = -w1/w2 ; b = -w0/w2
Ale jaki znów wykres? Co on niby prezentuje? Rozumiem że zakładasz ze czytamy ci w myślach i wszyscy znamy twoje zadanie, wygląd sieci którą używasz i w ogóle że siedzimy ci za plecami? o_O
Faktycznie masz racje.
Cały pdf jest tutaj :
http://wikizmsi.zut.edu.pl/uploads/f/f8/ZD1-MSI2.pdf
Chodzi mi o wykreślanie granicy separacji.
"granica separacji" nie jest żadnym powszechnie używanym sformułowaniem w kontekście sieci neuronowych.
Może linia decyzyjna? Chodzi o tą linię która oddziela 2 zbiory punktów.
Jeśli chodzi o linię decyzyjną to ta twoja jest totalnie bez sensu. Ta linia ma oddzielać od siebie 2 klasy, tzn po jednej stronie linii maja być punkty z jednej klasy a po drugiej z drugiej. U ciebie nie bardzo ma to miejsce ;]
Czyli jak ta linia źle wychodzi to znaczy że zła klasyfikacja i trzeba dobrać odpowiednio wagi. To jeśli przepuszamy punkt p1 przez perceptron i wychodzi nam wynik funkcji aktywacji inny niż t1 to wtedy poprawiamy te wagi, a jeśli inny to zostawiamy i przechodizmy do następnego punktu?
Masz tak ustawić wagi żeby WSZYSTKIE uczące punkty były poprawnie klasyfikowane przez sieć. Jeśli punkt się źle klasyfikuje to poprawiasz wagi i powtarzasz proces. Ale to nie jest tak że ustawiasz wagi dla jednego punktu a potem idziesz do drugiego itd. Bo zmiana wag dla drugiego może zepsuć klasyfikacje pierwszego. Masz to wykonywać dla wszystkich punktów w każdej iteracji.
To po co w tym algorytmie punkt (a) Wylosuj ze zbioru A dowolny punkt???
Mógłbyś mi to wyjaśnić na przykładzie?
Może to coś rozjaśni http://iisi.pcz.pl/nn/uczenie.php?art=3
o_O @Czarny pomidor nie wróżę przyszłości w informatyce, anyway:
A = [p1, p2, p3, p4]
while notEmpty(A):
p = getRandomFromSet(A)
result = neuralNetwork.calculateResponse(p.x)
if result != p.y:
neuralNetwork.changeWeights(p)
A = getIncorrectlyClassifiedPoints()
}
No to jednak losujemy ten punkt i jesli nie zgadza się klasa zmieniamy wagi - to wychodzi z tego co tu napisałeś.
Napisałeś : "Ale to nie jest tak że ustawiasz wagi dla jednego punktu a potem idziesz do drugiego itd. Bo zmiana wag dla drugiego może zepsuć klasyfikacje pierwszego. Masz to wykonywać dla wszystkich punktów w każdej iteracji. " Tego nie ogarniam. Przecież wagi są wspólne dla wszystkich punktów i chodzi o to żeby poprawiać je tym wzorem: w(k+1) = w(k) + exi a chyba ten wzór jest tak ogarnięty że nie powinno zepsuć wag dla pierwszego sprawdzonego punktu? :/
Chodzi o to, że dla każdego punktu poprawiasz tylko trochę, a nie tak, żeby było idealnie. Jak przejedziesz po wszystkich punktach kilkanaście razy wagi powinny w miarę rozdzielać wszystkie punkty na raz.
Przykład jest treningowy, bo akurat dla jednej warstwy można policzyć idealne rozdzielenie bezpośrednio, ale dla kilku warstw nie
@Shalom Dobra chyba wiem o co ci chodziło :
A = getIncorrectlyClassifiedPoints()
Chodziło że nie sprawdzać klasyfikacji przy jednym punkcie tylko po wszystkich punktach przy kazdej iteracji?
Tak, bo inaczej to sobie ustawisz idealnie wagi dla jednego punktu a reszta będzie popsuta. Potem ustawisz idealnie dla drugiego a pierwszy sie popsuje :D Musisz to robić na zasadzie "po trochu dla każdego punktu".
Spoko, chyba rozkminiłem. Napisałem sobie programik co rozwiązuje te wagi bo jakbym miał to liczyć samemu to bym świra dostał ;d. Wychodzi ładna linia co rozdziela klasy. Dzięki @Shalom i mam nadzieje że nie jesteś wróżką bo chce zostać najlepszym informatykiem i pracować w Cernie ;>
Jejku, następny? Wszyscy mnie chcą wygryźć czy coś? :P
@Shalom ja jeszcze jedno pytanko :D
Jak mi wychodzą wagi [-2.0, 0, 0] to jak będzie wyglądać ta linia separacji? :P wtedy wychodzi mi jakieś równanie sprzeczne jak chce narysować tą linie
To jakieś bzdury ci wyszły bo dla takich wag to ta sieć guzik zwraca, ale na pewno nie są to poprawne klasyfikacje. Ty w ogóle rozumiesz co te wagi oznaczają? o_O
W twoim przypadku w0 to jest threshold więc wartość która tylko przesuwa ci linię separacji w górę albo w dół. Sama linia zależy od pozostałych wag. Jak masz w1 i w2 równe 0 to sieć dla KAŻDEGO wejścia zwróci ci DOKŁADNIE TO SAMO, a konkretnie to zwróci ci threshold, bo inaczej się nie da.
Nawet jakbyś miał jakieś inne oznaczenia i to w2 byłoby wartością progową to nadal ta sieć by zwracała jakieś głupoty. Więc skoro wyszły ci takie wagi to znaczy że zupełnie nie rozumiesz co robisz. Weź do ręki kartkę i policz:
y1 = w1x1 + w2x2 + w0
dla każdego punktu i zobacz co ci wychodzi i czy faktycznie są to wartości które miałęś uzyskać...
@Shalom to tak:
punkty :
p1 x1: -1, x2: 1 ,t: 1
p2 x1: -1, x2: -1,t: 1
p3 x1: 0, x2: 0, t:0
p4 x1: 1, x2: 0, t:0
gdzie t oznacza klase.
funkcja klasyfikacji :
if x > 0 return 1
else return 0
Wagi: [-2.0, 0.0, 0.0]
u = w0 + w1 * x1 + w2+x2
u1 = 0 + -2 * (-1) + 0 * (1) = 2 -> 1 ok
u2 = 0 + -2 * (-1) + 0 * (-1) = 2 -> 1 ok
u3 = 0 + -2 * 0 + 0 * 0 = 0 -> 0 ok
u4 = 0 + -2 * 1 + 0 * 0 = -2 -> 0 ok
Wygląda na to że dobrze :)
Ty teraz piszesz serio? Ty studiujesz informatykę a nie umiesz liczyć w zakresie do 10? To jest 1 klasa podstawówki. Ja już ci nie wróżę braku przyszłosci w informatyce a w ogóle w życiu bo cię w sklepie oszukają przy wydawaniu reszty... Słabo mi jak czytam takie posty.
Wagi: [-2.0, 0.0, 0.0] co rozumiem jako:
w0 = -2
w1 = 0
w2 = 0
y = w0 + w1 * x1 + w2+x2 = -2 + 0x1 + 0x2 = -2 i co byś nie podstawił pod te x to ci wyjdzie -2. Ale załóżmy na chwilę że masz tu jakiś radziecki system oznaczania wag gdzie z przyczyn niewyjaśnionych twój zapis oznacza:
w0 = 0
w1 = -2
w2 = 0
mamy więc
y = w0 + w1 * x1 + w2x2 = -2x1
I w takim układzie klasyfikacja jest poprawna. Ale zauważ że teraz oczywiście twój wzór nie ma sensu bo zeruje ci sie jedna z wag. Teraz musisz użyc mózgu (wiem wiem, trudna sprawa!). Ale popatrz na równanie które napisałem wyżej -> y = -2*x1 to jest właśnie twoja linia separacji. Bo widzisz, warto rozumieć SKĄD sie wziął wzór którego próbowałeś użyć...
@Shalom niee [-2.0, 0.0, 0.0] to jest w0= 0.0 w1= -2.0 w2 = 0 czyli ten wektor wag to jest [w1, w2, w0]. Sorry że tego nie zaznaczyłem, widzę że coś omine i już mnie wyzywają od analfabetów :(
A i w tym wzorze u = w0 + w1 * x1 + w2 * x2 powinno być
@Shalom Dobra y = -2*x1 rozumiem tyle wystarczyło i dzięki. Tylko nadal nie rozumiem w czym się jebnałem w obliczeniach biorąc pod uwagę [w1, w2, w0] i dlaczego nie umiem liczyć.
Sam napisałeś ze klasyfikacja jest poprawna, więc w czym rzecz? :>
@Shalom Przez ciebie czuje się jak ta pani : http://www.cda.pl/video/345203b
Ok spoko następnym razem będe bardziej precyzyjnie zadawał pytania :)