Zastanawiam się tylko, czy ktoś jest zaznajomiony z grupowaniem nominalnych danych wejściowych. Patrzyłem na SOM jako rozwiązanie, ale najwyraźniej działa tylko z funkcjami numerycznymi. Czy są jakieś rozszerzenia dla funkcji jakościowych? W szczególności zastanawiałem się nad „Dniami tygodnia” jako możliwymi funkcjami. Oczywiście możliwe jest przekonwertowanie go na funkcję numeryczną (tj. Pn - Nd odpowiadające numerom 1-7), jednak odległość euklidesowa między Słońcem a Pn (1 i 7) nie byłaby taka sama jak odległość od Pn do Wt (1 i 2) ). Wszelkie sugestie i pomysły będą mile widziane.
11
Odpowiedzi:
Tło:
Najbardziej logicznym sposobem na przekształcenie godziny są dwie zmienne, które kołyszą się w jedną i drugą synchronizację. Wyobraź sobie pozycję końca wskazówki godzinowej 24-godzinnego zegara. Te
x
wahania pozycji iz powrotem zsynchronizowany zy
pozycji. Na zegarze 24-godzinnym można to osiągnąć zx=sin(2pi*hour/24)
,y=cos(2pi*hour/24)
.Potrzebujesz obu zmiennych lub utracisz właściwy ruch w czasie. Wynika to z faktu, że pochodna grzechu lub cos zmienia się w czasie, podczas gdy
(x,y)
pozycja zmienia się płynnie, gdy przemieszcza się po okręgu jednostki.Na koniec zastanów się, czy warto dodać trzecią cechę do śledzenia czasu liniowego, którą można skonstruować jako godziny (lub minuty lub sekundy) od początku pierwszego rekordu lub uniksowy znacznik czasu lub coś podobnego. Te trzy cechy zapewniają następnie przybliżenie zarówno cyklicznego, jak i liniowego przebiegu czasu, np. Można wyciągać zjawiska cykliczne, takie jak cykle snu w ruchu ludzi, a także liniowy wzrost, taki jak populacja w funkcji czasu.
Przykład realizacji:
Teraz wypróbujmy:
Ledwo widać, że niektóre są po północy dołączone do zielonej gromady przed północą. Teraz zmniejszmy liczbę klastrów i pokażmy, że przed i po północy można połączyć bardziej szczegółowo w jednym klastrze:
Zobacz, jak niebieski klaster zawiera czasy sprzed i po północy, które są skupione w tym samym klastrze ...
Możesz to zrobić dla czasu, dnia tygodnia, tygodnia miesiąca, dnia miesiąca, sezonu lub cokolwiek innego.
źródło
Zwykle zmienne nominalne są kodami obojętnymi, gdy są używane w SOM (np. Jedna zmienna z 1 dla poniedziałku 0 dla nie poniedziałku, inna dla wtorku itp.).
Możesz dołączyć dodatkowe informacje, tworząc połączone kategorie sąsiednich dni. Na przykład: poniedziałek i wtorek, wtorek i środa itp. Jeśli jednak dane dotyczą ludzkich zachowań, często bardziej użyteczne jest użycie kategorii Dzień tygodnia i Weekend.
źródło
W przypadku zmiennych nominalnych typowe kodowanie w sieci neuronowej lub w inżynierii elektrycznej nazywa się „jednym gorącym” - wektorem wszystkich zer, z jednym 1 w odpowiedniej pozycji dla wartości zmiennej. Na przykład w dni tygodnia jest siedem dni, więc twoje gorące wektory miałyby długość siedmiu. Wtedy poniedziałek będzie reprezentowany jako [1 0 0 0 0 0 0], wtorek jako [0 1 0 0 0 0 0] itd.
Jak wskazał Tim, podejście to można łatwo uogólnić, aby objąć dowolne wektory cech boolowskich, w których każda pozycja w wektorze odpowiada funkcji będącej przedmiotem zainteresowania twoich danych, a pozycja jest ustawiona na 1 lub 0, aby wskazać obecność lub jej brak. funkcja.
Kiedy masz już wektory binarne, odległość Hamminga staje się naturalną miarą, chociaż odległość euklidesowa jest również używana. W przypadku pojedynczych gorących wektorów binarnych SOM (lub inny aproksymator funkcji) naturalnie interpoluje od 0 do 1 dla każdej pozycji wektora. W tym przypadku wektory te są często traktowane jako parametry rozkładu Boltzmanna lub softmax w przestrzeni zmiennej nominalnej; takie traktowanie daje również możliwość wykorzystania wektorów w pewnym scenariuszu dywergencji KL.
Zmienne cykliczne są znacznie trudniejsze. Jak powiedział Arthur w komentarzach, musisz sam zdefiniować metrykę odległości, która uwzględnia cykliczny charakter zmiennej.
źródło
Zakładając, że dzień tygodnia (dow) zaczyna się od [0, 6], zamiast wyświetlać dane w kręgu, inną opcją jest użycie:
Aby zrozumieć dlaczego, rozważ dow jako zegar
różnica między 6 a 1 może wynosić 6 - 1 = 5 (idąc od 1 do 6 zgodnie z ruchem wskazówek zegara) lub 7 - (6 - 1) = 2. Biorąc min z obu opcji, powinno wystarczyć.
Ogólnie możesz użyć:
min(abs(diff), range - abs(diff))
źródło
Z powodzeniem zakodowałem Dni tygodnia (i Miesiące roku) jako krotkę (cos, sin), jak podkreślono w swoim komentarzu. Niż wykorzystana odległość euklidesowa.
To jest przykład kodu wr:
Odległość euklidesowa między 0 a 6 jest równa 0 i 1.
źródło