C Maschinelles Lernen

John Connor

Lt. Junior Grade
Registriert
Okt. 2005
Beiträge
320
hi zusammen,

also darüber gibt es ja im netz eine menge lesen, sei es über schul-skripte, ebooks und dergleichen. aber wie sieht denn das ganze in form eines codes aus?

nehmen wir an, eine eingelesene zahl soll der computer mit einer zufallszahl vergleichen und anschließend sagen, wie der betrad der differenz ist. die programmierung an sich, dass er dies genau ausführen soll, ist ja nicht das problem, aber wie bezieht man den "lern-faktor" mit ein?

man gewährt dem computer eine reihe von möglichkeiten oder werkzeugen darunter auch die tatsächliche. das programm kann sich nun einen feedback abholen, ob es die richtige operation durchgeführt hat oder nicht und sich stück für stück and die richtige vorgehensweise herantasten. wie könnte das ausschauen?
 
Es geht nicht um ein Herantasten im eig. Sinne, sondern um Entscheidungen, die aufgrund von angesammeltem Wissen getroffen werden. Also braucht man eine Wissensrepräsentation und Algorithmen, die Entscheidungen mittels dieses Wissens treffen. Verändert sich das Wissen, sehen die Entscheidungen anders aus. Wichtig ist, wie man das Wissen repräsentiert - aber auch, wie man es sammelt.

Leider verstehe ich nicht, wo / wie man einen Lernfaktor in einer Betragsfunktion einbinden sollte?
 
Mathematische Operationen mit einem Lernfähigen Algorithmus zu versehen macht meistens wenig sinn, denn das bloße ausrechnen geht da meist deutlich schneller.

Wie mein Vorposter schon sagte, braucht man fürlernfähige Systeme

1. Erfahrung. (also nicht beim Programmierer, sondern beim Programm) Zum Beispiel in Form eine Datenbank, in der Ergebnisse, Eingaben etc. abgelegt werden.

2. Ein Algorithmus, welcher das Programm "entscheiden lässt". Also ein strenges Prioritätensystem, welches dem Programm in abhängigkeit der Erfahrung vorgibt, was zu tun ist.

Gerade letzteres ist denk ich der Knackpunkt: Als Programmierer eines solchen Algorithmus muss man extrem viele Fälle bedenken, in der sich das Programm "sinnvoll" verhalten muss.
Bei deinem Programm sehe ich jetzt kaum Einsatz für lernfähigkeit. Vielleicht beim vorraussagen und vorausberechnen der Eingabe...
 
vorerst versuche ich mit einem möglichst einfachen beispiel, etwas anders als das bloße rechnen im program zu bewirken. z.b. mit hilfe von rückfragen über die richtigkeit, die dann mit ja oder nein beantwortet werden können. diese beiden parameter könnten dann mit der jeweils ausgeführten operation abgeglichen werden, woraus danneine art tendenz zu einer bestimmten operation geschafft wird.

mag sein, dass künstliche intelligenz viel mehr als das ist, aber mit irgendwas muss man ja anfangen.
 
Du kommst, auch bei einfachen Sachen, nicht um eine Wissensrepräsentation /-datenbank herum. Im einfachsten Fall ist das eine simple Datenbank mit Messwerten, aus denen man zB ein Mittel berechnet und damit etwas zu entscheiden. Das "Lernen" ist dann dadurch gegeben, dass ständig neue Werte hinzukommen und somit auch die Entscheidungen anders aussehen.

Für ein richtiges Codebeispiel müsstest du schon eine Idee liefern, wo du maschinelles Lernen implementieren möchtest.
 
stimmt. habe hier etwas:

http://codepad.org/DyFHHhRu

leider funktioniert es nicht richtig. das programm kennt gerade zahlen. wenn man nun eine ungerade zahl eingibt, fragt es auch, ob es sich dabei um eine gerade handelt.geht es um gerade nummern, sollte sich auch an dem verhältnis von richtig und falsch eingeordneten zahlen zunächst nichts ändern. bei ungeraden zahlen jedoch tut sich ebenfalls nix. hier besteht verbesserungsbedarf.
 
Hi,

zu Neuronalen Netzen fällt mir immer wieder http://www.20q.net/ ein... ;)

Zurück zum Thema:
Maschinelles Lernen/Mustererkennung/Künstliche Intelligenz ist ein großes Themengebiet, und die zugrundeliegende Mathematik teilweise wirklich heftig. Ohne eine fundierte Ausbildung auf den Gebieten wirst du dir (sehr) schwer tun.
Ich versuche trotzdem mal meinen Senf in verständlicher Form dazuzugeben, und auch das letzte Beispiel zu kommentieren, vielleicht hilft es dir ja weiter:

