|
|
Mahalanobis Distanzmatrix |
|
Romanov |
Gast
|
 |
Beiträge: ---
|
 |
|
 |
Anmeldedatum: ---
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 24.05.2016, 21:31
Titel: Mahalanobis Distanzmatrix
|
 |
Hallo zusammen,
ich suche eine möglichst effiziente Berechnung einer Distanzmatrix aus einem Datensatz von Vektoren. Dabei soll die Mahalanobis Distanz verwendet werden. Matlab bietet pdist2.m als Lösung an. Matlab benutzt dabei ein mex-file, auf das es zurückgreift. Ich suche aber nach einer möglichst effizienten Lösung ohne mex-file, also in Matlab-standard-Code. Hat hier jemand eine Lösung.
Danke!
|
|
|
|
|
Jan S |

Moderator
|
 |
Beiträge: 11.057
|
 |
|
 |
Anmeldedatum: 08.07.10
|
 |
|
 |
Wohnort: Heidelberg
|
 |
|
 |
Version: 2009a, 2016b
|
 |
|
|
 |
|
Verfasst am: 25.05.2016, 11:11
Titel: Re: Mahalanobis Distanzmatrix
|
 |
Hallo Romanov,
Was genau ist "ein Datensatz"? Soclhe Details kann man nicht erraten, es ist für die Implementierung aber grundlegend.
Wieso möchtest Du kein Mex-File verwenden? Effizienter geht es nicht.
Es gibt im FileExchange einige Tools zur Berechnung der Distanz-Matrix. Suche dort einfach mal.
Gruß, Jan
|
|
|
Romanov |
Gast
|
 |
Beiträge: ---
|
 |
|
 |
Anmeldedatum: ---
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 25.05.2016, 11:58
Titel:
|
 |
