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

Finde eine Kurve, die 2 Datenmengen möglichst gur trennt

 

chimperator
Forum-Anfänger

Forum-Anfänger


Beiträge: 30
Anmeldedatum: 17.04.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.10.2015, 13:14     Titel: Finde eine Kurve, die 2 Datenmengen möglichst gur trennt
  Antworten mit Zitat      
Hey Leute,

also ich habe 2 Datenmengen, die durch eine Kurve möglichst gut voneinander getrennt werden sollen, jedoch nihct im least square sinne. Es geht nur darum dass möglichst viele schwarze Kreise über und möglichst viele blaue Kreuze unter der Kurve liegen.

Gibt es dafür in Matlab einen besonderen Befehl?

Ansonsten würd ich probieren und einfach immer schauen wo die Punkte liegen.... aber das wäre sehr umständlich und ich kann mir gut vorstellen, dass es in matlab eine Funktion gibt, die dieses Problem optimiert.

Vielen Dank schonmal

Daten.png
 Beschreibung:

Download
 Dateiname:  Daten.png
 Dateigröße:  20.26 KB
 Heruntergeladen:  411 mal
Private Nachricht senden Benutzer-Profile anzeigen


Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 21.10.2015, 13:19     Titel:
  Antworten mit Zitat      
naja du kannst doch die summe der anzahl der punkte die deine bedingung nicht erfüllen minimieren. das würde ich jedenfalls versuchen. die form der kurve müsstest du allerdings vorgeben dazu.
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
Epfi
Forum-Meister

Forum-Meister



Beiträge: 1.134
Anmeldedatum: 08.01.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.10.2015, 23:48     Titel:
  Antworten mit Zitat      
Code:

x-Koordinaten aller Punkte von links nach rechts durchlaufen
   Fallunterscheidung
      Es ist nur Punkt bei diesem x-Wert
         Es ist ein x -> Punkt der Kurve knapp über der y-Koordinate des x setzen
         Es ist ein o -> Punkt der Kurve knapp unter der y-Koordinate des o setzen
      Es gibt mehrere Punkte bei diesem x-Wert
         Es sind alle x -> Punkt der Kurve knapp über der y-Koordinate des obersten x setzen
         Es sind alle o -> Punkt der Kurve knapp unter der y-Koordinate des untersten o setzen
         x und o gemischt -> y-Koordinate mit dem kleinsten Fehler finden, Punkt der Kurve da hinsetzen
Fertig
 


Ergibt ein fürchterliches Zickzack, sollte aber funktionieren. Und ist auch nicht so arg kompliziert...
Private Nachricht senden Benutzer-Profile anzeigen
 
chimperator
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 30
Anmeldedatum: 17.04.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.10.2015, 07:47     Titel:
  Antworten mit Zitat      
Hallo =)

also ich brauhce uaf jeden Fall eine Kurve dir relativv gerade ist, also die Zickzack lösung geht leider nicht.

Daher wollte ich so wie so einen Ansatz wie ihn Winkow vorgeschlagen hat versuchen.

Aber wie mache ich das? Gibt es denn da eine besondere Funktion die mir so etwas macht?

Liebe Grüße und vielen Dank
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 23.10.2015, 08:37     Titel:
  Antworten mit Zitat      
naja was hast du dir denn schon zum thema minimieren und curvefitting angeguckt?
welche toolboxen hast du? ich würde mal fminsearch ga oder patternsearch versuchen. ob das funktioniert hängt aber auch ein wenig von deinen daten ab und wie gut du die randbedingungen wählst.
sowas in der art:
Code:
y1=rand(1,100)+0.5;
x1=1:numel(y1);

y2=rand(1,100);
x2=x1;
f=@(para) sum((para(1)*x1+para(2))>y1)+sum((para(1)*x2+para(2))<y2);
para1=patternsearch(f,[0,0.5])
plot(x1,y1,'*');
hold on
plot(x2,y2,'*');
plot(x1,(para1(1)*x1+para1(2)));

_________________

richtig Fragen
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: 23.10.2015, 09:10     Titel:
  Antworten mit Zitat      
Hallo chimperator,

"Relativ gerade" gibt es nicht. Zunächst brauchst Du eine Entscheidung, welche Anforderungen Du genau an die Kurve stellst. Es gibt unendlich viele verschiedene Kurven, die die Punkte nach unendlichen vielen verschiedenen Kriterien teilen. Das Kriterium muss man deshalb auch zunächst selbst bestimmen. Erst danach kann ein Minimierungswerkzeug die Parameter der Kurve bestimmen.

Du kannst eine Gerade versuchen, dann Polygonzüge mit 2 bis 20 Strecken, oder einen kubischen Spline. Aber welches davon am besten zu den Erfordernissen passt, muss man je nach der physikalischen Natur des Problems festlegen.

"Relativ glatte" (nicht "gerade") Kurven gibt es übrigens auch nicht: Zu jeder durch endlich viele Punkte definierten nicht geraden Kurve gibt es eine Skalierung, in der sie eine "Zickzack-Linie" ist, also nicht differenzierbar. Man muss eine künstliche Grenze annehmen, ab der man einen Polygonzug als glatt ansieht.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Epfi
Forum-Meister

Forum-Meister



Beiträge: 1.134
Anmeldedatum: 08.01.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.10.2015, 15:42     Titel:
  Antworten mit Zitat      
Jan S hat Folgendes geschrieben:
Zu jeder durch endlich viele Punkte definierten nicht geraden Kurve gibt es eine Skalierung, in der sie eine "Zickzack-Linie" ist, also nicht differenzierbar.

Da muss ich aber widersprechen. Eine Parabel ist durch drei Punkte definiert und in jeder Skalierung beliebig oft differenzierbar ;-)

Zum Problem: würde dann am ehesten mal mit einer Trenn-Geraden anfangen, weil bevor Du etwas definiert hast, was "ungefähr gerade" ist, vergeht auch beliebig viel Zeit. Wenn die Gerade dann nicht ausreicht, ändert sich der Code für andere Funktionsformen auch nicht mehr nennenswert.
Du solltest vielleicht auch überlegen, ob Du genau eine Funktion von x suchst, oder ob Du möglicherweise ein Spline willst.
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: 24.10.2015, 15:53     Titel:
  Antworten mit Zitat      
Hallo Epfi,

Eine Parabel als mathematisches Objekt ist ganz wie Du sagst beliebig oft differenzierbar. Mir ging es hier um die numerische Darstellung der Kurve mit Zahlen, die mit begrenzter Genauigkeit dargestellt werden. Explizit gesagt hatte ich das aber nicht.
Man kann ab einer bestimmten Skalierung nicht mehr zwischen der Granularität durch das Zahlenformat und echten Unstetigkeiten unterscheiden.

Für den OP ist es aber eher nur von Belang, das "relativ gerade" zu vage ist.

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.