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

Matching Problem: Aus den Reihen eines Arrays Matches bilden

 

roofuu5
Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 25.01.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.01.2017, 10:40     Titel: Matching Problem: Aus den Reihen eines Arrays Matches bilden
  Antworten mit Zitat      
Hallo gomatlab Gemeinde!

Ich bin auf der Suche nach einer Lösung für das folgende Problem:

Ich habe ein Array mit diversen Werten wie zb das folgende:

Code:

Data1: 50 51 48 55 50 ...
Data2: 51 49 52 50 51 ...
Data3: 49 53 50 51 48 ...
Data4: 48 50 52 51 53 ...
Data5: 47 50 51 54 49 ...
Data6: 50 48 50 49 52 ...
Data7: 53 50 50 50 47 ...
Data8: 47 50 50 50 53 ...
...
 


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.

Dabei gilt es Matches wie
Code:

Data7: 53 50 50 50 47
Data8: 47 50 50 50 53
 

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?
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: 25.01.2017, 11:47     Titel: Re: Matching Problem: Aus den Reihen eines Arrays Matches bi
  Antworten mit Zitat      
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?

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

Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 25.01.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.01.2017, 13:01     Titel:
  Antworten mit Zitat      
Hallo Jan,

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.
Code:
Ideales Match:
51 50 49 50 52
51 50 49 50 52

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.

Beispiel:
Code:
Referenz:
50 50 50 50 50
Paar:
55 50 51 51 51
55 49 50 51 49

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.


Danke für Eure Hilfestellungen

matching.mat
 Beschreibung:
Zu matchende Daten

Download
 Dateiname:  matching.mat
 Dateigröße:  935 Bytes
 Heruntergeladen:  325 mal
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: 25.01.2017, 13:56     Titel:
  Antworten mit Zitat      
Hallo roofuu5,

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
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 - 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.