Minimierungsalgorithmus gesucht

Mitglied seit
06.12.2000
Beiträge
5.486
Reaktionen
0
Folgendes Problem...

Ich habe diese Tabelle:

tab1sqpq4.jpg


In den Spalten stehen verschiedene Cluster-Algorithmen, in den Zeilen unterschiedliche Beobachtungen, die mit den Algorithmen geclustert wurden. Die Zellen zeigen, in welches Cluster der jeweilige Algorithmus die Beobachtung gesteckt hat.

Als Kriterium soll die Summe der quadrierten Anzahl der Abweichungen vom häufigsten Wert minimiert werden. Mathematisch dieser Term:
sum{i=1}{n} (N-M_i)²
mit n = Anzahl der Beobachtungen, N = Anzahl der Algorithmen, M_i = Anzahl wie oft der häufigste (Cluster-)Wert für diese Beobachtung vorkommt

Beispiel:
Ich habe Cluster 1 bei allen 3 Algorithmen => Abweichungen = 0, Kriterium = 0
Ich habe (wie bei Beobachtung 1) 2 mal Cluster 1, einmal Cluster 2 => Abweichungen = 1, Kriterium = 1

Das Problem ist, dass der Clustername eigentlich keine Bedeutung hat. Cluster 2 im Algorithmus 3 kann also auch das gleiche Cluster sein wie Cluster 1 im Algorithmus 1. Innerhalb eines Algorithmus lassen sich also die Clusternamen (hier im Beispiel 1, 2 und 3 bzw. rot, blau und grün) beliebig rotieren, um das Kriterium zu minimieren.

In der Tabelle könnte das zum Beispiel so aussehen:

tab2vao1q.jpg


Hier wurden bei Algorithmus 2 Cluster 2 und 3 gedreht und im Algorithmus 3 wurde 2 zu 1, 3 zu 2 und 1 zu 3. Damit hat sich das Kriterium (unten rechts) von 7 auf 3 verringert.

Allerdings habe ich dieses sehr einfache und konstruierte Beispiel einfach „per Hand“ bearbeitet/minimiert. Für meine Analysen habe ich aber evtl bis zu 10 Algorithmen und evtl 10-12 Cluster – und natürlich deutlich mehr Beobachtungen (bis zu 100 evtl). Anfangs hab ich ja noch gedacht, ich könnte einfach die Clusternamen durchpermutieren (sukzessive für alle Algorithmen), jeweils das Kriterium berechnen und dann die Lösung mit dem geringsten Kriteriumsmaß nehmen. Quasi der brute force Ansatz. Leider wären dass dann bei 12 Clustern und 10 Algorithmen sehr sehr viele Berechnungen. Irgendwas in die Richtung 12!^9 oder so (Kombinatorik war noch nie meine Stärke). Damit wären wir bei 10^78 Berechnungen, was logischerweise recht schlecht durchführbar ist.

Was ich also brauche, ist ein besserer Algorithmus als „alles durchprobieren“. Da dieses Problem mir nicht allzu außergewöhnlich erscheint, kann ich mir gut vorstellen, dass es irgendwelche Algorithmen in diese Richtung schon gibt. Leider habe ich super wenig Ahnung in dem Feld. Falls hier jemand ein paar gute Ideen hat oder mir ein paar Stichworte für entsprechende Algorithmen liefern kann, damit ich da mal nachlesen kann, ob das für mich passt und umsetzbar ist, wäre das top! Selbst, wenn es erstmal nur die Anzahl der Abweichungen (nicht die der quadrierten Abweichungen) minimiert, könnte ich vorerst gut damit leben.

Thx schonmal
BBW
 

ROOT

Technik/Software Forum, Casino Port Zion
Mitglied seit
17.11.2002
Beiträge
7.030
Reaktionen
21
Ort
MS
ich versteh leider kein bisschen was du da machst (cluster? beobachtungen? ka), deine zielfunktion sieht aber standard quadratischer optimierung aus.

ka was du für nebenbedingungen hast, aber mglw. (lineare nb) kannst das mit QP (quadratic programming) schon lösen.
http://en.wikipedia.org/wiki/Quadratic_programming
 
Zuletzt bearbeitet:
Mitglied seit
15.10.2001
Beiträge
134
Reaktionen
0
Ich glaub das ist NP-Vollständig dein Problem.

Also zumindest wenn du die clusterungen als Eingabe hast.
 

mfb

Mitglied seit
18.07.2003
Beiträge
791
Reaktionen
0
Website
diablo3.ingame.de
Ich denke, du kannst eine ganz gute Näherung finden indem du schrittweise nach Optimierungen suchst.

Fang bei einem großen Cluster in irgendeinem Algorithmus an, identifiere dieses in zumindest paar anderen Algorithmen, entferne ein paar Ausreißer die nur in 1-2 Algorithmen drin sind. Das Ergebnis ist etwas, was mehrere Algorithmen als (gleiches) Cluster ansehen und somit in allen die gleiche Nummer bekommen kann.
Wenn man in den Stil weiterarbeitet, bekommt man wohl ein ganz gutes Ergebnis. Das kann man dann noch optimieren -> tausche zwei Clusterbezeichnungen, berechne die Clusterzuordnungen neu und vergleiche den neuen Wert mit dem alten. Bei n Algorithmen mit m Clustern sind das lediglich (n-1)m(m-1)/2 mögliche Vertauschungen. Sobald eine Verbesserung gefunden wurde, suche erneut ob irgendeine Vertauschung eine Verbesserung ergibt.

