Die Idee ist, zunächst ein Referenzvektor aus den Mittelwerten aller Spalten zu erzeugen. Dieser Durchschnittsvektor soll dann als Grundlage der Gewichtung dienen, da er die optimale Datenreihe darstellt.
Nun sollen die Reihen die am besten matchen, d.h. deren Werte sich am ähnlichsten sind, ein Paar bilden.
zu vermeiden. Denn auch wenn 3 von 5 Werten ideal zusammen passen, besteht doch eine Differenz von 2x6=12. Solch große Differenzen sollen vermieden werden.
Am besten ließe sich sein Limit einstellen, so dass zb. innerhalb eines matches zwischen zwei Werten keine Differenzen größer 4 erlaubt (die sich in der gleichen Spalte befinden). Ausreißer die nicht zuzuordnen sind werden einfach verworfen.
Hat jemand eine Idee wie ich dieses Problem am einfachsten angehen kann?
Verfasst am: 25.01.2017, 11:47
Titel: Re: Matching Problem: Aus den Reihen eines Arrays Matches bi
Hallo roofuu5,
In welcher Form liegen die daten vor? "Data1: 50 51 48 55 50 ..." sieht nicht nach einer Matrix aus. Für einen Code-Vorschlag müssten wir das aber genau wissen, am besten sogar in einer Form, die wir per Copy&Paste verwenden können, um einen Vorschlag auszuprobieren.
Zitat:
Die Idee ist, zunächst ein Referenzvektor aus den Mittelwerten aller Spalten zu erzeugen. Dieser Durchschnittsvektor soll dann als Grundlage der Gewichtung dienen, da er die optimale Datenreihe darstellt.
Nun sollen die Reihen die am besten matchen, d.h. deren Werte sich am ähnlichsten sind, ein Paar bilden.
Bitte erkläre das genauer.
Ein Mittelwert über alle Spalten lässt sich je nach Daten-Struktur einfach per
mean
berechnen. Unter "Grundlage der Gewichtung" kann ich mir aber nic hts vorstellen.
Was bedeutet "am ähnlichsten" exakt? Außer dem Limit von "maximaler Unterschied von 4" könnte "ähnlich" bedeuten: Kleinste Summe der Differenzen, kleinste maximale Differenz, kleinste Summe der quadrierten Differenzen, oder das ganze für gewichtete Summen oder Elemente, usw. Wie sieht die mathematische Definition von "ähnlich" aus? Was soll geschehen, wenn z.B. 3 Vektoren identisch sind?
danke schon einmal für Deine Überlegungen. Ich habe mal einen Datensatz in Form eines mat files angehängt.
Zitat:
Was bedeutet "am ähnlichsten" exakt? Außer dem Limit von "maximaler Unterschied von 4" könnte "ähnlich" bedeuten: Kleinste Summe der Differenzen, kleinste maximale Differenz, kleinste Summe der quadrierten Differenzen, oder das ganze für gewichtete Summen oder Elemente, usw.
Hm, ich denke die maximale Differenz zwischen den Werten (Spalten) eines matches sollten einfach möglichst gering sein.
Natürlich soll sich die Reihenfolge der Werte innerhalb einer Zeile nicht verändern. Eventuell brauche ich den "Referenzvektor" auch gar nicht? Mir ist einfach nicht klar, wie ich da ran gehen soll.
Meine Idee war bisher: Es sollen die Reihen gepaart werden dessen Werte nah beieinander liegen, allerdings mit zunehmender Relevanz im Bezug zum "Referenzvektor": Die Summe kleiner Differenzen sind nicht so relevant wie eine einzelne große. Also desto größer die Differenz zu der Referenz, desto relevanter für die Paarbildung.
Auch wenn die Summe der Differenz der Spalten zwei bis vier zum Referenzvektor 6 Beträgt, wird dieses Paar gebildet, da der erste Wert des Paares um 5 Abweicht. Ausreißer gilt es zu vermeiden.
Zitat:
Was soll geschehen, wenn z.B. 3 Vektoren identisch sind?
Sollte der unwahrscheindliche Fall eintreten, dass zb. 3 identische matches vorliegen, könnte doch das Paar aus denen gebildet werden die zuerst gefunden wurden oder weiter oben in dem Array stehen.
Ich habe hier leider kein Matlab zur Verfügung und kann deshalb nicht in Dein MAT-File reinschauen. Liegen die Daten als Matrix vor? Dann:
Code:
function main
Data = randi([0, 100], 1000, 5); % Test data
nData = size(Data, 1);
iMatch = 0;
Match = zeros(ceil(size(Data, 1) / 2), 2);
check = true(nData, 1);
for k = 1:nData - 1 if check(k)
D = Distance(Data(k, :), Data(k+1:nData, :));
[dummy, index] = min(D);
iMatch = iMatch + 1;
Match(iMatch, 1) = k;
Match(iMatch, 2) = index;
end end
function D = Distance(v, M)
D = sum(abs(bsxfun(@minus, v, M)));
% D = sum(bsxfun(@minus, v, M) .^ 2); % Perhaps SQRT as in the Euclidean distance
D(D>=4) = Inf; % Penalty for too large distance
Nun könnte für eine Zeile kein einziger passender Match gefunden werden, z.B. wenn kein anderer in der Nähe ist oder die Anzahl der Zeilen nicht gerade ist. Das müsste man dann noch abfangen.
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
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.