Próbuję wynaleźć coś nowego w związku z sieciami neuronowymi, już mam koncepcję, ale nie wiem jak matematycznie rozwiązać następujący problem. Nie wiedziałem w jakim dziale umieścić ten wątek, jeżeli się pomyliłem, przepraszam.
Mamy dany ciąg n-ciu liczb (n>1), którego suma wszystkich wyrazów wynosi 1. Każdy z wyrazów zawiera się w przedziale (0; 1), to znaczy że każdy wyraz jest dodatni i mniejszy od 1.
Gdyby wszystkie liczby były "równo rozłożone", wówczas każdy wyraz miałby wartość 1/n (to chyba jasne). Szukam algorytmu, który zmodyfikuje każdy wyraz ciągu tak, aby:
- im wartość wyrazu jest większa od 1/n, tym bardziej zwiększ wartość wyrazu
- im wartość wyrazu jest bliższa 1, tym mniej zwiększ wartość wyrazu (każdy wyraz ciągu musi być mniejszy od 1)
- im wartość wyrazu jest mniejsza od 1/n, tym bardziej zmniejsz wartość wyrazu
- im wartość wyrazu jest bliższa 0, tym mniej zmniejsz wartość wyrazu (każdy wyraz ciągu musi być większy od 0)
- jeżeli wartość wyrazu jest równa 1/n, to pozostaw wyraz bez zmian
- zachowaj własność, że suma tego ciągu jest równa 1
Mam nadzieję, że w miarę dokładnie opisałem to, co chcę osiągnąć. Może mi ktoś pomóc? Uważam to za ciekawy problem i liczę na pomoc bardziej doświadczonych matematyków:)
"Przekształcenie" pewnego ciągu...
- max
- Użytkownik
- Posty: 3306
- Rejestracja: 10 gru 2005, o 17:48
- Płeć: Mężczyzna
- Lokalizacja: Lebendigentanz
- Podziękował: 37 razy
- Pomógł: 778 razy
"Przekształcenie" pewnego ciągu...
Skonkretyzuj - co algorytm ma dostawać (jakie dane), a co zwracać...chomzee pisze:Mam nadzieję, że w miarę dokładnie opisałem to, co chcę osiągnąć.
"Przekształcenie" pewnego ciągu...
Powiedzmy, że dostaje liczbę całkowitą n (n>1), a następnie n liczb zmiennoprzecinkowych z przedziału (0; 1) takich, że ich suma jest równa 1.
Na wyjściu chcę otrzymać te liczby w tej samej kolejności, jednakże proporcjonalnie zmienione - tym większe im są one większe od 1/n oraz tym mniejsze im mniejsze są one od 1/n. Suma ciągu na wyjściu również powinna być równa 1.
Zauważmy, że jeżeli liczby na wejściu są uszeregowane niemalejąco, to wynik również powinien być ciągiem niemalejącym.
Nie wiem dokładnie, co chcę wykonać z tymi liczbami, gdybym to wiedział, nie pytałbym się.
[ Dodano: 20 Czerwca 2007, 21:34 ]
To ja może wyjaśnię, co chcę osiągnąć, aby zobrazować mój problem.
Mamy neuron. Wpływa do niego dana (liczba zmiennoprzecinkowa), która następnie jest rozdzielana na kilka synaps (połączeń) do innych neuronów. Każda z synaps ma wagę (liczbę od 0 do 1), która mówi, jaką część sygnału ma przekazać kolejnemu neuronowi. Ważne jest to, aby suma wag synaps była równa 1 (chcę, aby sygnał się rozdzielał, a nie zmieniał swojej 'siły').
Chcę teraz zaimplementować 'uczenie'. Mianowicie - chcę wzmocnić te już silniejsze synapsy (których waga jest większa niż 1/n, gdzie n to liczba synaps) oraz osłabić już słabe synapsy (takie, których waga jest mniejsza niż 1/n). Oczywiście - po nauce synapsy znów mają tylko odpowiednio rozdzielać sygnał, to znaczy suma ich wag musi być równa 1.
Ma ktoś pomysł?
Na wyjściu chcę otrzymać te liczby w tej samej kolejności, jednakże proporcjonalnie zmienione - tym większe im są one większe od 1/n oraz tym mniejsze im mniejsze są one od 1/n. Suma ciągu na wyjściu również powinna być równa 1.
Zauważmy, że jeżeli liczby na wejściu są uszeregowane niemalejąco, to wynik również powinien być ciągiem niemalejącym.
Nie wiem dokładnie, co chcę wykonać z tymi liczbami, gdybym to wiedział, nie pytałbym się.
[ Dodano: 20 Czerwca 2007, 21:34 ]
To ja może wyjaśnię, co chcę osiągnąć, aby zobrazować mój problem.
Mamy neuron. Wpływa do niego dana (liczba zmiennoprzecinkowa), która następnie jest rozdzielana na kilka synaps (połączeń) do innych neuronów. Każda z synaps ma wagę (liczbę od 0 do 1), która mówi, jaką część sygnału ma przekazać kolejnemu neuronowi. Ważne jest to, aby suma wag synaps była równa 1 (chcę, aby sygnał się rozdzielał, a nie zmieniał swojej 'siły').
Chcę teraz zaimplementować 'uczenie'. Mianowicie - chcę wzmocnić te już silniejsze synapsy (których waga jest większa niż 1/n, gdzie n to liczba synaps) oraz osłabić już słabe synapsy (takie, których waga jest mniejsza niż 1/n). Oczywiście - po nauce synapsy znów mają tylko odpowiednio rozdzielać sygnał, to znaczy suma ich wag musi być równa 1.
Ma ktoś pomysł?
- max
- Użytkownik
- Posty: 3306
- Rejestracja: 10 gru 2005, o 17:48
- Płeć: Mężczyzna
- Lokalizacja: Lebendigentanz
- Podziękował: 37 razy
- Pomógł: 778 razy
"Przekształcenie" pewnego ciągu...
Nie czuję się mocny w temacie sieci neuronowych, ale mogę chociaż wynotować jakieś przydatne oczywistości...
Na początek kilka uwag ogólnych:
Możesz rozdzielić zbiór krawędzi na trzy i dalej rozpatrywać każdy z nich z osobna:
A. krawędzie o wagach \(\displaystyle{ \tfrac{1}{n}}\), w dalszym rozumowaniu będziemy je pomijać
B. krawędzie o wagach większych od \(\displaystyle{ \tfrac{1}{n}}\) - mamy zwiększyć każdą z nich
C. krawędzie o wagach mniejszych od \(\displaystyle{ \tfrac{1}{n}}\) - mamy zmniejszyć każdą z nich.
Algorytm zmiany układu wartości wag ma zachowywać uporządkowanie tych wartości, przy czym:
-zauważmy, że zachowanie uporządkowania wartości wag krawędzi ze zbiorów B i C jest równoznaczne z zachowaniem uporządkowania tych wag dla wszystkich rozpatrywanych krawędzi
-zauważmy również, że łączny wzrost wag krawędzi w zbiorze B jest równy łącznemu spadkowi wag krawędzi w zbiorze C.
No i teraz na pewno można różnie, co powinno zależeć też w dużej mierze od tego, co chcesz osiągnąć - znaczenie będzie mieć zarówno to, jak duży łączny wzrost (lub łączny spadek, na jedno wychodzi) zakładasz jak i to, w jaki sposób chcesz ustalić zależność między wzrostem/spadkiem danej wagi, a jej odległością od bliższego końca przedziału \(\displaystyle{ (0,1)}\).
Btw - być może Cię to zainteresuje:
(są tam też wykłady ze sztucznej inteligencji)
Pozdrawiam
Na początek kilka uwag ogólnych:
Możesz rozdzielić zbiór krawędzi na trzy i dalej rozpatrywać każdy z nich z osobna:
A. krawędzie o wagach \(\displaystyle{ \tfrac{1}{n}}\), w dalszym rozumowaniu będziemy je pomijać
B. krawędzie o wagach większych od \(\displaystyle{ \tfrac{1}{n}}\) - mamy zwiększyć każdą z nich
C. krawędzie o wagach mniejszych od \(\displaystyle{ \tfrac{1}{n}}\) - mamy zmniejszyć każdą z nich.
Algorytm zmiany układu wartości wag ma zachowywać uporządkowanie tych wartości, przy czym:
-zauważmy, że zachowanie uporządkowania wartości wag krawędzi ze zbiorów B i C jest równoznaczne z zachowaniem uporządkowania tych wag dla wszystkich rozpatrywanych krawędzi
-zauważmy również, że łączny wzrost wag krawędzi w zbiorze B jest równy łącznemu spadkowi wag krawędzi w zbiorze C.
No i teraz na pewno można różnie, co powinno zależeć też w dużej mierze od tego, co chcesz osiągnąć - znaczenie będzie mieć zarówno to, jak duży łączny wzrost (lub łączny spadek, na jedno wychodzi) zakładasz jak i to, w jaki sposób chcesz ustalić zależność między wzrostem/spadkiem danej wagi, a jej odległością od bliższego końca przedziału \(\displaystyle{ (0,1)}\).
Btw - być może Cię to zainteresuje:
(są tam też wykłady ze sztucznej inteligencji)
Pozdrawiam
-
- Użytkownik
- Posty: 374
- Rejestracja: 21 cze 2007, o 11:28
- Płeć: Mężczyzna
- Lokalizacja: Łostowice
- Pomógł: 146 razy
"Przekształcenie" pewnego ciągu...
Niech wspp oznacza współczynnik zbliżania się wyrazów ciągu do wartości 1/n
n - liczba wyrazów ciągu,
wspp powinien się mieścić w przedziale od 0 do 1,
dla 1 wszystkie wyrazy przyjmą wartość 1/n, natomiast dla 0 pozostaną niezmienione.
Wartość wejściowa wyraz ciągu \(\displaystyle{ i_{we}}\)
Wartość wyjściowa wyraz ciągu \(\displaystyle{ i_{wy}}\)
\(\displaystyle{ i_{wy} = i_{we} + wspp (\frac{1}{n} - i_{we})}\)
Wartości ciągu wejściowego wczytujemy po kolei i zwracamy na bieżąco kolejne wartości wyrazów ciągu wyjściowego.
n - liczba wyrazów ciągu,
wspp powinien się mieścić w przedziale od 0 do 1,
dla 1 wszystkie wyrazy przyjmą wartość 1/n, natomiast dla 0 pozostaną niezmienione.
Wartość wejściowa wyraz ciągu \(\displaystyle{ i_{we}}\)
Wartość wyjściowa wyraz ciągu \(\displaystyle{ i_{wy}}\)
\(\displaystyle{ i_{wy} = i_{we} + wspp (\frac{1}{n} - i_{we})}\)
Wartości ciągu wejściowego wczytujemy po kolei i zwracamy na bieżąco kolejne wartości wyrazów ciągu wyjściowego.
- max
- Użytkownik
- Posty: 3306
- Rejestracja: 10 gru 2005, o 17:48
- Płeć: Mężczyzna
- Lokalizacja: Lebendigentanz
- Podziękował: 37 razy
- Pomógł: 778 razy
"Przekształcenie" pewnego ciągu...
Zdaje się, że chomzee chodziło o to, aby oddalić wyrazy danego ciągu od \(\displaystyle{ \tfrac{1}{n}}\), a nie je zbliżyć... dlatego też, aby uzyskać żądany efekt proponowaną metodą, należałoby zmienić znaki w nawiasie.
-
- Użytkownik
- Posty: 374
- Rejestracja: 21 cze 2007, o 11:28
- Płeć: Mężczyzna
- Lokalizacja: Łostowice
- Pomógł: 146 razy
"Przekształcenie" pewnego ciągu...
Faktycznie, nie doczytałem, myślałem, że chodzi o wyłagodzenie ciągu, a nie o zaostrzenie.
Jednak wtedy sama zmianu znaku we wzorze nie jest wystarczająca bo \(\displaystyle{ i_{wy}}\) może znaleźć się poza zakresem od 0 do 1.
Nalezy zamienić we wzorze \(\displaystyle{ i_{we}}\) z \(\displaystyle{ i_{wy}}\) i wyliczyć \(\displaystyle{ i_{wy}}\).
Jednak wtedy sama zmianu znaku we wzorze nie jest wystarczająca bo \(\displaystyle{ i_{wy}}\) może znaleźć się poza zakresem od 0 do 1.
Nalezy zamienić we wzorze \(\displaystyle{ i_{we}}\) z \(\displaystyle{ i_{wy}}\) i wyliczyć \(\displaystyle{ i_{wy}}\).