C Maschinelles Lernen

das ist doch etwas. warum hamwort = hamwort - 1?
kann man true and false auch mit 1 und 0 ausdrücken wie z.b. bei einem primzahltest?
und da wären noch die funktionen...
 
das ist kein true oder false, der ZÄHLT.
das maschinelle lernen sind alles statistische verfahren die einen erwartungswert berechnen und diesen mit erhaltenen werten vergleichen -> wahrscheinlichkeit.
 
mal ein einfaches beispiel:
Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char x[][10]= {"alpha","beta","gamma"};


int main()
{
  int i;
  char input[255];
  gets(input);
  for(i=0;i<3;i++)
  {
  if((strcmp(x[i],input)) == 0)
  printf("Found at [%d]\n",i+1);
  else
  printf("Not found [%s]\n",x[i]);
  }

  system("PAUSE");
  return 0;
}

ok hier passiert noch nichts großartiges, wie man sieht. doch was muss man tun, damit in einem satz oder gar text nach einem bestimmten begriff gesucht wird?
 
die begriffe müssen vorher bekannt sein oder dynamisch anlegbar sein, viel spass bei der speicherverwaltung in C.

gerade bei textgeschichten gebe ich dir den gutgemeinten rat das NICHT mit C zu machen.
wenn es dir um algorithmische vorgehensweisen und echt tolles programmieren geht,lege ich dir ans herz dir python anzuschauen. :)
 
wie sähe das beispiel aus, wenn nur "alpha, beta, gamma" als string angegeben wäre und nach "beta" gesucht werden soll? wie kann er nur diesen string in einem string erfassen?
 
da führen viele wege nach rom!
erstmal werden C-strings durch zeigerarithmetik mit '\0' am ende realisiert....da müsstes du also jeden mögl. start durchgehen .... was es da an netten innereien gäbe, keine ahnung!
erstmal in C einarbeiten, dann erst schwierigeres proggen.

ich betone nochmal: solche geschichten gehen schon viel besser mit C++ (und regular expressions z.b.) und erst recht mit skriptsprachen.
da kannste dann auch schnell wirklich wirklich produktiv werden!
Ergänzung ()

C z.b. :
http://www.cplusplus.com/reference/clibrary/cstring/strcmp/
 
das ist schon zu genüge getan, jetzt wird schwer geproggt. und übrigens gehts mit strstr, was ich meinte. ihr habts nicht so mit c oder?
 
mir geht es um die gute alte c programmierung. mag sein, dass für den einen oder anderen fall alternative sprachen besser geeignet sind. trotzdem will ich es mit c wissen.

hier geht es eigentlich nicht mehr nur noch darum, dass ich bei einer speziellen aufgabe hilfe benötige. interessiert dieses thema an sich euch nicht auch? lasst uns weitermachen...mit konkreten beispielen, die man in c realisieren kann.
 
ich weiß zwar, wie ich trainingsdaten speichern kann, aber eben nicht, wie ich neue trainingsdaten, die von der tastatur eingelesen werden, mit den alten vergleichen kann.
 
Naja deine Frage ist etwas unkonkret, aber du wirst vermutlich die gespeicherten Daten zunächst von der Festplatte laden müssen um dann die geladenen Daten mit den neu von der Tastatur eingelesenen Daten vergleichen zu können

edit: und nach dem Vergleich kannst du dann eine aktualisierte Version speichern.
So dass deine "datenbank" quasi um die neu eingetroffenen Informationen (oder was daraus für die gesamtinformation folgt) erweitert worden ist

Manchmal ist es garnicht nötig / möglich jedesmal den gesamten Datensatz durchzusehen bei jedem aktuellen Vergleich

