Perceptron reguła delta - warunek stopu

0

Cześć

Jaki jest warunek stopu tego algorytmu? Zawsze byłem kiepski w tych zbiorach a teraz to się na mnie mści :(

perceptron.png

0

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.

0

ok czyli jesli mam takie punkty:

punkty.png

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

0

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

0

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.

0

"granica separacji" nie jest żadnym powszechnie używanym sformułowaniem w kontekście sieci neuronowych.

0

Może linia decyzyjna? Chodzi o tą linię która oddziela 2 zbiory punktów.

0

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 ;]

0

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?

0

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.

0

To po co w tym algorytmie punkt (a) Wylosuj ze zbioru A dowolny punkt???

0

Mógłbyś mi to wyjaśnić na przykładzie?

0

Może to coś rozjaśni http://iisi.pcz.pl/nn/uczenie.php?art=3

0

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()
}
0

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? :/

0

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

0

@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?

0

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".

0

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 ;>

0

Jejku, następny? Wszyscy mnie chcą wygryźć czy coś? :P

0

@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

0

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ć...

0

@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 :)

0

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ć...

0

@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ć

0

@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? :>

0
  1. Nie napisałeś jakiej funkcji progowej używasz
  2. Nie napisałeś że oznaczasz wagi w kolejności [1,2,0]
    To po prostu uznałem że nie potrafisz liczyć. Zrozum że ja nie mam szklanej kuli przed sobą a herbatę mam z torebki a nie z fusów...
0

@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 :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1