Eingang
Eine Matrix, M
die als zwei durch Leerzeichen getrennte Zeilen von ganzen Zahlen dargestellt wird. Jede Zeile hat die gleiche Anzahl von Ganzzahlen, und jede Ganzzahl ist entweder -1 oder 1. Die Anzahl von Ganzzahlen pro Zeile beträgt höchstens 20. M
Daher wird angegeben, 2
von n
won
die Anzahl der ganzen Zahlen auf jedem der beiden Linien.
Ihr Code sollte ein vollständiges Programm sein. und akzeptieren Sie die Eingabe entweder über Standard in oder aus einer Datei (das ist Ihre Wahl). Sie können Eingaben von standard in, aus einer Datei oder einfach als Parameter akzeptieren. Wenn Sie jedoch Letzteres tun, geben Sie bitte ein explizites Beispiel dafür, wie Ihr Code funktionieren soll, und denken Sie daran, dass es sich um ein vollständiges Programm handeln muss und wie die Matrix M
in der Eingabe dargestellt wird. Mit anderen Worten, es ist wahrscheinlich, dass Sie eine Analyse durchführen müssen.
Ausgabe
Die binäre Shannon-Entropie der Verteilung, in der M*x
die Elemente von x
gleichmäßig und unabhängig voneinander aus {-1,1} ausgewählt werden. x
ist ein n
eindimensionaler Spaltenvektor.
Die Entropie einer diskreten Wahrscheinlichkeitsverteilung ist
- sum p_i log_2(p_i)
In diesem Fall p_i
ist die Wahrscheinlichkeit der i
Eindeutig keit möglich M*x
.
Beispiel und hilfreiche Tipps
Als bearbeitetes Beispiel sei die Matrix M
sein
-1 1
-1 -1
Schauen Sie sich nun alle 2^2
möglichen Vektoren an x
. Für jedes berechnen wir M*x
alle Ergebnisse und fügen sie in ein Array ein (ein 4-Element-Array von 2-Komponenten-Vektoren). Obwohl für jede der 4 Vektoren die Wahrscheinlichkeit der es auftritt , ist 1/2^2 = 1/4
, sind wir nur in der Anzahl der Male interessiert jeder einzigartigen resultierenden Vektors M*x
auftritt, und so bis Wir fassen die einzelnen Wahrscheinlichkeiten der Konfigurationen auf die gleichen einzigartigen Vektoren führt. Mit anderen Worten, die möglichen eindeutigen M*x
Vektoren beschreiben die Ergebnisse der Verteilung, die wir untersuchen, und wir müssen die Wahrscheinlichkeit jedes dieser Ergebnisse bestimmen (die konstruktionsbedingt immer ein ganzzahliges Vielfaches von 1/2^2
oder sein werden1/2^n
im Allgemeinen sein werden) Berechnen Sie die Entropie.
n
Abhängig von M
den möglichen Ergebnissen von M*x
kann der Bereich im Allgemeinen von "alle unterschiedlich" (in diesem Fall haben wir n
Werte von i
in p_i
und jeder p_i
ist gleich 1/2^n
) bis "alle gleich" (in diesem Fall gibt es ein einzelnes mögliches) reichen Ergebnis, und p_1 = 1
).
Insbesondere können wir für die obige 2x2
Matrix M
durch Multiplizieren mit den vier möglichen Konfigurationen ( [+-1; +-1]
) feststellen , dass jeder resultierende Vektor unterschiedlich ist. In diesem Fall gibt es also vier Ergebnisse und folglich p_1 = p_2 = p_3 = p_4 = 1/2^2 = 1/4
. Daran erinnern, dass log_2(1/4) = -2
wir haben:
- sum p_i log_2(p_i) = -(4*(-2)/4) = 2
Die endgültige Ausgabe für diese Matrix ist also 2.
Testfälle
Eingang:
-1 -1
-1 -1
Ausgabe:
1.5
Eingang:
-1 -1 -1 -1
-1 -1 -1 -1
Ausgabe:
2.03063906223
Eingang:
-1 -1 -1 1
1 -1 -1 -1
Ausgabe:
3
x
? 2. Wie wird die binäre Shannon-EntropieMx
definiert , um die Frage in sich geschlossen zu machen ?Antworten:
Mathematica,
4868 BytesBearbeiten: Vorverarbeitung wird hinzugefügt, um Zeichenfolge als Parameter zu akzeptieren.
Mit Hilfe von
Tuples
undEntropy
ist die Implementierung übersichtlich und lesbar.wo
Tuples[{-1,1},n]
gibt alle möglichenn
-Tupeln aus{-1,1}
undEntropy[2,list]
gibt die Basis-2 - Informationen Entropie.Eines der coolen Dinge ist das Mathematica tatsächlich einen genauen Ausdruck zurückgibt:
Das ungefähre Ergebnis kann mit einem zusätzlichen
.
(Entropy[2., ...
) erreicht werden.quelle
Perl,
160,159141 BytesEnthält +1 für das
-p
141-Byte-UpdateDie Eingabe wird auf
STDIN
2 Zeilen bestehend aus Leerzeichen1
oder erwartet-1
.Führen Sie so
perl -p 140.pl < inputfile
.Es wird keine Preise gewinnen, aber ich dachte, ich würde meine Bemühungen teilen.
Erklärt:
DATEN
()
mit**
anstatt<<
.$.
und-p
.quelle
Pyth, 37 Bytes
Testsuite
Dies ist etwas schwieriger, wenn Sie die Matrixmultiplikation manuell implementieren müssen.
Erläuterung:
quelle
MATLAB,
196194187184126154 Bytes(Die zusätzlichen 28 Bytes von 126 bis 154 sind auf die Syntaxanalyse der Eingaben zurückzuführen. Der Code akzeptiert die Eingabe nun als zwei Zeilen mit durch Leerzeichen getrennten Zahlen.)
Ungolfed-Version:
Ich könnte mit 6 Bytes aufhören, wenn ein "
ans = ...
" Art von Ausgabe erlaubt wäre, da bin ich mir nie sicher.Es tut mir leid zu sagen, dass meine originelle und sicherlich witzige Lösung im Vergleich zu meiner aktuellen Lösung viel zu ungolfed war. Dies ist auch das erste Mal, dass ich verwende
accumarray
. Eine Anwendung mit sechs Eingabeparametern muss allerdings noch warten :)Ausgänge (folgend
format long
):Ausgaben mit der Standardeinstellung
format short g
:quelle