Wie es auch schon im Code steht ist ein wesentlicher Aspekt der Mustererkennung die Klassifizierung eines unbekannten Samples (das Sample ist hier eine Zahl). Mögliche Klassen sind dabei "gerade" und "ungerade". Die Klassifizierung wird nun erreicht, indem das unbekannte Sample mit Trainingsdaten (hier steckt das Lernen drinnen) verglichen wird, wobei die Trainingsdaten in einem "Lernprozess" natürlich schon in die möglichen Klassen unterteilt worden sein müssen. Für den Lernprozess (aka Training des Modells) gibt es verschiedene Möglichkeiten, da es im Code um überwachtes Lernen geht, werde ich nur auf diese Technik näher eingehen:

Nehmen wir als Trainingsdaten die Zahlen {2,4,6,101,103,105} an.

PHP:
int TrainingData[] = {2,4,6,101,103,105};

Dann werden diese Zahlen vom Benutzer (überwachtes Lernen, z.B. mit einer Ja/Nein-Abfrage) in die entsprechenden Klassen eingeteilt. Also: Class1= {2,4,6} und Class2={101,103,105}

PHP:
// Generische Trainingsfunktion. 
// Class1 enthält danach alle Elemente aus TrainingData die zu Klasse1 gehören und Class2 enthält alle Elemente aus TrainingData die zu Klasse2 gehören. 
// Die Methode allokiert Speicher für Class1 und Class2. 
// Hoffe ich hab mich nicht mit den Pointern vertan...
void TrainModel(int *TrainingData, unsinged int *LengthClass1, int **Class1, unsigned int *LengthClass2, int **Class2); 

unsigned int LengthClass1;
unsigned int LengthClass2;
int *Class1;
int *Class2;
TrainModel(TrainingData, &LengthClass1, &Class1, &LengthClass2, &Class2);

Als nächstes muss ein neues Sample (wie oben gesagt) mit den Trainingsdaten verglichen werden. Das wird erreicht indem für jedes Sample (egal ob Trainingssample oder unbekanntes Sample) ein Merkmal (engl. Feature) berechnet wird. Dieses Merkmal sollte möglichst stellvertretend für die Klasse des Samples sein. Für jede Trainingsklasse (Class1 und Class2) kann das entsprechende Merkmal z.B. ermittelt werden, indem für jedes Element der Klasse das Merkmal berechnet wird, und die Merkmale dann gemittelt werden.

PHP:
// Generische Merkmalsberechnung
int ComputeFeature(int Sample);

// Berechnet das Merkmal für eine Klasse
int ComputeClassFeature(unsigned int Length, int *Class)
{
     int ClassFeature = 0;
     for ( unsigned int i = 0; i < Length; i++ )
           ClassFeature += ComputeFeature(Class[i]);
     ClassFeature /= (float)Length;
     return ClassFeature;
}

und nun der eigentliche Vergleich von einem neuem, unbekannten Sample mit den Trainingsklassen

PHP:
// Generischer Klassifikator.
// Die ID der Klasse wird zurückgegeben: 0 für gerade, 1 für ungerade
unsigned int Classify(int FeatureOfNewSample, int Class1Feature, int Class2Feature);

// Zahl einlesen
int NumberToClassify;
printf("Please enter number to classify: "); 
scanf("%d",&NumberToClassify); 
printf("\n");

// Merkmale von Trainingsklassen und neuem Sample berechnen
int ClassFeature1 = ComputeClassFeature(LengthClass1, Class1);
int ClassFeature2 = ComputeClassFeature(LengthClass2, Class2);
int NewSampleFeature = ComputeFeature(NumberToClassify);

// Klasse berechnen
unsigned int ClassID = Classify(NewSampleFeature, ClassFeature1, ClassFeature2);

// Klasse ausgeben
printf("Die Zahl %d ist ", NumberToClassify);
if ( ClassID == 0 )
     printf("gerade\n");
else
     printf("ungerade\n");

Das ist nun im Prinzip der Grundaufbau eines jeden Mustererkennungssystems/Klassifikator. Das kann man natürlich auf eine beliebige Anzahl von Klassen erweitern, letzendlich kann man aber alles auf eine binäre Entscheidungsregel zurückführen. Viel wichtiger sind die "generischen Funktionen" die in meinen Code-snippets vorkommen, und hier wirds entweder einfach oder richtig komplex. Letzteres lassen wir mal aus, bei Fragen gibts gerne einen Nachschub...

