Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder einen alternativen Browser verwenden.
hatte mal einen code ausprobiert, bei dem das programm entschieden sollte, ob eine zahl gerade oder ungerade ist. hat aber nicht funktioniert. wie muss man hierbei am besten vorgehen, also ohne sowas wie zahl%2==0 => gerade einzubinden?
Solche Zahlenbeispiele sind viel zu "künstlich" bzw. "mathematisch". Du kannst bestimmt auch ne kompliziertere Rechnung als %2 machen aber es wird immer darauf rauslaufen, dass du eindeutig für jede Zahl feststellst ob gerade oder ungerade weil du %2 nur komplizierter Formulierst.
Man könnte zB für n prüfen ob n / 2 und (n+1)/2 das selbe ist
Bei 7 ergibt sich dann 7/2=3 und (7+1)/2=4 also ungleich also ungerade
Bei 6 ergibt sich dann 6/2 = 3 und (6+1)/2=3 also gleich also gerade
(integer division rundet ab)
(Man kann auch mit bitshifterei das letzte Bit angucken. Also return (n & 1) zumindest für n>=0 in C(++)
Aber das wäre dann identisch zu %2... also wozu den Umweg. Da findet dann auch kein Lernen statt.
Das Problem möglichst einfach mit seinem eigenen PC sowas wie lernen stattfinden zu lassen ist zB schonmal der mögliche input in den PC. Lernen erfordert ja quasi "ungnauen" (unscharfen) Input, den man mit der Tastatur natürlich nicht hinbekommt. Evtl mit der Maus
Du könntest evtl nen einfaches Programm machen, das die Bewegung der Maus aufnimmt und die Form der Mausbewegung erkennt. Anfangs macht man wieder ne Lernphase wo man zB die Zahlen 0-9 nachfährt und dem PC sagt welche es war. So könnte dein Programm dann später bei ner Mausbewegung die 0-9 erkennen weil die aktuelle Mausbewegung am ähnlichsten zu einer der bekannten ist.
Andere input möglichkeiten sind natürlich ne Webcam oder zumindest einzelne Bilder. Also Thema Bildverarbeitung.
zB als input in das Programm ein Bild, wo dann ein Obst anhand der Farbe erkannt wird oder so.
ja...erinnert mich irgendwie an regelungstechnik. ich habe nicht gesagt, dass mir die vorschläge mißfallen. ich habe einfach keine vorstellung davon, wie ein code auszusehen hat, wie sehen die voraussetzungen aus, mit welchen mitteln geht man vor?
Da gibt es natürlich keine pauschal richtige Antwort. Es kommt auf den Kontext an.
Die Frage ist dann auch, was genau eigtl. gelernt werden soll.
Das Beispiel mit den Fischen hat doch so zwei Phasen aufgezeigt, sofern man was mit Klassifikation machen will.
Die "Einlernphase":
Hier werden Objekte präsentiert und dem Programm wird mitgeteilt (=eingelernt), um was es sich handelt.
Der Mensch wählt allerdings vorher aus, auf welche Merkmale (engl. Features) das Programm achten kann. (Größe zB über eine Kamera mit Bilderkennung und Gewicht zB über eine USB-Waage).
Man könnte sagen, dass nach dieser Phase eine Art Wissensdatenbank existiert. (Das Wissen, auf das das Programm zurückgreifen kann. Bei den Fischen hat jemand die Datenbank durch das Bild mit den Punkten grafisch dargestellt).
Danach kommt die Klassifikationsphase:
Hier werden Objekte dem PC präsentiert und auf Basis des bisher eingelernten trifft der PC selbstständig Entscheidungen und beantwortet, um welche Fischsorte es sich handelt.
Es wird also das "eingelernte Wissen" benutzt, um sinnvolle Entscheidungen zu treffen.
Zumindest bei den neuronalen Netzen und ich glaube auch beim Bayes-Klassifikator für Spam funktioniert das genau so mit den 2 Phasen.
Man präsentiert Objekte, wo man die "Klasse/Gruppe/Cluster" wo sie zugeordnet werden sollen verrät und der PC kann dann später in der Anwendung "ähnliche" Objekte auch in die passende Gruppe einordnen.
Dieses 2Phasen Ding ist aber nicht pauschal bei jedem lernenden Programm nötig.
Du müsstest mal ein konkretes Beispiel sagen, wo du dir Computer-lernen wünscht^^
Sehr einfach und ganz witzig zum rumspielen sind so Programmiersprachen wie Prolog. Da kann mit sehr wenigen Zeilen "Wissen einlernen" und danach direkt Fragen stellen, die das Programm aus dem Wissen ableiten kann.
Ergänzung ()
Hier mal ein absolut minimales Beispiel in mehr (oder weniger) C++:
Code:
// Klasse Fisch mit den Attributen int laenge und int gewicht anlegen (oder sctruct)
vector<vector <Fisch> > wissen(2); // Globale Wissensdatenbank mit allen jemals eingelernten Fischen. Wird später befüllt. Größe 2, weil 2 Typen
void lerneFisch(int laenge, int gewicht, int typ) {
assert((typ == 1) || (typ == 2))
wissen(typ).push_back(Fisch(laenge, gewicht)); // Fisch-Objekt anlegen und in DB eintragen (=lernen)
}
Diese Funktion kann man jetzt benutzen zum "lernen"
Dh du rufst sie einfach für zig Fische auf vonwegen
In der DB sollten jetzt 3 kleine leichte von Typ1 und 2 große schwere von Typ2 sein.
Wenn du jetzt mit einem neuen Fisch ankommst und dein Programm entscheiden soll, um was es sich handelt braucht man natürlich eine Klassifikations- bzw Entscheidungsfunktion zur Zuordnung zu einem der Typen.
Code:
int ordneZu(int laenge, int gewicht) { // Hier fehlt natürlich der Typ. Diesen zu bestimmen ist ja Aufgabe der Funktion
// Berechne Durchschnittslaenge von allen typ1 Fischen
typ1DurchschnLaenge;
// Berechne Durchschnittslaenge von allen typ2 Fischen
typ2DurchschnLaenge;
// Berechne Durchschnittsgewicht von allen typ1 Fischen
typ1DurchschnGewicht;
// Berechne Durchschnittsgewicht von allen typ2 Fischen
typ2DurchschnGewicht;
// Jetzt: Triff die Entscheidung
if (
(abs(laenge - typ1DurchschnLaenge) < abs(laenge - typ2DurchschnLaenge)) &&
(abs(laenge - typ1DurchschnGewicht) < abs(laenge - typ2DurchschnGewicht))
)
{
return 1; // Laenge und Gewicht entspricht eher Typ 1
}
else if (
(abs(laenge - typ1DurchschnLaenge) > abs(laenge - typ2DurchschnLaenge)) &&
(abs(laenge - typ1DurchschnGewicht) > abs(laenge - typ2DurchschnGewicht))
)
{
return 2; // Laenge und Gewicht entspricht eher Typ 2
}
return 0; // Nicht eindeutig. ZB Laenge eher Typ1, aber Gewicht eher Typ2
)
}
Natürlich könnte man da jetzt vor allem bei der Entscheidungsfindung endlos verbessern. ZB das return 0 weglassen und immer die "wahrscheinlichste" Antwort geben indem man sich ein Abstandsmaß überlegt (oder die Varianz der Eigenschaften mitspeichert etc)
Sehr einfach und ganz witzig zum rumspielen sind so Programmiersprachen wie Prolog. Da kann mit sehr wenigen Zeilen "Wissen einlernen" und danach direkt Fragen stellen, die das Programm aus dem Wissen ableiten kann.
was Prolog macht ist aber kein maschinelles lernen
Code:
male(Adam)
male(Eva)
male(Kain)
male(Abel)
male(Set)
parent(Adam, Kain)
parent(Adam, Abel)
parent(Adam, Set)
parent(Eva, Kain)
parent(Eva, Abel)
parent(X, Abel)
-> X = Adam
-> X = Eva
warum es kein maschinelles lernen ist:
Code:
parent(Eva, X)
-> X = Kain
-> X = Abel
hier wird nicht der Fakt gefunden, dass Eva ein Elternteil von Set ist, es findet nämlich kein Lernen statt, sondern es wird einfach nur nach bekannten Fakten gesucht.
Ich weiß nicht mehr genau ob das EPP- oder SLD-Verfahren war, was die Lösungen dieser Konstrukte findet, ich kann dir aber garantieren, dass es nicht lernt, weil ich diese Operationen schon auf dem Papier machen musste.
Ehrlich gesagt finde ich die Durchschnittswerte der Länge der Fische zu lernen auch kein sinnvolles Maß zum Lernen, denn der Durchschnitt sagt kaum etwas aus. Man sollte eher mit einer PrecisionRule rangehen, also bei welcher Größe habe ich die beste Treffergenauigkeit um möglichst viele positive Erkennungen zu haben, und möglichst wenige negative. Danach eben die nächste Eigenschaft betrachten, so wie ich es eben vorher schon geschrieben habe.
Mit gings eigtl vor allem darum die Frage nach nem einfachen konkreten Einstieg zu beantworten..
Von einigen Profs habe ich nur mal gehört, dass es umstritten ist, ob Maschinen überhaupt mit Menschen vergleichbar "lernen" oder ob sie immer nur systematisch Regelmäßigkeiten untersuchen nach einem Schema, dass sich vorher wieder ein Mensch ausdenken musste. Bei der Diskussion kommt man aber irgendwie nie zum Ende weil Maschinen nunmal (noch?) kein echtes Bild der Welt haben können und somit nie zwischen "vernünftig" und "unvernünftig" unterscheiden können. Außerdem fehlt es ja meist an Abstraktion bei implementierten umgesetzten Lernsystemen.
Prolog war nur als Einstieg in das Thema gemeint.. Es gibt Erweiterungen die nicht-eingetragene Regeln vorschlagen, die sich Konsistent zu deinen Eingaben einpassen. So hätte der Computer quasi eine "Gesetzmäßigkeit" entdeckt, die dir evtl nichtmal selbst klar war.
Neulich war auch bei heise ein Artikel von einer Uni, die Software in diese Richtung veröffentlicht. Es gibt wohl sogar eine fertige Freeware die sowas tut. Finde ich nur gerade den Artikel nicht
Wer jetzt Set ist und wieso Eva davon Elternteil sein sollte (obwohl deine Regeln das nicht hergeben?) hab ich irgendwie nicht verstanden bei deinen Eingaben^^ Oder hab ich in Reli nicht aufgepasst?
Meine Durschschnittsrechnerei mit Fischen ist natürlich naiv^3 aber es ist das einfachste was ich "mal eben" als Code posten konnte/wollte..
Man könnte sehr einfach noch ne Abstandsberechnung (Pythagoras..) zu beiden Durschschnittsfischen ergänzen die dann sowas ausgibt wie:
"Der eingegebe Fisch entspricht zu 77% Typ1 und zu 23% Typ2"
Das sieht dann zumindest schonmal sehr cool aus! (Auch wenn es keine SVM ist.. das ist mir auch klar)
Von einigen Profs habe ich nur mal gehört, dass es umstritten ist, ob Maschinen überhaupt mit Menschen vergleichbar "lernen" oder ob sie immer nur systematisch Regelmäßigkeiten untersuchen nach einem Schema, dass sich vorher wieder ein Mensch ausdenken musste.
wie sollte etwas lernen können, was nicht selbst denken kann. Von daher geht es natürlich nur darum ein Muster zu erkennen.
kuddlmuddl schrieb:
Prolog war nur als Einstieg in das Thema gemeint.. Es gibt Erweiterungen die nicht-eingetragene Regeln vorschlagen, die sich Konsistent zu deinen Eingaben einpassen. So hätte der Computer quasi eine "Gesetzmäßigkeit" entdeckt, die dir evtl nichtmal selbst klar war.
jup, aus Prolog kommt das von mir vorher genannte FOIL.
Das Prinzip ist recht simpel, die Implementierung habe ich noch nicht ausprobiert
kuddlmuddl schrieb:
Wer jetzt Set ist und wieso Eva davon Elternteil sein sollte (obwohl deine Regeln das nicht hergeben?) hab ich irgendwie nicht verstanden bei deinen Eingaben^^ Oder hab ich in Reli nicht aufgepasst?
Adam und Eva hatten 3 Söhne: Kain, Abel und Set.
Ich wollte eben nur zeigen, dass Prolog per Standard kein maschinelles Lernen hat, weil es kann die fehlende Parent-Relation von Eva zu Set nicht finden.
kuddlmuddl schrieb:
Meine Durschschnittsrechnerei mit Fischen ist natürlich naiv^3 aber es ist das einfachste was ich "mal eben" als Code posten konnte/wollte..
jup, hab ich schon verstanden
Das Problem ist nur eben, wenn man es zu einfach macht, oder zu konstruierte Themen (Mathematik) nimmt, dann kommt man zu weit Weg von dem Gedanken des maschinellen Lernens. Aus diesem Grunde fand ich das Fisch-Beispiel auch so gut-
kuddlmuddl schrieb:
Man könnte sehr einfach noch ne Abstandsberechnung (Pythagoras..) zu beiden Durschschnittsfischen ergänzen die dann sowas ausgibt wie:
"Der eingegebe Fisch entspricht zu 77% Typ1 und zu 23% Typ2"
Das sieht dann zumindest schonmal sehr cool aus! (Auch wenn es keine SVM ist.. das ist mir auch klar)
jup, was ich vorher schon anmerken wollte, aber vergessen habe, die Euklid-Variante geht bei dem Problem noch, aber wenn ich 10 mögliche Charasterika habe, von denen vllt nur 3 ausdrucksstark sind, bringt mich der Euklid nicht weiter, da er an nutzlosen Charateristika unterscheidet.
Ein Beispiel:
Ich habe eine Datenbank mit Personendaten (Alter, Religion, Hautfarbe usw) und deren Krankheitsgeschichte und möchte nun mit maschinellem Lernen daraus eine Charakterisierung lernen mit der man beurteilen kann, wer eine erhöhte Hautkrebsgefahr hat.
Wenn ich mit einem Euklid darangehe, würde ich auch die Religion betrachten, aber es würde zu keinem Ergebnis führen, was für uns Menschen logisch ist.
Würde ich aber mit einer prozentualen Wahrscheinlichkeit herangehen, würde ich feststellen, dass die Warscheinlichkeit für Hautkrebs unter den Religionen ziemlich gleich ist, diese Charateristik mich also nicht zum Ziel führt.
Was aber herausstechen würde, ist, dass Menschen mit blasser Haut öfter an Hautkrebs erkranken als anderen, in dieser Menge ist dann auch noch die Menge der Personen mit einem Alter >= X der größte Faktor.
Sowas kann ein Euklid eben nicht feststellen.
Die Frage ist einfach wie stark sich JohnConnor in das Thema einarbeiten will, denn gelernt ist das sicherlich nicht an einem Tag. Ich würde sogar behaupten, dass wir hier von einem der komplexesten Themen der Informatik sprechen, wenn wir NP vollständige Probleme außen vorlassen.
cool...wenn ich dieses thema sehen will, reicht es aus, bei google "c maschinelles lernen" einzugeben. möchte mich schon soweit einarbeiten, dass ich in der lage bin, eigenständig einfache codes zu schreiben, bei denen etwas "gelernt" wird. wie sieht es mit folgendem beispiel aus der physik aus: das programm soll herausfinden, bei welchem winkel ein stein am weitesten fliegt. lernt das programm, wenn es durch ausprobieren verschiedener winkel sich an den maximalwert herantastet?
Theoretisch machbar, aber wieder kein Fall für maschinelles Lernen*.
Du hast ja einen Funktion für den schiefen Wurf und suchst nur einen Maximalwert, das ist Mathematik.
Das Fischbeispiel, der Hautkrebs, Spamerkennung oder eine KI für ein TicTacToe**, das wären Beispiele für sinnvolles maschinelles Lernen. Natürlich gehen auch weit mehr Spiele, aber für 4 gewinnt z.B. dürfte schon extrem schwer werden.
* Man könnte einen Startwert festlegen und von da an in beide Richtung testen, wenn er nach weiter fliegt, wenn ich den Winkel steiler mache, teste ich in diese Richtung weiter. Aber das ist kein maschinelles Lernen, das ist eine Schleife die so lange läuft bis die Differenz zweier von einem Stein mit unterschiedlichen Winkeln geworfenen Strecken eine minimalen Wert unterschreitet (da der Algorithmus sonst nie endet)
** Man könnte aus vielen gemachten Spielen regeln ableiten lassen ob sich die Gewinnchance maximiert, wenn ich mein Kreuz an Position P setze, wenn das Spielfeld folgendermaßen aussieht.
Bevor man sich an neuronale Netze macht, sollte man die anderen "Algorithmen" schonmal ausprobiert haben, denn neuronale Netze sind nicht ohne Grund die Königsdisziplin.
neuronale netze implementieren find ich ehrlich gesagt garnicht schwer.
ansatz wäre z.b. eine knotenklasse mit x inputs und y outputs und veränderlichen faktoriellen paramteren.
dann ist noch die wahl der auswertungsfkt von intresse, in der praxis sigmoidfunktionen ( f(t)=1 / ( 1+e^(-t)).
nun mindestens 3 layer (input, output und ein zwischenlayer was effektiv rudimentäre boolsche aussagenlogik ermöglicht), random parameterzuweisung und an test-set iterativ verbessern.
->
fertig
du hast knoten, jeder knoten hat ein- und ausgänge.
von jedem eingang kommt ein signal (binär 0 oder 1 (oder auch [0,1])). nun addierst du alle eingänge multipliziert mit spezifischen VORFAKTOREN und haust das in eine fkt...das ist dann wieder der ausgang etcpp.