WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Transinformation / Mutual information

 

agent_fux
Forum-Anfänger

Forum-Anfänger


Beiträge: 32
Anmeldedatum: 12.01.17
Wohnort: ---
Version: MATLAB R2016b student use
     Beitrag Verfasst am: 29.01.2017, 23:37     Titel: Transinformation / Mutual information
  Antworten mit Zitat      
Hallo,

gibt es in Matlab eine Funktion für die Transinformation (engl. mutual information), mit der ich den Zusammenhang von zwei Variablen erklären kann? Ich möchte gern die Wirkung der Beschleunigung auf den Partikelausstoß beim PKW erklären. Die Korrelationsanalyse bringt einen Wert hervor, der auf einen schwachen Zusammenhang schließen lässt, was ich nicht wirklich glaube. Ich habe bereits bei Google gesucht, aber nichts brauchbares gefunden. Da sind von Usern Funktionen geschrieben, die bei mir nicht so recht funktionieren.

Hier ein Beispiel:

Code:
function M = MI_GG(X,Y)
% function M = MI_GG(X,Y)
% Compute the mutual information of two images: X and Y, having
% integer values.
%
% INPUT:
% X --> first image
% Y --> second image (same size of X)
%
% OUTPUT:
% M --> mutual information of X and Y
%
% Written by GIANGREGORIO Generoso.
% DATE: 04/05/2012
% E-MAIL: ggiangre@unisannio.it
%__________________________________________________________________________

X = double(X);
Y = double(Y);

X_norm = X - min(X(:)) +1;
Y_norm = Y - min(Y(:)) +1;

matAB(:,1) = X_norm(:);
matAB(:,2) = Y_norm(:);
h = accumarray(matAB+1, 1); % joint histogram

hn = h./sum(h(:)); % normalized joint histogram
y_marg=sum(hn,1);
x_marg=sum(hn,2);

Hy = - sum(y_marg.*log2(y_marg + (y_marg == 0))); % Entropy of Y
Hx = - sum(x_marg.*log2(x_marg + (x_marg == 0))); % Entropy of X

arg_xy2 = hn.*(log2(hn+(hn==0)));
h_xy = sum(-arg_xy2(:)); % joint entropy
M = Hx + Hy - h_xy; % mutual information


Wenn ich die Funktion ausführe, erhalte ich eine Fehlermeldung, dass die Argumente in der Funktion fehlen? Ich habe aber X und Y im Workspace jeweils definiert. Was mache ich falsch?
Private Nachricht senden Benutzer-Profile anzeigen


AKNOT
Forum-Century

Forum-Century


Beiträge: 129
Anmeldedatum: 12.10.11
Wohnort: Bochum
Version: R2018a
     Beitrag Verfasst am: 30.01.2017, 08:32     Titel:
  Antworten mit Zitat      
Hi,

wie rufst du die Funktion auf? Wenn X und Y im WS definiert sind, sollte der Aufruf

Code:
M = MI_GG(X,Y)


aus dem Command Window oder aus einem Skript funktionieren. Nicht einfach in der Funktionsdatei auf Run klicken, da fehlt ja der korrekte Aufruf...
Private Nachricht senden Benutzer-Profile anzeigen
 
agent_fux
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 32
Anmeldedatum: 12.01.17
Wohnort: ---
Version: MATLAB R2016b student use
     Beitrag Verfasst am: 30.01.2017, 09:05     Titel:
  Antworten mit Zitat      
Ich definiere X und Y und dann klicke ich auf RUN des oben gebosteten Codes.
Private Nachricht senden Benutzer-Profile anzeigen
 
AKNOT
Forum-Century

Forum-Century


Beiträge: 129
Anmeldedatum: 12.10.11
Wohnort: Bochum
Version: R2018a
     Beitrag Verfasst am: 30.01.2017, 09:19     Titel:
  Antworten mit Zitat      
Hallo,

das geht nicht, da es sich um eine Funktion handelt. Eine Funktion muss konkret mit den Übergabeparametern aufgerufen werden. Also statt auf Run drücken, ein mal im Command Window

Code:
M = MI_GG(X,Y)


eingeben.
Private Nachricht senden Benutzer-Profile anzeigen
 
agent_fux
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 32
Anmeldedatum: 12.01.17
Wohnort: ---
Version: MATLAB R2016b student use
     Beitrag Verfasst am: 30.01.2017, 11:25     Titel:
  Antworten mit Zitat      
Ok, jetzt habe ich es verstanden. Aber es funktioniert trotzdem nicht und ich bekomme die Fehlermeldung: "First input SUBS must contain positive integer subscripts." Denn ich habe auch negative rationale Zahlen. Und nun meine Frage: Funktioniert Transinformation nur bei natürlichen Zahlen oder ist das hier eine Frage der Programmierung?
Private Nachricht senden Benutzer-Profile anzeigen
 
Andreas Goser
Forum-Meister

Forum-Meister


Beiträge: 3.654
Anmeldedatum: 04.12.08
Wohnort: Ismaning
Version: 1.0
     Beitrag Verfasst am: 30.01.2017, 11:47     Titel:
  Antworten mit Zitat      
