Wejście
Macierz M
reprezentowana jako dwie oddzielone spacjami linie liczb całkowitych. Każda linia będzie miała tę samą liczbę liczb całkowitych, a każda liczba całkowita będzie wynosić -1 lub 1. Liczba liczb całkowitych w wierszu będzie wynosić co najwyżej 20. M
będzie zatem 2
, n
gdzie n
jest liczba liczb całkowitych w każdej z dwóch linii.
Twój kod powinien być kompletnym programem. i zaakceptuj dane wejściowe w standardowym pliku lub z pliku (to twój wybór). Możesz zaakceptować dane wejściowe ze standardowego wejścia, pliku lub po prostu jako parametr. Jeśli jednak zrobisz to drugie, podaj wyraźny przykład działania kodu i pamiętaj, że musi to być kompletny program i jak macierz M
będzie reprezentowana na wejściu. Innymi słowy, prawdopodobnie będziesz musiał parsować.
Wynik
Binarny Shannon entropia rozkładu M*x
, gdzie elementy x
są równomiernie i są niezależnie wybrane z {-1,1}. x
to n
wymiarowy wektor kolumny.
Entropia dyskretnego rozkładu prawdopodobieństwa jest
- sum p_i log_2(p_i)
W tym przypadku p_i
prawdopodobieństwo i
tego unikalnego jest możliwe M*x
.
Przykład i pomocne wskazówki
Jako sprawdzony przykład niech M
będzie macierz
-1 1
-1 -1
Teraz spójrz na wszystkie 2^2
możliwe wektory x
. Dla każdego obliczamy M*x
i umieszczamy wszystkie wyniki w tablicy (4-elementowa tablica 2-komponentowych wektorów). Chociaż dla każdego z 4 wektorów istnieje prawdopodobieństwo jego wystąpienia 1/2^2 = 1/4
, interesuje nas tylko liczba przypadków, w których wystąpi każdy unikalny wektor wynikowy M*x
, dlatego podsumowujemy indywidualne prawdopodobieństwa konfiguracji prowadzących do tych samych unikalnych wektorów. Innymi słowy, możliwe unikalne M*x
wektory opisują wyniki rozkładu, który badamy, i musimy określić prawdopodobieństwo każdego z tych wyników (które z założenia zawsze będą całkowitą wielokrotnością 1/2^2
lub 1/2^n
ogólnie) do obliczyć entropię.
W ogólnym n
przypadku, w zależności od M
możliwych wyników M*x
może wahać się od „wszystkie różne” (w tym przypadku mamy n
wartości i
in p_i
, i każda p_i
jest równa 1/2^n
), do „wszystkie takie same” (w tym przypadku jest jedna możliwa wynik i p_1 = 1
).
W szczególności dla powyższej 2x2
macierzy M
możemy przekonać się, mnożąc ją przez cztery możliwe konfiguracje ( [+-1; +-1]
), że każdy powstały wektor jest inny. Zatem w tym przypadku są cztery wyniki, a w konsekwencji p_1 = p_2 = p_3 = p_4 = 1/2^2 = 1/4
. Przypominając, że log_2(1/4) = -2
mamy:
- sum p_i log_2(p_i) = -(4*(-2)/4) = 2
Zatem końcowy wynik dla tej macierzy wynosi 2.
Przypadki testowe
Wejście:
-1 -1
-1 -1
Wynik:
1.5
Wejście:
-1 -1 -1 -1
-1 -1 -1 -1
Wynik:
2.03063906223
Wejście:
-1 -1 -1 1
1 -1 -1 -1
Wynik:
3
x
? 2. W jaki sposóbMx
definiuje się binarną entropię Shannona w celu uczynienia pytania samodzielnym ?Odpowiedzi:
Mathematica,
4868 bajtówEdycja: Dodano proces wstępny do akceptowania ciągu jako parametru.
Przy pomocy
Tuples
iEntropy
wdrożenie jest zarówno zwięzłe, jak i czytelne.gdzie
Tuples[{-1,1},n]
daje wszystkie możliwen
liczby z{-1,1}
iEntropy[2,list]
daje entropię informacji base-2.Jedną z fajnych rzeczy jest to, że Mathematica faktycznie zwróci dokładne wyrażenie:
Przybliżony wynik można uzyskać za pomocą dodatkowego
.
dodanego (Entropy[2., ...
).źródło
Perl,
160159141 bajtówzawiera +1 dla
-p
aktualizacji od 141 bajtówDane wejściowe są oczekiwane
STDIN
jako 2 linie składające się z oddzielonych spacjami1
lub-1
.Uruchom jako
perl -p 140.pl < inputfile
.Nie wygra żadnych nagród, ale pomyślałem, że podzielę się swoim wysiłkiem.
Wyjaśniono:
DANE
()
, używając**
zamiast<<
.$.
i-p
.źródło
Pyth, 37 bajtów
Zestaw testowy
Jest to nieco trudniejsze, gdy trzeba ręcznie zaimplementować mnożenie macierzy.
Wyjaśnienie:
źródło
MATLAB,
196194187184126154 bajtów(Dodatkowe 28 bajtów od 126 do 154 wynika z parsowania danych wejściowych: teraz kod akceptuje dane wejściowe jako dwa wiersze liczb oddzielonych spacjami.)
Wersja bez golfa:
Mógłbym pozbyć się 6 bajtów, gdyby
ans = ...
dozwolony był typ wyjściowy, nigdy nie jestem tego pewien.Z przykrością stwierdzam, że moje oryginalne i na pewno dowcipne rozwiązanie było zdecydowanie zbyt wolne od mojego obecnego rozwiązania. To także pierwszy raz, kiedy używam
accumarray
. Aplikacja z sześcioma parametrami wejściowymi musi jednak jeszcze poczekać :)Wyjścia (następujące
format long
):Dane wyjściowe z wartością domyślną
format short g
:źródło