1.
Trainingsfunktion:
PHP:
// Generische Trainingsfunktion. 
// Class1 enthält danach alle Elemente aus TrainingData die zu Klasse1 gehören und Class2 enthält alle Elemente aus TrainingData die zu Klasse2 gehören. 
// Die Methode allokiert Speicher für Class1 und Class2. 
// Hoffe ich hab mich nicht mit den Pointern vertan...
void TrainModel(int *TrainingData, unsinged int LengthClass1, int **Class1, unsigned int LengthClass2, int **Class2);
Da gibts nicht viel zu sagen: Den TrainingData-Array traversieren, und den Benutzer entscheiden lassen. Speicher Anforderungen natürlich nicht vergessen!

2.
Klassifikator:
Der einfachste Ansatz ist einfach die "Distanz" des Features des neuen Samples zu den bestehenden Klassen zu berechnen und die Klasse zu wählen, die die geringste Distanz aufweist
PHP:
unsigned int Classify(int FeatureOfNewSample, int Class1Feature, int Class2Feature)
{
     if ( abs(FeatureOfNewSample-Class1Feature) < abs(FeatureOfNewSample-Class2Feature )
          return 0;
     else
          return 1;
}

2.
Merkmalsberechnung/Merkmalsbestimmung
PHP:
// Generische Merkmalsberechnung
int ComputeFeature(int Sample);
Tja, was ist das Merkmal der Klassen? Zu Klasse1 sollen gerade, zu Klasse2 ungerade Zahlen gehören. Imho gibt es kein bessers Merkmal als Modulo. Schluss aus. Deswegen ist dieses Beispiel (gerade oder ungerade) gänzlich ungeeignet, da der eigentliche Klassifikator bereits in C integriert ist ;)
Somit hätten wir
PHP:
int ComputeFeature(int Sample)
{
     return Sample % 2;
}

Ich möchte trotzdem noch etwas anmerken was dir für andere Arbeiten auf diesem Gebiet hilfreich sein kann:
Wir hatten die Trainingsdaten {2,4,6,101,103,105} und die gelernten Klassen Class1= {2,4,6} und Class2={101,103,105}. Diese Klassen sind wunderbar getrennt, und auf den ersten Blick ist sogar nicht die Division mit Rest DAS entscheidende Merkmal sondern der (absolute) Wert:
PHP:
int ComputeFeature(int Sample)
{
     return abs(Sample);
}

Somit hätten wir als Merkmal für Class1=4 und für Class2=103. Wenn du dir den Klassifikator von oben (Distanz zu den Klassen ansiehst) hoffe ich, dass es dir klar ist, dass bei der Klassifikation der Zahl 11 alles schiefläuft!

So, das war lange :freak: . Hoffe mal es sind keine zu schlimmen Fehler drinnen.

P.S:
Das Code-Beispiel von dir halte ich nicht für ein richtiges Neuronales Netz, bzw. es ist so trivial, dass ich es nicht als solches erkenne...
 
Zuletzt bearbeitet:
das mag schon sein, aber warum nicht etwas besseres daraus machen?
jedenfalls danke für deinen beitrag.
 
Erstmal, ein schöner Beitrag Gluehwurm. Du sprichst das Wesentliche an! Gerade beim maschinellen "Lernen" wird es für einen Programmierer sehr schnell komplex. Trotzdem vielleicht noch einen kleinen Einschub wie man maschinelles Lernen rel. einfach implementieren kann, mit einem rel. geringen Vorwissen.

Stell dir einen gewöhnlichen SpamFilter vor. Dein SpamFilter "lernt" ebefalls in gewisser Form. Die meisten Spamfilter die heutzutage im Einsatz sind bedienen sich der Mathematik in Form von Statistik bzw. Stochastik. Sprich, auf Dauer teilst du deinem System mit ob eine Email Spam ist oder nicht. Jedes mal wenn du eine Email bekommst wird diese auf bereits "gelernte" Begriffe abgeglichen und eine Wahrscheinlichkeit (hauptsächlich in Form mit bedingten Wahrscheinlichkeiten -> Bayes, etc..) errechnet zu welchem "Prozentsatz" diese Mail Spam ist oder nicht (dabei wird die ein Wert über die gesamte Mail berechnet und die "guten" Wörter, auch gerne Ham genannt von den "schlechten" Wörtern, eben solche die die Mail als Spam authen könnten, gegeneinander abgeglichen).