Ich kenne Mutual Information nur im Zusammenhang mit Bildverarbeitung und kann diese FEX Submission empfehlen: http://www.mathworks.com/matlabcent.....rmation-betweentwo-images

Andreas
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
agent_fux
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 32
Anmeldedatum: 12.01.17
Wohnort: ---
Version: MATLAB R2016b student use
     Beitrag Verfasst am: 30.01.2017, 11:52     Titel:
  Antworten mit Zitat      
Diese Funktion habe ich bereits ausprobiert und auch hier in meinem Forumeintrag erwähnt, aber ich bekomme die Fehlermeldung "First input SUBS must contain positive integer subscripts."
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 30.01.2017, 12:43     Titel:
  Antworten mit Zitat      
Hallo,

bitte immer die komplette Fehlermeldung posten.
Der Autor schreibt ja in der Dokumentation, dass der Code nur für Integer gedacht ist:
Zitat:
X and Y, having integer values.


Auch auf der File Exchange-Seite hat jemand im Diskussionsteil das gleiche Problem geschildert, und die Antwort war, dass X und Y eben integer-wertig sein müssen.

Das Problem mit den fehlenden Eingabeargumenten wurde dort übrigens auch schon behandelt.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
agent_fux
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 32
Anmeldedatum: 12.01.17
Wohnort: ---
Version: MATLAB R2016b student use
     Beitrag Verfasst am: 31.01.2017, 09:52     Titel:
  Antworten mit Zitat      
Ich habe jetzt meine Daten so modifiziert, dass diese Integer sind mit dem Format uint64 und erneut die o.g. Funktion angewendet. Dabei erhalte ich folgende Fehlermeldung:

Code:
>> M = MI_GG(X,Y)
Error using accumarray
Maximum variable size allowed by the program is exceeded.

Error in MI_GG (line 26)
h = accumarray(matAB+1, 1); % joint histogram


Habe ich eine Möglichkeit, die Kapazität der Funktion zu ändern? Meine Variablen sind in der Dimension 42888x1.

Außerdem habe ich eine weiter Funktion gefunden, um die Transinformation zu berechnen:

Code:
function z = mutInfo(x, y)
% Compute mutual information I(x,y) of two discrete variables x and y.
% Input:
%   x, y: two integer vector of the same length
% Output:
%   z: mutual information z=I(x,y)
% Written by Mo Chen (sth4nth@gmail.com).
assert(numel(x) == numel(y));
n = numel(x);
x = reshape(x,1,n);
y = reshape(y,1,n);

l = min(min(x),min(y));
x = x-l+1;
y = y-l+1;
k = max(max(x),max(y));

idx = 1:n;
Mx = sparse(idx,x,1,n,k,n);
My = sparse(idx,y,1,n,k,n);
Pxy = nonzeros(Mx'*My/n); %joint distribution of x and y
Hxy = -dot(Pxy,log2(Pxy));

Px = nonzeros(mean(Mx,1));
Py = nonzeros(mean(My,1));

% entropy of Py and Px
Hx = -dot(Px,log2(Px));
Hy = -dot(Py,log2(Py));
% mutual information
z = Hx+Hy-Hxy;
z = max(0,z);


Hier erhalte ich diese Fehlermeldung:

Code:
>> z = mutInfo(x, y)
Undefined function 'sparse' for input arguments of type 'uint64'.

Error in mutInfo (line 19)
Mx = sparse(idx,x,1,n,k,n);


Trotz meiner Daten als Integer akzeptiert die Funktion type 'uint64' nicht. Weiß jemand weiter?
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 31.01.2017, 10:35     Titel:
  Antworten mit Zitat      
Hallo agent_fux,

Die Werte müssen zwar ganzzahlig sein, aber als Typ is nur double erlaubt. Matlab's sparse Befehl kann nicht mit Integer-Typen umgehen.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
agent_fux
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 32
Anmeldedatum: 12.01.17
Wohnort: ---
Version: MATLAB R2016b student use
     Beitrag Verfasst am: 31.01.2017, 10:59     Titel:
  Antworten mit Zitat      
Ich hatte die Daten auch schon als double, ganzzahlig und nicht negativ. Da hat es nicht funktioniert.
Private Nachricht senden Benutzer-Profile anzeigen
 
agent_fux
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 32
Anmeldedatum: 12.01.17
Wohnort: ---
Version: MATLAB R2016b student use
     Beitrag Verfasst am: 08.02.2017, 10:04     Titel:
  Antworten mit Zitat      
Ich habe eine einfache Funktion gefunden, die mir Transinformation berechnet. Es ist generell so, dass die Transinformation diskrete Werte benötigt.

function mutualInfo = mutualInformation(counts)

  pXY = counts./sum(counts(:));
  pX = sum(pXY,2);
  pY = sum(pXY,1);

  mutualInfo = pXY.*log(pXY./(pX*pY));
  mutualInfo = sum(mutualInfo(:));

end
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.