Dodaj wpis w tym temacie
Spis tematów | Strona: 1 2 3 4 5 6 7 ... 23 24 Wyślij wiadomość do admina |
Przewiń wpisy ↓ | Prognoza MM z sieci neuronowej |
2012-01-18 (23:18)![]() Data rejestracji: 2009-01-23 Ilość postów: 2551 ![]() | wpis nr 489 147 [ CZCIONKA MONOSPACE ] Ale z powyższego wynika że neuron wejściowy nr 1 dostaje wyniki (np owe 3 sposoby podania na 3 wejścia ) a wyniki te reprezentują Zd. El. {jedno oczko} natomiast neuron nr 2 dostanie to samo dla Zd. El. {dwa oczka} itd. Sieć może w każdym neuronie wejściowym ustawić różne wagi dla wejść : neuron pierwszy i wejście A = waga +10 neuron drugi i wejścia A = waga -20 to się trochę kłóci z logika ponieważ wydaje się że wszystkie wejścia A dla wszustkich zdarzeń elem. powinny mieć taką samą wagę . By tak było to należało by jednak podawać dane tylko na jeden neuron wejściowy i musiały by być (dane) jakoś przerobione . Nie w stylu 6-ciu wartości (bo 6 Zd.el.) dla 6-ciu neuronów a jednej dla jednego , bo wynikiem jest jedno Zd.el. Zatem trzeba by stworzyć sposób określania co za zdarzenie wystąpiło . Nie podamy przecież wartości typu "5 oczek" - to nazwa . I tutaj też można wymyślić więcej niż jeden motyw "nazwania" zdarzenia i mająć np trzy sposoby na przedstawienie za pomocą wartości liczbowej wyniku rzutu kostką podamy nasze dane na 3 wejścia a sieć może za pomocą wag wybierać jeden z trzech sposobów , a raczej określać który sposób podania jest dla niej ważniejszy. |
2012-01-19 (00:02)![]() Data rejestracji: 2009-01-23 Ilość postów: 2551 ![]() | wpis nr 489 152 [ CZCIONKA MONOSPACE ] I na koniec , jeśli podajemy sumę wylosowanych kulek w MM na wejście to co na wyjściu dostajemy ? Jeśli podajemy 6 zdarzeń elem. na 6 wejść to na 6-ciu wyjściach co dostaniemy ? Jeśli na jeden neuron wejściowy podajemy wynik rzutu kostką to co na wyjściu oczekujemy dostać. Dlatego wydaje sie że pomysł sumowania kulek w MM jest zły. W rzucie kostką i przy 6-ciu neuronach wejściowych gdzie kazdy reprezentuje jedno z zd. el. mamy też 6 wyjść które mogą w wyniku dawać p wystąpienia danego zd.el. gdy zaś mamy jeden neuron wejściowy dla zaistniałego zd. el a nie wszystkich możliwych (6-ciu) to wynikiem na jednym neuronie wyjściowy oczekujemy że będzie typowane zd.el które ma wystąpić i tylko jedno z 6-ciu możliwych . Nie mamy wiedzy o innych. Adalbert czy w miarę dobrze myślę , czy gdzieś poważnie się mylę. |
2012-01-19 (00:05)![]() Data rejestracji: 2009-01-23 Ilość postów: 2551 ![]() | wpis nr 489 154 [ CZCIONKA MONOSPACE ] """""""""""""" W rzucie kostką i przy 6-ciu neuronach wejściowych gdzie kazdy reprezentuje jedno z zd. el. mamy też 6 wyjść które mogą w wyniku dawać p wystąpienia danego zd.el. """"""""""""""""" no może nie bezpośrednio dostaniemy p , ale wielkość którą możemy porównać na wszystkich 6-ciu wyjściach i z tego porównania widzimy który neuron dają największą wartość i jak dużą w stosunku do pozostałych więc pośrednio jest to prawdopodobieństwo. |
2012-01-19 (09:03)![]() Data rejestracji: 2005-02-24 Ilość postów: 6116 ![]() | wpis nr 489 176 [ CZCIONKA MONOSPACE ] Taki sam przelicznik o którym pisze Kurka mam zastosowany w arkuszu moje spostrzeżenia co się tam dzieje z tym przelicznikiem ustawiony przelicznik dobry jest tylko i wyłącznie dla ilości liczb (kostek do gry) dla których został ustawiony zmieniając ilość liczb ( kostek do gry ) trzeba szukać nowego współczynnika .... nie ma przelicznika uniwersalnego pasującego wszędzie do każdej ilości liczb ( kostek do gry ) |
2012-01-19 (11:30)![]() Data rejestracji: 2009-01-23 Ilość postów: 2551 ![]() | wpis nr 489 219 [ CZCIONKA MONOSPACE ] Taki Przelicznik ma związek z p i dla rzutu monetą będzie inny niż dla rzutu kostką , to chyba logiczne. Można stworzyć wzór na wyznaczenie kolejnych wartości wag , ale już wchodzimy w szczegóły nie mając jeszcze wizji podstawowych. Po pierwsze czy podawać dane na jeden neuron wejściowy ponieważ wynikiem rzutu kostką jest jedno zd.el. , czy na 6 neuronów bo jest 6 możliwych zdarzeń el. Po wyborze mamy następny dylemat czy podawać już przeliczone dane na jedno wejście czy nie przeliczone na sporą ilość wejść. Jaki rodzaj sieci gdy będzie tylko jeden neuron wejściowy a jaki gdy będzie 6 neuronów wejściowych. A może jeszcze inaczej . Dlatego też proponowałam by spreparować wyniki rzutu kostką w taki sposób by składały się z "kawałków" o nielosowym charakterze , wymieszanych losowo , lub losowych kawałków wymieszanych nielosowo. Sieć powinna znaleźć klucz jaki posłużył do nielosowego fragmentu konstrukcji spreparowanych wyników. Jeśli już utworzymy sieć dzialającą poprawnie, a to nie powinno być trudne, to możemy podać jej dane z generatora czy prawdziwej gry. Dowiemy się jaki rodzaj sieci , jakiej topologi rozmiarów przy jakim sposobie podania danych potrafi odnaleźć klucz do spreparowanych wyników i już coś wiemy. Wtedy można się dalej zastanawiać , co zmienić , poprawić , dodać. |
2012-01-19 (12:04)![]() Data rejestracji: 2009-03-19 Ilość postów: 675 ![]() | wpis nr 489 228 [ CZCIONKA MONOSPACE ] Zgodnie z wcześniejszą obietnicą poniżej przedstawiam szczegółowy opis całego algorytmu obliczeń. Tak, jak wcześniej pisałem wszystkie obliczenia wykonuję z wykorzystaniem Matlaba 2011a, w związku z tym postaram się również w miarę czytelnie wyjaśnić wykorzystywane funkcje Matlaba, a w szczególności kolejne moduły całego programu. Opisując algorytm programu, a także pewne przyjęte przez mnie założenia, nie będę na razie skupiać się na samej istocie sieci neuronowych. Korzystając z sieci neuronowych (różnych modeli) do prognozowania gier totalizatora największym problemem było znalezienie odpowiedzi na pytanie, w jaki sposób przygotować dane na wejściu sieci neuronowej: - czy w postaci wyników losowania (sortowanych, niesortowanych)? - czy w postaci zakodowanej (np. kod Gray’a, kod CSN, postać binarna itd.) - czy w postaci serii czasu (Time Series)? itd. Analizując różne przykłady wykorzystania sieci neuronowych do prognozowania zdarzeń losowych trafiłem na ciekawą publikację profesora Rajiv Singh z The MathWorks, Inc., dotyczącą prognozowania zdarzeń z wykorzystanie sieci neuronowych. Według niego (jakby nie było autora/twórcy pakietu sieci neuronowych zaimplementowanych w Matlabie) sieci doskonale radzą sobie z predykcją (prognozowaniem kolejnych zdarzeń) tylko wtedy, kiedy kolejne zdarzenie i następne opisane są tym samym modelem, jak zdarzenia je poprzedzające. Prościej mówiąc, niezależnie od tego, w jaki sposób przygotujemy dane wejściowe wynik prognozy wykonanej przez sieć będzie zgodny z rzeczywistym przyszłym zdarzeniem, jeżeli kolejne zdarzenie (przyszłe zdarzenie) wpisuje się w model opisujący dotychczasowe zdarzenia. Jeżeli jednak przyszłe zdarzenie (zdarzenia) zmieniają „wyuczony” przez sieć model opisujący dotychczas znane wyniki, czyli przekładając je na losowania MM, jeżeli kolejne losowanie 20 kul (liczb) po dopisaniu do dotychczasowej bazy danych archiwalnych powoduje, iż istniejący model opisujący losowania ulega zmianie to sieci neuronowe, niezależnie od ich budowy, struktury nie poradzą sobie z takim zagadnieniem, bo do prognozowania kolejnego losowania trzeba innego modelu sieci. Na przykład sieć typu TimeDelayNet (sieć z opóźnieniem czasowym TDN, gdzie algorytmem opisującym sieć jest funkcja liniowa) po procesie jej uczenia na podstawie archiwalnych danych losowań stworzyła model opisujący znane dotychczas zdarzenia otrzymując prawidłowe wagi, liczbę ukrytych warstw, liczbę neuronów i na tej podstawie prognozuje kolejne zdarzenie (kolejne losowanie). Niby wszystko ok., a wynik losowania jest inny niż ten prognozowany bo okazuje się, że kolejne losowanie znaczenie odbiega od przyjętego modelu TDN (np. odpowiada modelowi sieci FeedForwardNet, która opiera się o funkcję wykładniczą z jedną warstwą ukrytą). Nie wnikając na razie w dalsze szczegóły sieci neuronowych Rajiv Singh proponuje dwa rozwiązania: 1. Sprawdzenie archiwalnych danych (w naszym przypadku dowolnego zakresu losowań), czy model opisujący archiwalne wyniki jest niezmienny (np. liniowy, wykładniczy, trygonometryczny, genetyczny itd.) 2. Zmodyfikowanie funkcji Predict zaimplementowanej w Matlabie, wykorzystywanej przez sieci neuronowe, w taki sposób, aby chaotyczne zmiany modelu danych archiwalnych (tzn. losowań MM i innych gier) aproksymować do jednego modelu W pierwszym przypadku po sprawdzeniu programem przygotowanym przez Rajv Signh oczywiście okazuje się, że w losowaniach MM praktycznie zmiana modelu następuje po każdym losowaniu, choć są takie losowania (2-3 losowań pod rząd), gdzie taka zmiana nie występuje. Nic rewelacyjnego nie odkryłem, ale sprawdziłem. W Matlabie do tego celu służy funkcja Impulse. W drugim przypadku Rajv podaje gotowy algorytm modyfikujący zaimplementowaną funkcję Predict, w taki sposób, że opisane zmiany modelu nie mają aż tak istotnego wpływu na wynik prognozy. Ponadto proponuje, aby chaotyczność zmian modelu sieci zastąpić liniowym modelem AR (AutoRegression) stosowanym do predykcji chaotycznych serii czasu (Chaotic Time Series). W tym celu konieczne jest jednak „zlinearyzowanie” danych wejściowych. Trochę przydługi wstęp, ale bez niego reszta opisu mogłaby wydawać się dziwna i niezrozumiała. Cdn. |
2012-01-19 (13:14)![]() Data rejestracji: 2009-03-19 Ilość postów: 675 ![]() | wpis nr 489 251 [ CZCIONKA MONOSPACE ] Kontynuacja częsci 1: Do obliczeń wykorzystuję niesortowaną bazę archiwalnych wyników losowa zapisaną w postaci tabeli w Excelu. Ostatnim losowaniem w bazie jest oczywiście ostatnie losowanie MM, które znam. Fragment takiej bazy (w przykładzie poniżej ostatnim losowaniem jest losowanie z 18.10.2012 z 22:15. ![]() W Matlabie wczytanie takiej bazy nie jest problemem: Kod Matlaba: archiwum=xlsread('Multi.xls'); Mutli.xls to plik z archiwalnymi wynikami, który zawiera niesortowane wyniki losowań od 1 stycznia 200tr. do ostatniego losowania. Wczytane wyniki podstawiane są do tablicy archiwum. W Matlabie nie trzeba definiować tablic, zmiennych itp. Tablica archiwum zawiera dokładnie to samo, co plik Multi.xls pokazany powyżej: ![]() Teraz kolej na kilka stałych wykorzystywanych przez program: init='e'; ts=1; k = 1; zakres_liczb=[1:80]; kolejne=1; init – stała wykorzystywana przez zmodyfikowaną funkcję Predict, na podstawie której inicjalizowana jest pierwsza warstwa sieci. Możliwe do użycia estymatory funkcji Predict (to nie są wagi sieci, ani też ich początkowe ustawienia): init ='e(stimate)': Warstwa inicjalizująca sieć normalizuje błąd predykcji; init = 'd(elayexpand)': Tak samo, jak e(stimate), ale model uwzględnia tylko niezerowe wartości opóźnienia odpowiedzi sygnału wyjściowego na zmiany sygnału wejściowego; init = 'z(ero)' Wartswa inicjalizująca sieć zawiera wartości zerowe; init = 'm(odel)' za każdym razem po wytrenowaniu sieci warstwa inicjalizująca sieć zawiera wartości będące wynikiem wytrenowania sieci w poprzedniej iteracji; init = x0 wektor o takim samym rozmiarze, jak dane wejściowe zawierający dla: - modeli ciągłych wartości liczbowe określające np. błędy prognozy - modeli z opóźnieniem czasowym wartości liczbowe obliczone na podstawie innej funkcji inpd2nk (stosowane dla modeli, gdzie kolejne wyniki są funkcją falowania) ts=1 – minimalne opóźnienie w czasie serii czasu; k=1 – ile losowań „w przód” prognozujemy (k=1 tylko następne, k=2 – dwa kolejne, k=3 – trzy kolejne itd.) zakres_liczb=[1:80] – tablica pomocnicza zawierająca wszystkie losowane liczby w MM, czyli 1, 2, 3….80, kolejne=1 – wprowadzona przeze mnie stała, a w zasadzie zmienna, która jest pomocna przy uproszczeniu niektórych pętli for …..end. Teraz kilka zdań o samym modelu AR. Bez problemu całą teorię „wygóglać” można w internecie. Ja ze swej strony powiem tylko, że na etapie uczenia sieci nie jest wiadomo, jakie parametry modelu przyjąć – jakie będą najlepsze. Tymi parametrami są: Order – współczynnik stopnia estymacji nowe – zmienna określająca ile archiwalnych losowań wstecz analizować, żeby uzyskać jak najlepsze rezultaty prognozy. Sam model AR opisany jest równaniem: y(t)+a1y(t-1)+….+any(t-n)=e(t) gdzie: y(t) - ostatni znany wynik w czasie t, czyli ten który jest prognozowany przez sieć na etapie jej uczenia y(t-1) – znany wynik w czasie t-1 y(t-1) – znany wynik w czasie t-n, czyli pierwszy w analizowanych wynikach archiwalnych a1..an – parametry, które będą prognozowane przez sieć e(t) błąd prognozy ostatniego znanego wyniku y(t). Przy wyborze estymatora modelu AR, czyli init=’e’ obliczenia trwają tak długo, aż e(t) osiągnie minimum W związku z tym, że do modelu podstawiać będę dane w postaci jednej kolumny, o czym w dalszej części model AR upraszcza się do postaci: A(q)y(t)=e(t) gdzie: ![]() ![]() jest wartością liczbową opisującą rzeczywiste przesunięcie w czasie serii czasu według równania: ![]() i właśnie wykładnikiem potęgi n jest wcześniej opisany współczynnik estymacji nazwany w programie: Order. Optymalnej wartości tego współczynnika nie znamy, w związku z tym całość obliczeń wykonywana jest w pętli: for order=2:50 for nowe=2*order:300 ……. end end Przypominam, że "nowe" to nowy zakres archiwalnych losowań, czyli ile tych losowań brać pod uwagę. Ponieważ sam model AR wymaga, aby zakres podstawianych danych liczbowych był co najmniej 2x większy niż współczynnik order w drugiej pętli zastosowałem ten warunek. Cdn. |
2012-01-19 (14:53)![]() Data rejestracji: 2009-03-19 Ilość postów: 675 ![]() | wpis nr 489 293 [ CZCIONKA MONOSPACE ] Kontynuacja części 2 Część 3 Za tzw. literówki przepraszam, oczywiście ostatnim losowaniem w podanym przykładzie jest losowanie z 18 01.2012 z 22:15, a nie z dnia 22.10.2012 z 22:15, jak widać na wcześniejszym obrazku. Teraz najważniejsze, czyli to, co budzi najwięcej emocji. W jaki sposób podaję wyniki losowań, jak je podstawiam do sieci? Żeby dobrze to zrozumieć powtórzę jeszcze raz najważniejsze informacje: 1. Sieć prognozuje przyszły wynik losowania przy zmieniających się współczynnikach estymacji modelu AR i zakresie analizowanych danych archiwalnych. 2. Do modelu AR podstawiam „zlinearyzowane” wyniki losowań eliminując w ten sposób zjawisko zmienności funkcji opisującej dane archiwalne (funkcja liniowa, wykładnicza, logarytmiczna, trygonometryczna itp.). W celu „linearyzacji” wyników losowań zastosowałem jedną z metod stosowanych przy prognozowaniu chaotycznych zdarzeń losowych (Chaotic Time Series), a mianowicie sumuję kolumnami archiwalne wyniki losowań, dodając do poprzedniej sumy wylosowanych liczb kolejną, która została wylosowana (aż do przedostatniego znanego losowania: Załóżmy, że jest to 10 archiwalnych wyników losowań (bez ostatniego losowania), wynik takiego sumowania wygląda następująco: ![]() Takie sumowanie w Matlabie wykonywane jest przy użyciu funkcji CUMSUM ![]() W pierwszej kolejności do zmiennej „wyniki” podstawiam archiwalny zakres losowań od losowania o numerze „end-nowe” do losowania end-1 wyniki=archiwum(end-nowe:end-1,:); gdzie: end – numer ostatniego losowania w bazie, a dokładnie to numer wiersza, w którym to losowanie jest zapisane. Zmiennej end nie trzeba definiować, Matlab oblicza ja sam na podstawie rozmiaru zmiennej tablicowej wyniki; nowe – to wcześniej opisywany zakres danych archiwalnych, zmieniający się w pętli for nowe=2*order:300 Jak widać do analizy nie biorę ostatniego losowania ponieważ na etapie uczenia sieci to losowanie będzie wykorzystywane do sprawdzenia poprawności prognozy. Kolejnym krokiem jest zsumowanie kolumnami wyników losowań: wyniki_sum=cumsum(wyniki); Zmienna wyniki_sum wygląda następująco (zakres 10 archiwalnych losowań, bez losowania ostatniego) ![]() Teraz dla każdej kolumny od 1 do 20 wykonuję prognozę kolejnej sumy for liczba=1:20 y=wyniki_sum(:,liczba); ata = iddata(y,[],ts); model = ar(ata,order); YP = forecasta(model,ata,k, init); los(1,liczba)= round(YP.y); end 1. Do zmiennej y podstawiam kolumnę zawierającą sumę wyników losowań ze zmiennej wyniki_sum, czyli przy każdorazowo wykonywanej pętli obliczeń for liczba=1:20 podstawiam kolumnę 1, 2, 3, … aż do 20 kolumny zmiennej wyniki_sum 2. Następnie zamieniam tą zmienną na obiekt iddata wymagany przez model AR. Będzie to obiekt o nazwie „ata” ata = iddata(y,[],ts); ![]() 3. Kolejnym krokiem jest zbudowanie modelu AR ze współczynnikiem estymacji order model = ar(ata,order); 4. No i najważniejsze, czyli prognoza wykorzystaniem modelu, obiektu ata, liczby prognoz w przód (k=1) i estymatora modelu init=’e’ YP = forecasta(model,ata,k,init); Funkcję forecasta opiszę później. Zmienna YP będzie prognozą kolejnej sumy losowań, ponieważ prognoza jest obiektem iddata, trzeba z niego odczytać to, co nas interesuje, czyli prognozę sumy losowań. Wynik prognozy jest liczbą zawierającą wartości po przecinku, konieczne jest jej zaokrąglenie. los(1,liczba)= round(YP.y); po zakończeniu pętli for liczba=1:20 otrzymujemy wynik prognozy w postaci zmiennej los: Zmienna ta będzie zawierać prognozę sumy dla każdej z podstawianych kolumn zmienne wyniki_sum Wygląda to następująco (przykład: nowe=10, order=2) ![]() Teraz, żeby obliczyć (wyznaczyć) wynik kolejnego losowania od zmiennej los odejmuję ostatni wiersz zmiennej wyniki_sum i sortuję je (dla lepszej czytelności prognozy) bedzie=los-wyniki_sum(end,:); bedzie=sort(bedzie,2); Zmienna będzie zawiera prognozę kolejnego losowania: ![]() Jak zmienna "bedzie" może zawierać liczby ujemne (takich w losowaniu MM nie ma) oraz powtórki. W takim razie, żeby wynik prognozy zawierał tylko losowane liczby i nie było powtórek do zmiennej prognoza podstawiam tylko właściwe liczby (z zakresu 1:80) for i=1:size(bedzie,2) if ismember(bedzie(1,i),zakres_liczb) prognoza(1,i)=bedzie(1,i); end end Teraz ze zmiennej prognoza wybieram tylko liczby bez powtórek i podstawiam je do zmiennej zaklad pozycja=1; zaklad(1,1)=0; for i=1:size(prognoza,2) if prognoza(1,i)~=0 if pozycja==1 zaklad(1,1)=prognoza(1,i); pozycja=pozycja+1; else if prognoza(1,i)>prognoza(1,i-1) zaklad(1,pozycja)=prognoza(1,i); pozycja=pozycja+1; end end end end zaklad=sort(zaklad,2); Jak widać w zmiennej zaklad znalazły się tylko liczby z zakresu 1:80 i bez powtórek. http://img163.imageshack.us/img163/3001/zakladu.png Zmienna „zaklad” zawiera prognozę losowanie na etapie uczenia sieci. Teraz kolej na sprawdzenie jej skuteczności. Do prognozy braliśmy losowania (sumę losowanych liczb na poszczególnych pozycjach 1:20) z zakresu określonego zmienną „nowe” do przedostatniego losowania zapisanego w archiwalnej bazie losowań „archiwum”. Sprawdzam więc ile liczb trafiłem porównując prognozę z ostatnim znanym losowaniem, które w prognozie nie brało udziału: [jest, pozycja]=ismember(zaklad,archiwum(end,:)); trafiono=cumsum(jest); Zmienna trafiono jest sumą trafień prognozy w ostatnim znanym losowaniu. W tym przykładzie (10 ostatnich losowań, order=2) trafiono 2 liczby/14 typowanych Jak widać prognoza nie jest najlepsza, ale to dopiero początek całej pętli obliczeń: for order=2:50 for nowe=2*order:300 …. end end Musiałem przyjąć jakie kryterium, które wybierałoby tylko te ustawienia parametrów modelu AR gwarantujące (dające gwarancję przy założeniu powtarzalności modelu), że prognoza jest skuteczna. Przyjąłem prosty warunek: - jeżeli wynik prognozy na etapie uczenia sieci jest wyższy równy 50%, to jest ok. i zapamiętujemy ustawienia modelu AR if trafiono(1,end)>=round(size(zaklad,2)/2) clc; matryca(kolejne,1)=order; matryca(kolejne,2)=nowe; matryca(kolejne,3)=trafiono(end); matryca(kolejne,4)=size(zaklad,2); kolejne=kolejne+1; matryca end W zmiennej „matryca” zapamiętuję: -współczynnik estymacji order - zakres analizowanych zmiennych - ile liczb trafiono - ile liczb wytypowano Przyjmuję zatem, że jeżeli przy parze ustawień order/nowe sieć na podstawie tak zbudowanego modelu wytypowała więcej niż 50% trafnych wyników na ostatnie znane losowanie, to istnieje duże prawdopodobieństwo, że ten sam model AR w funkcji parametrów order, nowe osiągnie zbliżoną skuteczność prognozując losowanie kolejne, którego nie znamy na podstawie archiwalnych danych z zakresu order, ale zawierającego ostatnie znane losowanie. Na razie tyle. Poniżej cały kod tej części programu i dodatkowo funkcje wykorzystywane przez program, a które zostały napisane przez Rajiv Singh z The MathWorks, Inc. Cdn. Pozdrawiam Adalbert |
2012-01-19 (14:57)![]() Data rejestracji: 2009-03-19 Ilość postów: 675 ![]() | wpis nr 489 294 [ CZCIONKA MONOSPACE ] Kod programu I części programu: % usunięcie zmiennych, %wyzerowanie obszaru pamięci, %czyszczenie ekranu itd. clc; clear global clear memory clear all close all echo off warning('off') % wczytanie archiwalnej bazy losowań archiwum=xlsread('Multi.xls'); % zmienne i stałe init='e'; ts=1; k = 1; zakres_liczb=[1:80]; kolejne=1; %właściwa pętla obliczeń for order=2:50 for nowe=10:10 wyniki=archiwum(end-nowe:end-1,:); wyniki_sum=cumsum(wyniki); for liczba=1:20 y=wyniki_sum(:,liczba); ata = iddata(y,[],ts); model = ar(ata,order); YP = forecasta(model,ata,k, init); los(1,liczba)= round(YP.y); end bedzie=los-wyniki_sum(end,:); bedzie=sort(bedzie,2); for i=1:size(bedzie,2) if ismember(bedzie(1,i),zakres_liczb) prognoza(1,i)=bedzie(1,i); end end pozycja=1; zaklad(1,1)=0; for i=1:size(prognoza,2) if prognoza(1,i)~=0 if pozycja==1 zaklad(1,1)=prognoza(1,i); pozycja=pozycja+1; else if prognoza(1,i)>prognoza(1,i-1) zaklad(1,pozycja)=prognoza(1,i); pozycja=pozycja+1; end end end end zaklad=sort(zaklad,2); [jest, pozycja]=ismember(zaklad,archiwum(end,:)); trafiono=cumsum(jest); if trafiono(1,end)>=round(size(zaklad,2)/2) clc; matryca(kolejne,1)=order; matryca(kolejne,2)=nowe; matryca(kolejne,3)=trafiono(end); matryca(kolejne,4)=size(zaklad,2); kolejne=kolejne+1; matryca end clear wyniki wyniki_sum zaklad end end Dodatkowe funkcje - o nich napiszę na sam koniec %------local function ----------------------------------- function mp = getPredictor(sysd) [A, B, C, D, K] = ssdata(sysd); Ts = sysd.Ts; Ny = size(D,1); mp = idss(A-K*C, [K B-K*D], C, [zeros(Ny), D], zeros(size(A,1),Ny), 'Ts', Ts); mp.InputDelay = [zeros(Ny,1); sysd.InputDelay]; ----------------------------------------------------------------------------------------------- function YP = forecasta(model,data,K, Init) %FORECAST Forecast a time series K steps into the future % % YF = FORECAST(MODEL,DATA,K) % % DATA: Existing data up to time N, an IDDATA object. % MODEL: The model as any IDMODEL object, IDPOLY, IDSS, IDARX or IDGREY. % K: The time horizon of forecasting, a positive integer with the number of samples % YF: The forecasted output after time N, an IDDATA object with output % only, covering the time span N+1:N+K. % % YF = FORECAST(MODEL,DATA,K, INIT) % wehere INIT is 'z' or 'e' allows specification of initial conditions (at % time = Data.SamplingInstants(1)). % % See also idmodel/predict, which computes a fixed horizon prediction % along the existing data record. [N, ny] = size(data); % assume data is iddata Mss = idss(model); ord = size(pvget(Mss,'A'),1); if ord>N error('Forecast:TooFewSamples','The data should contain at least %d samples.',ord) end if nargin<4, Init = 'e'; end yp = zeros(K,ny); mp = getPredictor(Mss); [Ap,Bp,Cp] = ssdata(mp); if Init=='z' xt = ltitr(Ap, Bp, data.y); % use zero init x0 = xt(end,:); else % Init == 'e' [A1,B1,C1,D1,K1] = ssdata(Mss); x00 = x0est(data.y,A1,B1,C1,D1,K1,size(C1,1),size(B1,2),250e3,eye(size(C1,1))); x0 = ltitr(Ap,Bp,data.y,x00); x0 = x0(end,:); end u = [data.y(end,:); zeros(1,ny)]; for ct = 1:K xt = ltitr(Ap, Bp, u, x0); x0 = xt(end,:); yp(ct,:) = (Cp*x0.').'; u = [yp(ct,:); zeros(1,ny)]; end YP = data; YP.y = yp; YP.u = []; YP.Name = ''; YP.UserData = []; YP.Notes = ''; YP.Tstart = data.Ts*(N+1); ------------------------------------------------------------------- |
2012-01-19 (16:59)![]() Data rejestracji: 2009-03-19 Ilość postów: 675 ![]() | wpis nr 489 317 [ CZCIONKA MONOSPACE ] O co chodzi z tą linearyzacją: Na wykresach poniżej widać, że suma losowanych liczb zbliżona jest do funkcji liniowej. Wykresy pokazują, jak to wygląda w przypadku 50, 200 i 2000 ostatnich losowań. Na wykresach pokazałem sumę wartości losowanych liczb: - pierwszej losowanej liczby (50 ostatnich losowań) ![]() - dwunastej losowanej liczby (200 ostatnich losowań) ![]() - siedemnastej losowanej liczby (2000 ostatnich losowań) ![]() |
2012-01-19 (17:19)![]() Data rejestracji: 2009-03-19 Ilość postów: 675 ![]() | wpis nr 489 319 [ CZCIONKA MONOSPACE ] Może ktoś z Was ma lepszy pomysł, w jaki sposób przedstawić wyniki losowań MM, żeby były, jak najlepiej, jak tylko jest to możliwe zbliżone do funkcji liniowej. W Matlabie jest zaimplementowane wiele funkcji linearyzacji danych liczbowych, w tym również w postaci binarnej. Nie testowałem tego, za mało czasu. Pozdrawiam Adalbert |
2012-01-19 (17:42)![]() Data rejestracji: 2009-01-23 Ilość postów: 2551 ![]() | wpis nr 489 325 [ CZCIONKA MONOSPACE ] Zauważ że sam fakt iż wynikiem są liczby ujemne - czyli zdarzenia niemożliwe - nasuwa wątpliwości. Moim zdaniem jest to złe podejście , skupiasz się na ilości branych pod uwagę wyników przeszłych a nie przywiązujesz uwagi do ich znaczenia w zależności od tego czy to wynik z wiersza nr 5000 czy 4999 czy 4900. Jak poradzić sobie z faktem że jest 20 kolumn . Przecież jeśli z kolumny A mamy prognozę 10 (już po porównaniu sumy i prognozy różnica = +10) to znaczy że pierwsza losowana jest typowana a nie jedna z 20 -stu losowanych. Czy można zatem powiedzieć że to samo bedzie gdy podasz tylko i wyłącznie jedną z 20 kolumn i otrzymasz jeden wynik dla tej kolumny a następnie powtórzysz to 20 razy z każdą następną kolumną ? Proponowałam zastosowanie średnich ważonych za n losowań i to n może mieć wartość = całej bazie losowań !!! Wynikiem będzie kolejna średnia która jeśli jest większa od ostatniej to zdarzenia ma wystąpić , a jeśli mniejsza to ma nie wystąpić. Ale wtedy dane reprezentują (średnia ważona) jedne konkretne zd.el. niech to będzie {kulkę o nr 10} czy rzut kostką {1 oczko} . Kilka przykładów co może nam podać sieć jako wynik. Przyjmuje że ostatnia wartość średniej ważonej = 3,50...coś tam po przecinku Prognoza to : 4,coś tam . wniosek : Średnia ma wzrosnąć więc zdarzenie ma wystąpić , wzrost o 0,5 nie jest ogromny więc mało zdecydowanie sieć prorokuje wystąpienie zdarzenia. Prognoza to : 5 Wniosek : średnia ma dużo wzrosnąć więc sieć zdecydowanie mówi że zdarzenie wystąpi Prognoza to : 3,6 . Wniosek : sieć nie wiem czy zdarzenie wystąpi czy nie i jest niezdecydowana Prognoza to : 3,4 > wniosek jak wyżej z tendencją do :raczej nie wystąpi Prognoza : 2 Wnisosek : zdecydowanie zdarzenie nie wystąpi. Co do faktu , że sieć będzie dobrze prognozować wtedy, kiedy kolejne zdarzenie i następne opisane są tym samym modelem, jak zdarzenia je poprzedzające - wynika to z modelu prostej sieci . Nie wiem bo jest to po za moja zdolnością percepcji jak będzie wyglądać sytuacja z sieciami (i tutaj budowa odgrywa ogromną rolę) wykorzystującymi element pamięci , sprzężeń i różnych typów neuronów w jednej sieci. Co raz więcej jest sieci "kombinowanych" które w części posiadają perceprton a w innym miejscu neuron Instar czy Outstar . Nie wiem czy właśnie główną rolę w tym problemie chaosu , po za sposobem podania wyników , odgrywa budowa sieci (na nią pośrednio wpływa sposób podania danych - przynajmniej w części neuronów wejściowych a pośrednio dalej) wiec dlatego potrzebna jest dość duża wiedza i narzędzie które pozwala na budowę sieci z różnych "klocków" a nie takie które pozwala na wykorzystanie tylko kilku(nastu) wariantów najpopularniejszych sieci. ustalenie wag przypomina ustalenie współczynników w wielomianie - bardzo statyczne i wątpliwe by działało w dynamicznym układzie - chaos. Sieć musi mieć możliwości "dynamiczne" a to jedynie jej sposób budowy może zmienić, ale to bardzo wysoka szkoła jazdy a ja jedynie mogę powiedzieć że czuję temat lecz nie mam wiedzy . Natomiast by ją zdobyć musiałabym rozpocząć studia w tym kierunku. |
2012-01-19 (17:45)![]() Data rejestracji: 2009-01-23 Ilość postów: 2551 ![]() | wpis nr 489 326 [ CZCIONKA MONOSPACE ] średnia ważona zrobi odwrotnie niż Ty chcesz, tzn nie zlinearyzuje a wydobedzie górki i dołki - zróżnicuje i moim zdaniem tak ma być a nie tak jak Ty chcesz. Zlinearyzownie jest be ![]() |
2012-01-19 (17:50)![]() Data rejestracji: 2010-11-17 Ilość postów: 1960 ![]() | wpis nr 489 327 [ CZCIONKA MONOSPACE ] Kurka Może sie ze mna zgodzisz może nie, lecz ja uważam cały czas- nie należy oczekiwać od sieci odpowiedzi na pytanie: jaka liczba wystąpi (odpowiedzi b. duzo), lecz należałoby raczej spytać: czy wystąpi (odpowiedzi są tylko 2) ![]() Pozdrawiam. |
2012-01-19 (17:57)![]() Data rejestracji: 2009-01-23 Ilość postów: 2551 ![]() | wpis nr 489 329 [ CZCIONKA MONOSPACE ] Toteż podałam taki przykładzik kiedy to na wyjściu mamy nową (przyszłą prorokowaną ) wartość średniej ważonej i w zależności od tego jaka jest wartość ostatnia i prorokowana możemy powiedzieć że sieć mówi mniej lub bardziej zdecydowanie TAK, czy NIE |
2012-01-19 (18:09)![]() Data rejestracji: 2009-01-23 Ilość postów: 2551 ![]() | wpis nr 489 334 [ CZCIONKA MONOSPACE ] Wynik rzutu kostką : 1,2,3,4,5,6,1,2,3,4,1,2,3,1,2,3,4,5,6,4,5,6 (ostatnie). Dla zd.el {6oczek} obliczamy średnią ważoną (i tutaj może być kilka wersji) i niech średnia będzie 3,5 (często w ostatnich wynikach jest 6 oczek to i średnia będzie wysoka) Dla zd.el. {1oczko} będzie na pewno mniej np 1,2 (w ostatnich wynikach nie ma 1 oczka) sieć prognozuje następną średnią ważoną i jeśli dla zd. el.{1oczko} poda nam wartość 3 to znaczy że "mocno" stoi na stanowisko że będzie {1oczko} a gdy również dla zdarzenia el.{6oczek} poda 4 to również mówi że będzie {6oczek} ale mniej zdecydowanie (różnica 4-3,5 = +0,5) natomiast dla 1oczka jest znacznie większa różnica (3-1,2= + 1,8). Przy propozycji nowej średniej mniejszej niż poprzednia np dla zd.el{1oczko} sieć poda nam wartość nową = 0,5 , sieć sugeruje że zdarzenia nie będzie i średnia spadnie niżej (0,5-1,1 = - 0,6) Można zatem przypisać p do każdego z el.zd. |
2012-01-19 (18:17)![]() Data rejestracji: 2010-11-17 Ilość postów: 1960 ![]() | wpis nr 489 335 [ CZCIONKA MONOSPACE ] Kurka Przepraszam bardzo że ja nie kumaty- nie rozumiem po co mieszać do tego wszystkiego kostkę do gry z 6 oczkami ![]() |
2012-01-19 (18:45)![]() Data rejestracji: 2009-01-23 Ilość postów: 2551 ![]() | wpis nr 489 340 [ CZCIONKA MONOSPACE ] Po to by zwrócić uwagę na BUDOWĘ sieci. wejście 1 --- neuron we -------> neuron warstwy ukrytej -------> neuron wy--> wejście 2 ----neuron we -------> neuron warstwy ukrytej -------> neuron wy--> ... ... wejście 6 ----neuron we -------> neuron warstwy ukrytej -------> neuron wy--> Między neuronami we i warstwy ukrytej są również połączenia. LUB : wejście 1 --- neuron we -------> neuron warstwy ukrytej -------> neuron wy--> Pierwsza sieć dostaje jako dane wynik rzutu kostką (6 możliwych zdarzeń) Druga tylko jedno zdarzenie i jak ogromna różnica w budowie sieci. teraz 80 kulek lub 20 . A może nawet 20 x po 80 . i budowa sieci tutaj może być dość różna a uzależniona od sposobu i rodzaju podanych danych. przy MM i tych wielkościach jak 20 losowanych z 80 możliwych a nie daj boże jeszcze kombinacji typu kolumny co może uczynić 20x80 = 1600 wejść oraz kostka do gry gdzie mamy dużo dużo prościej i łatwiej połapać się . Trzeba wiedzieć co się podaję by to miało sens a moim zdaniem to co teraz robi Adalbert nie ma sensu nie jest logiczne podanie i przygotowanie danych ze względu na nieporozumienia na eteapie budowy fragmentu wejściowego sieci. Może nie umiem tego przekonująco ująć ale trudno. |
2012-01-19 (18:46)![]() Data rejestracji: 2008-10-27 Ilość postów: 272 ![]() | wpis nr 489 341 [ CZCIONKA MONOSPACE ] kostką można łatwo rzucić, a bębnem niestety dużo trudniej. chociaż też można |
2012-01-19 (19:34)![]() Data rejestracji: 2009-03-19 Ilość postów: 675 ![]() | wpis nr 489 348 [ CZCIONKA MONOSPACE ] @Kurka Dziękuję za udział w dyskusji, propozycje. Sporo pytań, tez i wątpliwości. Nie na wszystko potrafię odpowiedzieć bo przekracza to moją wiedzę n/t sieci neuronowych, ale postaram się chociaż do tego ustosunkować. Żeby dało się to wszystko przeczytać będę tylko przytaczać fragment Twojej wypowiedzi. 1. „Zauważ że sam fakt iż wynikiem są liczby ujemne - czyli zdarzenia niemożliwe - nasuwa wątpliwości. Moim zdaniem jest to złe ………czy 4900. Być może przykład zamieszczony przeze mnie nasuwa taką wątpliwość. Przede wszystkim proszę zwrócić uwagę na to, że pierwszym etapem obliczeń, który opisałem jest znalezienie odpowiedzi na pytanie: Jakie parametry powinien mieć model AR (chodzi o ten order zmienną „nowe”), żeby prognoza miała skuteczność >=50% Oczywiście można tą pętlę for order=2:50 zastąpić pętlą for order=50:100 i z tego, co wiem nie będzie wartości ujemnych. Jako najmniejszy wykładnik potęgowania w modelu AR przyjmuję liczbę 2, a jako najmniejszy zakres analizowanych archiwalnych danych 2*order. Nie jest to najlepsze rozwiązanie ponieważ zmienna wyniki_sum zawiera tylko w pierwszej iteracji 4 liczby w każdej kolumnie i ich liniowość jest problematyczna: ![]() ![]() ![]() Nie mniej jednak nie bagatelizuję takich ustawień (order=2, nowe=2*order) ponieważ testując program wielokrotnie zdarzało się, że takie ustawienia były optymalne. W pewnym sensie masz rację pisząc, ze skupiam się m.in. na znalezieniu zakresu archiwalnej bazy losowań, które będę podstawiać do sieci, a nie na ich znaczeniu, ale taki model, takie założenia przyjąłem i na tym etapie nie zmieniam tego. Na pewno masz rację, że należałoby wprowadzić do programu dodatkowy element, który analizować będzie (jeszcze nie wiem jak) prognozowany zestaw liczb pod kątem np. jego „sensowności”. Nad tym trzeba by popracować. 2. „Jak poradzić sobie z faktem że jest 20 kolumn…. to znaczy że pierwsza losowana jest typowana a nie jedna z 20 -stu losowanych. „ Tu chyba nie rozumiemy się, każda kolumna to jedna z 80 losowanych liczb z zakresu 1:80. Program ma za zadanie wytypować, w każdej kolumnie sumę losowanych liczb na pozycji od 1 do 20, czyli w efekcie 20 liczb z zakresu 1:80. Oczywiście program typuje powtórki, które potem eliminuję. Jeżeli w kolumnie pierwszej program wytypuje liczbę 10, to jest to pierwsza losowana liczba, a nie pozycja liczby w zbiorze 1:20. Tak samo dobrze na pierwszym miejscu, czyli w kolumnie 1 z 20 program może wytypować liczbę 80 i będzie to oznaczać, że w/g tego programu pierwszą wylosowaną liczbą będzie 80. 3. Czy można zatem powiedzieć że ….powtórzysz to 20 razy z każdą następną kolumną ? Nie bardzo rozumiem, tzn, dokładnie to robię. Każda z kolumn tablicy wyniki_sum zawiera zsumowane wyniki losowań: pierwszej liczby, drugiej liczby…, aż do dwudziestej losowanej liczby. Na podstawie tak przygotowanej zmiennej wyniki_sum do sieci podstawiam każdą z kolumn oddzielnie i prognozuję kolejną sumę, czyli: - prognoza sumy pierwszej kolumny; - prognoza sumy drugiej kolumny; - …… - prognoza sumy dwudziestej kolumny Od takiej prognozy (razem 20 liczb będących niczym innym, jak sumą losowanych liczb na kolejnych pozycjach od 1:20) odejmuję ostatnią znaną sumę losowanych liczb, czyli to, co zawiera zmienna wyniki_sum w ostatnim wierszu. Ta różnica to nic innego, jak prognoza kolejnych 20 losowanych liczb. Oczywiście w przypadku ujemnych wartości prognozy, czy też spoza zakresu 1:80 lub też powtarzających się liczb otrzymamy mniej niż 20 prognozowanych liczb kolejnego losowania. 4. Proponowałam zastosowanie średnich ważonych za n losowań i to n ….Prognoza : 2 Wnisosek : zdecydowanie zdarzenie nie wystąpi. To może być interesujące, muszę się nad tym zastanowić, tzn. przełożyć to na język Matlaba i zobaczyć, co z tego wyjdzie. Zwracam jednak uwagę, że w tym co robię wykorzystuje się liniowość modelu AR i w tej chwili mogę tylko powiedzieć, że nie wiem, czy model liniowy poradzi sobie z takim podejściem. Testowałem sieci neuronowe na danych przygotowanych, jako modele binarne (0 lub 1 – zero jedynkowe). W Matlabie jest cały pakiet sieci neuronowych opartych na modelach XOR, EXOR itd., ale nie udało mi się osiągnąć zadowalających efektów. Po prostu za głupi jestem, żeby z tego skorzystać. Problemem nie jest wykorzystanie sieci, a odpowiednie przygotowanie danych do uczenia i testowania sieci. Przerobiłem kilkanaście, a może kilkadziesiąt różnych sposobów interpretacji wyników losowania w postaci 0-1 (nie-tak), ale nic mi z tego nie wyszło. Dość ciekawym rozwiązaniem w takim przypadku jest sieć GRNN (Generalized Regression Networks), czy też sieć PNN (Probabilistic Neural Networks), które prognozują zdarzenie losowe na podstawie 0/1 tablicy interpretującej dane wejściowe w oparciu o dowolne założenia, warunki, które sobie wymyślimy. Np., jeżeli wylosowano 1 to wylosują 80 – zdarzenie 1, jeżeli wylosowano 21 to nie wylosują 2 (zdarzenie 0), jeżeli wylosowano 1, 17, 21, to wylosują 76, 78, 79 (zdarzenie 1). Można kombinować, ale mnie z tego nic nie wyszło. 5. Co do faktu , że sieć będzie dobrze prognozować wtedy..,, wynika to z modelu prostej sieci .,,,,,,,,wykorzystującymi element pamięci , sprzężeń i różnych typów neuronów w jednej sieci.” Na ten temat wypowiadają się „cięższe” głowy niż moja. Czasami najprostszy model sieci jest zdecydowanie lepszy, od tych najbardziej rozbudowanych. Na szczęście w Matlabie mam do dyspozycji gotowe moduły sieci, gotowe procedury i z tego korzystam, a to, że nie zawsze wiem, jak to wykorzystać, czyli, jak przygotować dane dla sieci, żeby prognozowała w 100% wynik kolejnego losowania gier totalizatora jest przedmiotem bardzo zaawansowanych dyskusji na portalach poświęconych Matlabowi i sieciom neuronowym. 6. „Nie wiem czy właśnie główną rolę w tym problemie chaosu , po za sposobem podania wyników , odgrywa budowa sieci …. z różnych "klocków" a nie takie które pozwala na wykorzystanie tylko kilku(nastu) wariantów najpopularniejszych sieci.” Na temat wykorzystania sieci do prognozowania zdarzeń chaotycznych w zasobach Internetu można znaleźć setki, jeżeli nie tysiące informacji. Na stronie www.hackchina.com (trzeba wybrać anglojęzyczną wersję) można znaleźć gotowe programy w Matlabie. Również na forum Mathworks http://www.mathworks.com/matlabcentral/fileexchange/?term=tag%3A%22neural+network%22 jest bardzo dużo informacji. Prawdą natomiast jest to, że do tej pory nikomu nie udało się znaleźć 100% metody prognozowania losowań. I tym optymistycznym akcentem kończę ten mój przydługi wywód. Pamiętajmy jednak o tym, że kod Enigmy złamali Polacy, może kod Lotto również będzie można zapisać, jako naszą zasługę. Pozdrawiam Adalbert |
| Dodaj wpis w tym temacie | Spis tematów | Wyniki lotto | Strona: 1 2 3 4 5 6 7 ... 23 24 Wyślij wiadomość do admina |