Hallo Jan,
mit Datensatz ist eine Menge an verschiedenen Vektoren {x,x',...,x(n-1)} gemeint ( Strich steht für die Unterscheidung, nicht die Ableitung der Vektoren), dessen paarweise Abstände ich in eine Matrix, die Distanzmatrix schreiben möchte.
Ich möchte sehen, wie schnell ich mit standard code werde im Vergleich zu der Verwendung von mex-files. Ich habe hier keine besonderen Beweggründe.
|
|
|
Jan S |

Moderator
|
 |
Beiträge: 11.057
|
 |
|
 |
Anmeldedatum: 08.07.10
|
 |
|
 |
Wohnort: Heidelberg
|
 |
|
 |
Version: 2009a, 2016b
|
 |
|
|
 |
|
Verfasst am: 30.05.2016, 13:51
Titel:
|
 |
Hallo Romanov,
Das ist immer noch nicht klar. Hast Du die Vektoren in einem Cell-Array gespeichert, snd es Zeile oder Spalten einer Matrix, sind es verschiedene Variablen, steht das in einem Excel-File oder sind es Felder eines Structs.
Gruß, Jan
|
|
|
Romanov |
Gast
|
 |
Beiträge: ---
|
 |
|
 |
Anmeldedatum: ---
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 31.05.2016, 16:56
Titel:
|
 |
Hallo Jan,
ich habe die Vektoren in einer Matrix X als Spalten eingetragen.
Bis dato ist der Code der nun folgt, das schnellste was ich hinbekomme:
|
|
|
Romanov |
Gast
|
 |
Beiträge: ---
|
 |
|
 |
Anmeldedatum: ---
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 31.05.2016, 17:02
Titel:
|
 |
Hallo Jan,
eine Korrektur im Code:
|
|
|
Romanov |
Gast
|
 |
Beiträge: ---
|
 |
|
 |
Anmeldedatum: ---
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 31.05.2016, 17:14
Titel:
|
 |
Hallo Jan,
solve_chol.m enthält nur den Befehl L'\L\X_diff.
|
|
|
Jan S |

Moderator
|
 |
Beiträge: 11.057
|
 |
|
 |
Anmeldedatum: 08.07.10
|
 |
|
 |
Wohnort: Heidelberg
|
 |
|
 |
Version: 2009a, 2016b
|
 |
|
|
 |
|
Verfasst am: 01.06.2016, 13:52
Titel:
|
 |
Hallo Romanov,
Zitat: |
ich habe die Vektoren in einer Matrix X als Spalten eingetragen. |
Prima, ab jetzt muss man die grundlegenden Details nicht mehr raten.
bsxfun
ist smarter als
repmat
.
In jeder Iteration L'\L wieder zu berechnen ist Zeitverschwendung, oder verstehe ich da etwas falsch? Eine Unterfunktion dafür aufzurufen benötigt ebenfalls Zeit, also besser direkt in den Code schreiben.
Könnte mal L2 \ X_diff aufteilen zu L2 \ X - L2 \ X(:, i), natürlich unter Berücksichtigung der Dimensionen? Der erste Teil ist nämlich konstant und könnte auch aus der Schleife rausgezogen werden.
Wenn Du ein paar realistische Test-Daten zur Verfügung stellst, könnte man einfacher weiter forschen. Es macht einen Unterschied of nX 100 oder 10'000 ist. Per
rand
erzeugte Daten könnten da praktisch sein.
Gruß, Jan
Jetzt kommt es noch auf die Größen des
|
|
|
Romanov |
Gast
|
 |
Beiträge: ---
|
 |
|
 |
Anmeldedatum: ---
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 01.06.2016, 15:15
Titel:
|
 |
Hallo Jan,
danke bis hier her.
Ich war nicht ganz genau bei solve_chol.m .
Ich verwende hier die Choleskyzerlegung um das Gleichungssystem zu lösen. Daher macht L\L' vorher definieren keinen Sinn.
Sonst würde mich interessieren, was an der Funktion bsxfun schneller oder smarter ist? Ich habe das nun schon öfter gehört.
|
|
|
Jan S |

Moderator
|
 |
Beiträge: 11.057
|
 |
|
 |
Anmeldedatum: 08.07.10
|
 |
|
 |
Wohnort: Heidelberg
|
 |
|
 |
Version: 2009a, 2016b
|
 |
|
|
 |
|
Verfasst am: 02.06.2016, 10:33
Titel:
|
 |
|
 |
|
Hallo Romanov,
Wenn man mit
repmat
zuerst aus einem Vektor eine Matrix erzeugt, benötigt man dazu eine temporären Speicher. So lange das in den Prozessor-Cache passt, klappt das effizient. Wenn aber 2nd-Level-Caches oder sogar das langsame RAM dafür herhalten muss, bremst das den Code ungemein. Regel: Rechnen kann der Prozessor viel schneller als Daten aus dem Speicher besorgen.
bsxfun
erlaubt es, das
repmat
nur intern während der Operation anzuwenden. Es wird also nur der Vektor verwendet und man spart das erzeugen der redundanten Werte im Speicher.
Zitat: |
Ich war nicht ganz genau bei solve_chol.m . |
Bitte poste deshalb immer lieber den Original-Code, statt ihn nur ungefähr zu erklären. Das schont die Zeit der jenigen, die Antworten schreiben. Danke!
Verwende den Profiler um die Zeilen zu finden, die die meiste Zeit benötigen. Versuche dort vektorisierten Code und vermeide wiederholte Berechnungen so weit wie möglich.
Wenn die größte Zei in L\(L'\y) benötigt wird, lohnt es sich kaum an der Schleife zu basteln. Regel: Wenn in einem Programm-Teil nur 2% der Rechenzeit benötigt werden, kann eine Beschleunigung um den Faktor unendlich die Gesamt-Rechenzeit nur um 2% verkürzen.
Gruß, Jan
|
|
|
|
|
Einstellungen und Berechtigungen
|
|
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
| RSS
Hosted by:
Copyright © 2007 - 2025
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.
|
|