Das mag im allgemeinen Fall zu keinem guten Ergebnis in realistischer Zeit führen. Aber deine Algorithmen sind nicht zufällig (immerhin sollen sie alle das gleiche machen), sodass der allgemeine Fall von völligem Chaos ohnehin nicht realistisch ist.

Brute force ergäbe m!^(n-1) mögliche Vertauschungen.
 

voelkerballtier

Coverage, Staff, Coding
Mitglied seit
01.12.2003
Beiträge
1.603
Reaktionen
0
mir erscheint es auch so, als wäre dein problem "hart" im Sinne von NP-vollständig. Wie über mir geschrieben ist Simulated Annealing dann ein recht guter Algorithmus um eine brauchbare Näherung zu finden.
 
Mitglied seit
06.12.2000
Beiträge
5.486
Reaktionen
0
Hey everyone, thx schonmal für die Antworten! Das verstärkt mich in der Annahme, dass es nicht ganz so banal ist. ;)

Hab jetzt mal einen Algorithmus zusammengebastelt ähnlich dem, den mfb vorgeschlagen hat (das war erstmal einfacher). Hat zumindest im Fall 5 Algorithmen, 4 Cluster, 67 Beobachtungen meine Eyeball-Optimierung geschlagen, in etwa 10 Sekunden, wobei die Geschwindigkeit noch etwas optimierbar sein sollte. Ich bin absoluter Programmier-Versager. Auch über gute Startwerte muss ich mir hier noch Gedanken machen.

Simulated Annealing klingt sehr spannend. Danke für die Empfehlung. Ein Physiker-Kumpel von mir, dem ich das auch per Email geschickt hatte, hat auch den Metropolis-Algorithmus vorgeschlagen, der ja anscheinend ein Spezialfall des Simulated Annealing ist, wenn ich das richtig verstehe. Werde mich jedenfalls mal einlesen und versuchen, eine Implementation hinzubekommen. Evtl muss ich dazu dann hier noch einmal nachfragen. ;)

Mit welcher Software würdet ihr sowas machen? Matlab wäre wohl das sinnvollste, oder? Ich habe recht viele off-the-shelf Simulated Annealing Algorithmen gefunden, die man für die eigene Problemstellung adaptieren kann. Die meisten eben in Matlab. Ich hab aber viele meiner Auswertungen in R gemacht und würde ungern noch ein viertes Programm heranziehen 8[ Außerdem bin ich Matlab Noob. Für R gibt's auch entsprechende packages, die ich mir mal anschauen muss. Kennt sich da jemand zufällig mit aus?
 
Mitglied seit
23.11.2004
Beiträge
1.142
Reaktionen
8
Jo frag nach, wenn du Fragen hast.

Der Simulated Annealing-Algorithmus ist eigentlich sehr leicht zu implementieren, zumal du schon eine Algorithmus hast, der auf Vertauschungen basiert. Im Endeffekt musst du diesen nur so modifizieren, dass er Vertauschungen auch akzeptiert, wenn diese das Ergebnis schlechter machen, aber nur mit einer gewissen Wahrscheinlichkeit, die kleiner ist, je schlechter die zu optimierende Größe durch die Vertauschung wird. Ich würde einfach das Programm nehmen, das du schon benutzt, denn wie gesagt, es ist nicht weit von dem Algorithmus den du schon hast zu dem Simulated Annealing.
 

voelkerballtier

Coverage, Staff, Coding
Mitglied seit
01.12.2003
Beiträge
1.603
Reaktionen
0
simulated annealing ist verbessertes metropolis. durch das "annealing" sorgst du fuer konvergenz des verfahrens, du kriegst also auf jeden fall eine loesung (nicht zwangsflaeufig die beste...). bei metropolis springst du typischerweise am ende zwischen verschiedenen loesungen hin und her.
Ich weiss leider nicht wie maechtig R ist, denke aber nen SA sollte man da schon auf die reihe kriegen - sonst waere natuerlich matlab standard, da kenn ich mich aber nich aus. fuer python koennt ich dir ne SA implementation fuer travelling salesmam geben - wenn ichs noch finde... :)
 
Mitglied seit
02.08.2002
Beiträge
2.781
Reaktionen
0
scipy bietet auch ne simulated annealing implementation für python. Ansonsten nutze ich für optimierungsprobleme gerne openopt (auch für python).
 
Mitglied seit
04.10.2006
Beiträge
643
Reaktionen
0
Ort
München
Hi BBW, hast Du auch deine Berechnungen im Excel gemacht? Das SA-Verfahren kann man auch im Excel implementieren...
 
Mitglied seit
06.12.2000
Beiträge
5.486
Reaktionen
0
Ist schon ne Weile her die Geschichte, aber hatte endlich Zeit, mich nochmal intensiv ranzusetzen, nachdem ich es ne Weile ruhen lassen musste.

Vielen vielen Dank an alle, insbesondere sesslor und voelkerballtier, der Tipp mit SA war wirklich Gold wert. Hab's mit R implementiert bekommen und bin gerade super happy (ja, worüber man sich nicht so alles freuen kann...)!

Wusste doch, dass man sich auf bw.de verlassen kann -.-

Thx nochmal
BBW
 
Mitglied seit
04.10.2006
Beiträge
643
Reaktionen
0
Ort
München
Der Thread hier hat mich dazu animiert, zwei Monate lang nur MCMC zu studieren -_-
 
Oben