Um das anhand des Fischbeispiels und meiner glorreichen Durchschnittsberechnung zu erklären:
Natürlich könnte man jeden der jemals eingelernten Fische in einer Datei speichern
Bei Eingabe des 1001ten Fisches müsste dann aus allen 1000 bisher eingegebenen der Durchschnitt jeder Klasse ermittelt werden, um die Durchschnitte jedes Fischtypes mit dem 1001 Fisch zu vergleichen.
Der Aufwand steigt also mit der Anzahl der eingelernten Fische, weil die Durchschnittsberechnung länger dauert. Man spricht auch von der nicht wünschenswerten Eigenschaft "nicht-online-fähig" oder "nicht echtzeitfähig" zu sein. (Sofern es mal sehr sehr viele Fische werden, die die Rechengeschwindigkeit übersteigen). Bei "wenigen" Fischen kann man natürlich auch jedesmal neu rechnen.

Es genügt allerdings auch die Durchschnitte der Fischklassen und die Anzahl der jeweils in diese Klasse gelernten Fische zu speichern. So hätte man auch für den 1001 ten Fisch den selben Rechenaufwand wie für den 1002 - natürlich immer konstante Anzahl von Fischklassen vorausgesetzt. Das wäre dann "online" bzw rekursiv formuliert ohne Genauigkeits/Informationsverlust.

Bsp:
Wenn ein neuer 6ter Fisch mit Gewicht 16 ankommt, der Fischtyp 1 zugeordnet wird und anschließend auch die Durchschnittswerte der zugeordneten Klasse beeinflussen soll muss ich nicht wissen, dass die Gewichte 8, 9, 10, 11, 12 den Fischtyp1 ausmachen. Es reicht auch Durchschnitt=10, Anzahl=5 in der Datenbank. Mit 5*10+16=66 erhalte ich das selbe wie mit 8+9+10+11+12+16 um den neuen Durchschnitt 66/6 = 11 zu berechnen.
(Der neue Datenbankeintrag wäre dann natürlich Durchschnitt=11, Anzahl=6)
Es bleibt also die volle Information erhalten, weil eben der Durchschnitt auch ohne jeden einzelnen Datensatz errechnet werden kann, sofern ich den alten Durchschnitt und die Anzahl der dafür verwendeten Datensätze kenne.
Ähnliches beim Kalman-Filter der immer nur Mittelwert und Kovarianz speichert - unabhängig davon, wie oft Daten eintreffen die die Zustands-Schätzung beeinflussen. Rekursiv hingeschrieben hat man bei konstanter Zustandsraum-Dimension also O(1) Komplexität für die Aktualisierung der Zustandsschätzung (unabhängig von der Anzahl der berücksichtigten Daten). Irgendwo hab ich gelesen, dass dadurch das Apollo-Programm erst möglich gewesen ist, weil damals Rechenkapazität (im Raumschiff?) tatsächlich sehr knapp war ;)
 
Zuletzt bearbeitet:
befinden sich alte und neue datansätze in derselben datei? oder ist es einfacher, wenn die alten völlig durch die neuen daten ersetzt werden?
 
Naja die Trennung zwisch "alt" und "neu" kann es doch garnicht mehr geben, wenn nach den neuen nochmal neue ankommen? Dann hast du ja "alt", "neu" und "noch neuer"^^
Wie gesagt.. entweder sammelst du immer alles an Daten einfach an.
Dann ist alles "alt", was bisher gekommen ist und nur die aktuellen Daten sind "neu".
Oder du nutzt nur die neuen Daten um irgendwas, was schon die alten Daten hergegeben haben an Information noch weiter zu verbessern

Du musst schon bischen mehr Info geben.. aber wahrscheinlich ist es am besten die laten zu lesen, mit den neuen zu vergleichen und danach alle auf einmal wieder in die datei zu schreiben. Dann sind nächstes mal wenn neue daten ankommen die alten quasi umfangreicher
 
john connor, ich sag's nochmal:
eigne dir erst einmal allgemeines zur programmierung an, bevor du solche projekte angehst.
du musst das problem runterbrechen und strukturieren lernen, dann würdest du solche fragen nicht stellen müssen.