Vielleicht als kleinen mathematischen Einschub, passend zu dem Beispiel die grundlegende Formel von Bayes, basierend auf bedingten Wahrscheinlichkeitsverteilungen/Merkmalsausprägungen der Merkmalsträger.

f49d3d17b081c1360dc020d9fc3b407c.png

Quelle:http://de.wikipedia.org/wiki/Bayestheorem

Hier greift die Mathematik sehr stark in die Implementierung ein. Sicherlich muss sich dein Programm die Emails(welche als Spam klassifiziert wurden), bzw. dessen Indizien warum diese Entscheidung getroffen wurde irgendwo merken, sei es in einer Datenbank, oder sonst wo. Hier bist du rel. frei in der Entscheidung welche Datenhaltung du einsetzt.

Das Entscheidende dabei ist allerdings (und das hat Gluehwurm) auch schon erwähnt, dass du erkennst, dass jede Entscheidung auf den gesammelten Daten beruht und letztenlich auf einen einfachen boolschen Ausdruck zurückzuführen ist. Das vergleichsweise komplexe daran ist allerdings den Weg hin zu deiner Entscheidung zu finden.

Wenn dich das Thema generell interessiert kann ich dir für einen etwas tieferen Einstieg eine kleine Lektüre empfehlen: http://robotics.stanford.edu/~nilsson/mlbook.html Diese müsste auch kostenlos zu haben sein, zumindest als ich darin rumgeblättert habe, war es noch so...

Den Link zu deinem Code halte ich ebenfalls mehr für eine Spielerei als für ein neuronales Netz. Du willst etwas "besseres" daraus machen? Was verstehst du denn darunter? - Das Problem hierbei ist der Algorithmus. Desto gröber dein Algorithmus ist(was er hier ist), desto ungenauer sind deine Ergebnisse. Das Problem ist hierbei dass sich eine Fülle von Möglichkeiten ergeben diesen Algorithmus so zu verbessern, dass die Lernfähigkeit gesteigert wird -> Problem: Es wird, wie oben schon erwähnt, sehr schnell komplex. Ausserdem musst du dir darüber im klaren sein warum du genau DIESEN EINEN Algorithmus anwendest und was ihn gegenüber anderen Algos besser macht. Sich ernsthafte Gedanken darüber zu machen erfordert ein bisschen mehr als nur eine Nacht darüber zu schlafen und geht auch, wie ich schonmal sagte, sehr stark in die Mathematik.
 
Zuletzt bearbeitet:
Hallo,

