2016-05-27 13 views
0

diese Frage zu einem früheren in Fortsetzung ist gefragt Matlab : Plot of entropy vs digitized code lengthMatlab: Hilfe in Entropieschätzung einer disretized Zeitreihe

Ich mag die Entropie einer Zufallsvariablen berechnen, die diskretisierten Version (0/1) eines ist kontinuierliche Zufallsvariable x. Die Zufallsvariable bezeichnet den Zustand eines nichtlinearen dynamischen Systems, das als Tent Map bezeichnet wird. Iterationen der Tent Map ergeben eine Zeitreihe der Länge N.

Der Code sollte beendet werden, sobald die Entropie der diskretisierten Zeitreihe gleich der Entropie des dynamischen Systems wird. Es ist theoretisch bekannt, dass die Entropie des Systems log_2 (2) ist. Der Code wird beendet, aber die ersten 3 Werte des Entropy-Arrays sind fehlerhaft - entropy(1) = 1, entropy(2) = NaN and entropy(3) = NaN. Ich kratze mich am Kopf, warum das passiert und wie ich es loswerden kann. Bitte helfen Sie bei der Korrektur des Codes. Danke.

clear all 


H = log(2) 

threshold = 0.5; 
x(1) = rand; 
lambda(1) = 1; 
entropy(1,1) = 1; 
j=2; 
tol=0.01; 
while(~(abs(lambda-H)<tol)) 



    if x(j - 1) < 0.5   
     x(j) = 2 * x(j - 1);       
    else 
     x(j) = 2 * (1 - x(j - 1));      
    end 



s = (x>=threshold); 
p_1 = sum(s==1)/length(s); 
p_0 = sum(s==0)/length(s); 
entropy(:,j) = -p_1*log2(p_1)-(1-p_1)*log2(1-p_1); 
lambda = entropy(:,j); 
j = j+1; 
end 
plot(entropy) 
+0

Hallo dort. Bitte lösche, ändere oder vandalisiere deine Fragen nicht, nachdem eine Antwort eingegangen ist. Ich sehe den Zweck deiner letzten Bearbeitung nicht, die so viel von der Frage entfernt hat, dass sie unklar/außer Thema wäre, also ich habe es zurückgerollt. – halfer

Antwort

1

Es sieht aus wie eine Ihrer Wahrscheinlichkeiten ist Null. In diesem Fall würden Sie versuchen, 0*log(0) = 0*-Inf = NaN zu berechnen. Die Entropie sollte in diesem Fall Null sein, also können Sie diese Bedingung explizit überprüfen.

Paar Seite Notizen: Es sieht aus wie Sie H=log(2) deklarieren, aber Ihr Beitrag sagt die Entropie ist log_2 (2). p_0 ist immer 1 - p_1, Sie müssen also nicht alles neu zählen. Das dynamische Anwachsen der Arrays ist ineffizient, da Matlab den gesamten Inhalt bei jedem Schritt neu kopieren muss. Sie können die Dinge beschleunigen, indem Sie sie vorab zuweisen (das ist es nur wert, wenn Sie viele Zeitschritte laufen).

+0

Vielen Dank für Ihre Antwort. Ich deklariere H = log (2), da es die Entropie des Systems ist. Ich berechne die Entropie der Biary-Zeitreihe und beende das Programm, wenn die Entropie der Zeitreihe (dekrementiert durch die Entropievariable) = H. Ist H = log (2) nicht gleich Log 2 (2)? Gibt es auch eine Möglichkeit, keine Nullwahrscheinlichkeiten zu haben? Die Zeichenfolge ist in Nullen und Einsen, also frage ich mich, warum die Wahrscheinlichkeit null wird. – SKM

+1

Nach der ersten Iteration durch die Schleife enthält 's' entweder eine einzelne oder eine einzelne Null, so dass die Wahrscheinlichkeit für den anderen Wert Null ist. Es ist jedoch kein großes Problem, Sie können einfach eine if-Anweisung verwenden, um dies zu überprüfen, und die Entropie auf Null setzen, wenn dies der Fall ist. – user20160