UND:
eine objektorientierte variante würde sich hervorragend eignen.
aufgrund deiner vorfragen (cstring-api..) frage ich mich echt warum du "das gute alte C" verwenden möchtest, du tust dir echt keinen gefallen, denn so wirklich ahnung hast du eben nicht.
 
alt und neu gibt es sowieso nicht, da hat JohnConnor das maschinelle Lernen nicht verstanden.
Erst wird dem Algorithmus mit den Trainingsdaten ein Grundverständnis angelernt, daraufhin ist alles, womit man ihn füttert Testdaten, die der Algorithmus klassifizieren soll.
Merkt man später, dass irgendwelche Daten falsch klassifiziert werden, fügt man sie zur Menge der Trainigsdaten hinzu, damit der Algorithmus aus diesen Lernen kann.

Beispiel:
Ich füttere meinen Bayes-Filter mit 100 Spam-Mails und 100 NonSpam-Mails (Trainingsdaten). Der Filter hat nun gelernt, was Spam ist und was nicht, und klassifiziert nun jede eingehende Mail dahingehend. Nun kann es aber passieren, dass eine Spam-Mail nicht erkannt (falsch negativ) wird oder eine NichtSpam-Mail fälschlicherweise als Spam erkannt wird (falsch positiv), so gebe ich dem Bayes-Filter den Hinweis, wie diese Mail richtig einzustufen ist und füge somit diese Mail als Trainingsdaten dem Bayes-Filter hinzu.

@edeltoaster: danke, das denke ich mir auch schon eine ganze Weile.
 
fangen wir nicht mit diesem thema wieder an. bringt doch keinen weiter. klar...wäre ich ein as in c, sähen die fragen anders aus und ich könnte das auch möglicherweise alleine hinkriegen. so ist es aber nicht. hilfe ist erwünscht kein streit.
 
wie sieht das mit der erkennung von buchstaben aus? hab da z.b. ein feld der grösse x mal y. fülle jetzt nach belieben einige felder, sodass die summe der ausgefüllten felder einem buchstaben ähnelt. wie läuft der vergleich mit "idealen" buchstaben ab?
 
Unter http://www.spoj.pl/problems/IMGREC1/ gibt es eine konkrete Aufgabe bei der maschinelles Lernen (im Vorwege) angewandt werden kann. Es geht dabei um die Erkennung/Unterscheidung der Zeichen 0 und X aus gegebenen "Bildern". Die Zeichen können rotiert sein. Beispiele sind

Code:
x...x
.x.x.
..x..
.x.x.
x...x


xxxxx
x...x
x...x
x...x
xxxxx

Also Merkmale und Algorithmus zur Unterscheidung überlegen und die "Maschine" mit beliebig vielen Zeichen (O, X) trainieren und dann auf obiger Seite testen. Das Problem hat mir viel Spass bereitet :-)
 
kuddlmuddl schrieb:
Das nennt sich "OCR" und es gibt garantiert über 100 Ansätze das anzugehen - nicht ein einziges super-verfahren was man mal eben nachbaut

Wie kommst du bloß darauf, dass es so gemeint gewesen sein konnte? Das Problem läuft bei Sphere Online Jugde unter der Rubrik "Challenge" (=Wettbewerb). Ziel ist es unter bestimmten Einschränkungen wie z.B. Source-Code-Größe <= 50000 Byte und Laufzeit für die beschriebenen Testfälle < 21 Sekunden möglichst viele korrekte Unterscheidungen/ Zuordnungen zu finden. Der Rekord liegt zur Zeit bei 359. Mein Ansatz nutzt als Merkmale Momente (http://de.wikipedia.org/wiki/Moment_(Bildverarbeitung)) und ein "Nächster Nachbar-Klassifikator". Es sind hier viele Ansätze möglich und vor allen auch solche aus dem Gebiet "Maschinen Lernen".
 
Zurück
Oben