als Einstieg in Neurale Netzwerke kann ich dir AForge empfehlen ( http://www.aforgenet.com/framework )

Es handelt sich zwar um ein .NET Framework, aber als Einstieg eignet es sich sehr gut um sich an das Thema heranzutasten. Es sind auch viele Beispiele dabei. Mir hat es jedenfalls als Einstieg sehr geholfen, und ich hatte wirklich null Wissen zu dem Thema.


Ein etwas anspruchvolleres .NET Framework ist SharpNEAT ( http://sharpneat.sourceforge.net )

Und falls es unbedingt C++ sein muss, dann gibt es NEAT auch dafür: http://www.cs.ucf.edu/~kstanley/neat.html
 
@Firestorm-
ja genau,einen sog (naive-)bayes-approach hätte ich auch als erstes vorgeschlagen; damit kann man schon sehr viel machen und kommt beim trainieren eigentlich mit ABZÄHLEN aus...und das können computer sehr gut :-D
http://en.wikipedia.org/wiki/Naive_Bayes_classifier
das beispiel mit dem spamfilter ist schon sehr gut, im engl. wiki ist noch etwas mehr theorie dahinter.

kannst dann mit k-fold cross validation noch mehr aus 'nem begrenzten datensatz herausholen http://en.wikipedia.org/wiki/Cross-validation_(statistics)#K-fold_cross-validation


das höchste der gefühle wäre eine support-vektor-maschine http://de.wikipedia.org/wiki/Support_Vector_Machine ,
das wäre aber GANZ GANZ GANZ derber tobak...nur dass klar ist, was es da so gibt außer netzwerke.
 
wie sieht denn ein einfaches programm aus, bei dem sowas wie ein lernvorgang stattfindet?
 
Naja die Frage ist, was genau man bereits als Lernen bezeichnet.
Dazu gibts den riesen Artikel http://de.wikipedia.org/wiki/Maschinelles_Lernen

Reines Faktenlernen?
So im Sinne einer Datenbank, die Fakten und Zusammenhänge präsentiert bekommt und danach Fragen beantworten kann, deren Antwort die bisherigen Fakten und Zusammenhänge hergben? Da reicht ja dann im Grunde http://de.wikipedia.org/wiki/Aussagenlogik mit einem Resolutionsverfahren.

Simples Beispiel:

Code:
[B]Eingabe:[/B]
A
B
(A & B) => C

[B]Frage:[/B]
C?

[B]Ausgabe:[/B]
true

Aber das meintest du wahrscheinlich nicht. Es würde ja auch erfordern, dass dem Programm bereits aufbereitet die Fakten und Zusammenhänge eingegeben werden.

Oder zB das "Rückgreifen auf Erfahrung" um zB Zwischenergebnisse zu benutzen, um Dinge schneller zu berechnen?
Stell dir eine Funktion vor, die die Fakultät berechnet und das Resultat nicht nur ausgibt sondern speichert. Dh wenn einmal 40! ausgerechnet wurde kann 41! direkt durch das Bekannte Ergebnis zu 40! *41 ausgegeben werden. Also eine einfache Multiplikation reicht schon aus.
Einige Taschenrechner haben fest eingegeben ein Zwischenergebnis für die Fakultät von 30 oder so, damit die Berechnung von der oft gebrauchten 49! (Lotto und so im Matheunterricht) schnell geht

Die Idee geht dann in die Richtung von http://de.wikipedia.org/wiki/Dynamische_Programmierung

Ansonsten gabs hier schonmal diesen Thread bei Computerbase:
https://www.computerbase.de/forum/threads/suche-algorithmus-fuer-die-abtastung-von-raeumen.731692/
wo ich was zu Robotern geschrieben hab, die die Form der Welt einlernen. Aber das ist nicht so einfach.

Wenns mathematischer sein darf gibts auch Ansätze wie beim http://de.wikipedia.org/wiki/Kalman-Filter die die nie exakt bekannten Fehlerkovarianzen durch einen übergeordneten Kalman-Schätzprozess verbessern und die Zustandsschätzung des eigentlichen Kalmanfilters zukünftig besser funktioniert. "Automatisiertes anpassen von Parametern" könnte man das nennen
 
Zuletzt bearbeitet:
Sagen wir, du willst für eine Maschine, welche Fische nach Barschen und Heringe sortieren soll, einen Entscheidungscode entwickeln. Die Maschine kann Gewicht und Länge der Fische messen. Jetzt erstellst du anhand einer genügend großen Menge an Fischen eine Datenbank, welche Gewicht, Länge und Gattung pro Fisch speichert. Wenn man das ganze in eine Grafik plottet sieht das vielleicht so wie im Anhang aus. Nun gilt es eine (oder mehrere) Grenze(n) zu finden, wo man zwischen Barsch und Hering unterscheidet (im Beispiel die grüne Linie). Dein Code versucht nun also, anhand der Datenbank die Grenze zu finden. Eine ziemlich gewiefte Form dies zu tun, bietet eine Support Vector Machine. Diese kann auch nicht lineare Probleme lösen.
 

Anhänge

  • Maschinelles_Lernen.png
    Maschinelles_Lernen.png
    13,2 KB · Aufrufe: 216
Loopo schrieb:
Sagen wir, du willst für eine Maschine, welche Fische nach Barschen und Heringe sortieren soll, einen Entscheidungscode entwickeln. Die Maschine kann Gewicht und Länge der Fische messen.
Das ist ein wirklich gutes Beispiel ;)

Also was wollen wir? Wir wollen eine Funktion lernen um zu sagen, ob ein gegebener Fisch ein Barschen ist oder nicht.
Und gegeben bekommen wir einige Fakten: Gewicht und Länge.

Mit den Trainingsdaten wird für die verschiedenen Fakten herausgefunden, wie der Algorithmus aussehen soll.

Und ab hier gibt es eben viele Möglichkeiten die zum Ziel führen, aber du brauchst eben diese Grunddaten. I.R. haben aber die meisten Algorithmen das gleiche Ziel, sie suchen erstmal Regeln aus, die für einige Werte passen und verfeinern dies dann.

Als Beispiel:
Bei der Größe > 15cm habe ich zu 90% Barsche, also nehme ich diesen Fakt schonmal in meine Regel auf, nun habe ich aber noch 10% falsche Annahmen. Fische über 500g dieser Menge (> 15cm) sind wiederum 80% Barsche, also habe ich meine Genauigkeit verbessert.
Je nachdem wie der Algorithmus arbeitet, kann er sich mit diesem Ergebnis zufrieden geben, weil er mit minimalen Regeln ein möglichst gutes Ergebnis erzielt hat oder er versucht mit weiteren Regeln seine Entscheidung noch zu verbessern:
Der Algorithmus sieht z.B. das aus der momentanen Menge (>15cm, >500g) die Wahrscheinlichkeit Barsche korrekt zu bestimmen sich verbessert, wenn der Fisch > 13cm ist, dadurch revidiert er seine vorige Entscheidung und kommt zu einem besseren Ergebnis, er hätte diese Regel vorher aber nicht genommen, da Fische in der Größenordnung 13-14cm auch oft Heringe sind, aber die wiegen weniger, die Wahrscheinlichkeit eine korrekte Aussage zu treffen war also ganz am Anfang mit nur der Regel >13cm zu gering.

Es wird also in meinem beschrieben Beispiel für die Testdaten mit einer Regel eine Prediction erstellt, wie gut der Algorithmus mit dieser Regel die Testdaten korrekt erkennt.
Nebenbei bemerkt heißt der Algorithmus, den ich grob angerissen habe First Order Inductive Lernen (FOIL), wird aber heute glaube ich nicht mehr angewendet.
 
Etwas abseits, aber:
Danke an alle für die vielen Links und recht umfangreichen Erklärungen. Als Außenstehender seit langem mal wieder ein Thread der so richtig mein Interesse geweckt hat. Danke euch.
 
Mir kommt hier übrigens direkt der Begriff "Reinforcement Learning" in den Kopf. Lernen durch Verstärken.

Naja, das würde bei dem Zahlenbeispiel oben auch gehen, aber gibt bessere Anwendungen dafür.

Es geht dabei darum, dass man der Maschine nichts sebst beibringt, sondern diese verschiedene Dinge versucht und dabei eben der Erfolg misst. Wenn ein kleiner Roboter das Laufen lernen soll versucht er verschiedene Dinge und die Sachen, die gut funktionieren bekommen halt ne bessere "Wertung". Interessant dabei ist halt auch, dass - gerade bei Bewegung - die selbe Technik z.B. je nach Untergrund nicht ans Ziel führt usw...
 
Zu den Fischen wollt ich nochmal 2 einfachere Beispiele vorschlagen, die natürlich schlechter funktinieren werden als die SupportVectorMaschine.

In der "Lernphase" werden ja die Fische präsentiert mit der dazugehören Info, um was für einen Typ es sich handelt. Man könnte dadurch jetzt einfach zu jeder der beiden Klassen eine Art "Durchschnittsfisch" feststellen.

Um die "Daten" aus dem Bild zu benutzen: Der Durchschnittshering ist eher lang und leicht während der Durchschnittsbarsch eher kurz und schwer ist. Die beiden Durchschnittsfische werden dann also durch einen simplen Punkt repräsentiert.

Wenn man den Klassifikator nun nach der Lernphase fragt, um was es sich bei einem präsentierten Fisch wahrscheinlich handelt misst man einfach mitm Pythagoras den Abstand zu den beiden Durchschnittspunkten und das Programm gibt den dichteren als Antwort aus. Das könnte man sogar echt einfach als Einstieg selbst programmieren.

Etwas mehr advanced wird es, wenn man zu jeder der Klassen nicht nur den Mittelwert speichert sondern auch die Varianz/Standardabweichung mit speichert.
Weil wenn jetzt zB das Durchschnittsgewicht beider Fischsorten gleich ist und Heringe im Schnitt 25 lang und Barsche 15 land sind, ists schwierig einen mit Länge 20 zuzuordnen. Weiß man aber, dass die Länge von Heringen stark variiert, ist die Chance auf nen Hering größer :)
(Diese Idee ist dann quasi ein Maximum-Likelihood-Schätzer wie er auch zur Identifikation von Objekten bei Robotern eingesetzt wird. Siehe auch Hier -> Seite 23

Zu dem Thema Klassifikation gibts ja auch in der Statistik ganz viele Ansätze. Die sogenannte Clusteranalyse beschäftigt sich wohl damit.
 
Man könnte auch beides durch eine Gaussverteilung annähern und dann mit dem Bayes Klassifikator ansetzen
 
Zurück
Oben