C Maschinelles Lernen

also die signale werden mit faktoren multipliziert, summiert, durch eine oder mehrere funtkionen gejagt, wieder mit faktoren multipliziert und summiert. aus x1, x2 usw. wird y. gibt es nicht so ein hello world programm für maschinelles lernen? was soll ich hier jetzt für x, w usw. wählen?
 
Maschinelles Lernen ist eben nicht so simpel auf ein Hello World herunterbrechbar, kauf dir Literatur zu dem Thema und fang an dich da reinzulesen.
Das kann man nicht einfach so schnell mal austesten oder mit einer Hand voll Zeilen lernen.
 
wirklich nicht! und das ist auch nicht das problem daran!

wenn du eine knotenklasse derart wie beschrieben hast machste dir deine netzklasse mit versch. LAYERN /schichten von knoten...jeder knoten im layer ist mit jedem knoten aus dem layer vorher verbunden und hat dementsprechend auch einen parameter den es zu finden gilt.(und das macht die musik aus!)
durch zwischenlayer lassen wie gesagt boolsche logik-aussagen (auch fuzzy, quasi "in etwa wahr" ;)) bilden.

parameterfindung:
1.gute startwahl aufgrund von vorwissen (teils sehr schwer)/heuristik oder komplett random (gefährlich! kann gut und schlecht enden)
2.testmenge an inputs mit bekannten outputs ("gold standard")
3.iterativ parameter anpassen und ausgabe anhand bekanntem ergebnis verbessern

im optimalfall hat man das netz dann "angelernt" auf problemstellungen wie sie in der testmenge vorkommen (das kann viel sein! von spamfiltern bis (zeug mit dem ich zu tun habe) sekundärstrukturvorhersagen aus aminosäuresequenzen).

probleme:
-overfitting/overtraining:
das netz liefert perfekte antworten für die bekannte menge aber rotz bei unbekanntem.
 
würde gerne wieder mal ein paar zeilen codes sehen. wie kommt die datenbank zustande(stream, fopen etc.)? wie wird der vergleich zwischen bestehenden und neuen trainingsdaten realisiert(arrays, strcmp etc.)? wie würde das beispiel mit den fischen in seiner einfachsten form aussehen?
 
die konkrete implementierung von teilaspekten ist eigentlich völlig unintressant, das intressante sind die prinzipien dahinter.

klar kannst du information in irgendeiner parsebaren form in einer txt-datei haben und per fopen auslesen....aber auch aus einer sql-datenbank u.ä. und erstmal umwandeln müssen...das ist schon viel zu spezifisch!


das wichtige ist z.B. möglichst genaue deskriptoren zu haben (gut ist möglichst hoher INFORMATIONSGEWINN http://de.wikipedia.org/wiki/Entropie_(Informationstheorie))

bei den fischen sind deskriptoren/beschreiber z.b.:
größe? gewicht? farbe? form?
Ergänzung ()

wenn's dich wirklich intressiert hier mal ein real-world bsp mit testklasse (muss ja wissen dass der code funzt) und testdatensatz.
http://dl.dropbox.com/u/2791945/bayes.zip

snp.txt sind REELLE daten für sog. single nucleotide polymorphismen->gängige genommutationen die z.B. dich und mich unterscheiden und trotzdem sind wir beide menschen.;)

knackpunkt hier:
die erste spalte besteht aus nullen und einsen, die nullen klassifizieren patienten die gesund sind, die einsen patienten mit einer bestimmten krebsart.

darauf wird nun ein sog. naive-bayes-classifier http://de.wikipedia.org/wiki/Bayes-Klassifikator
trainiert und getestet.. (technik: k-fold-cross-validation..)

der c++ code ist nicht so toll, bin kein coder ;) soll nur funzen.
du wolltest code, jetzt hast du erstmal.
 
danke, aber der code läuft bei mir nicht. benutze dev c++.
 
tja, schade.
<- gcc unter os x/linux.
bin da nicht so firm,muss man da nicht einfach die includes ändern?
und hau mal die #pragmas weg, da hab ich mit parallelisierung experimentiert. :-)
naja, weg. *arbeit*
 
was genau passiert in dem programm? wo befinden sich die "prinzipien" für maschinelles lernen?
 
steht oben, es implementiert einen naive-bayes-klassifikator.
hier kannst du dich in der reihenfolge belesen: (achtung, mathe!)
http://de.wikipedia.org/wiki/Bedingte_Wahrscheinlichkeit
http://de.wikipedia.org/wiki/Bayestheorem
http://de.wikipedia.org/wiki/Bayes-Klassifikator

und programmintern wird das ausgenutzt und primär gezählt ;)
genauigkeit hiermit:
http://en.wikipedia.org/wiki/Cross-validation_(statistics)#K-fold_cross-validation

sorry, dass ich nicht mehr dazu sage, aber wenn man sich schon freiwillig dafür intressiert muss man sich auch um die basics kümmern.
 
Ein einfaches Beispiel.
Denke dir eine Zahl zwischen 1 -10, ich sage dir welche es ist. Man merkt sich jede Zahl am anfang ist die Wahrscheinlichkeit 1 zu 10. Im weiteren verlauf ändern sich die Wahrscheinlichkeiten, da jede Zahl die einmal angegeben wurden, eine höhere Wahrscheinlichkeit hat wieder zu kommen. Am anfang ist es ziemlich ungenau, je mehr durchläufe generiert wurden, je anders ist die Verteilung.
So läuft maschinelles lernen ab.
Oder die Zahl ist > 5 oder kleiner 5 etc.
So hat man nach mehreren durchläufen andere Wahrscheinlichkeiten als am anfang. Dadurch kann man auch Zufallszahlengeneratoren testen, nach paar Mio. Zufallszahlen sollte die Zahlenverteilung zwischen 1 und 10 bei ca. 10 % liegen. Weicht nach mehreren durchläufen die ergebnisse stark ab, ist dies ein schlechter Zufallszahlengenerator.
 
Zuletzt bearbeitet:
ich bin immer noch am überlegen, wie ich die datenbank einfüge und vor allem wie der vergleich zwischen den werten stattfindet.
 
die datenbank besteht aus "stichproben" deren "features" (annotationen jeder stichprobe), wie das am ende aussieht ist völlig implementierungsabhängig.
zusätzlich brauchst du für supervised-methoden (wie den bayes-klassifikator oder alles nach was du fragst) ein LABEL für jeden probeneintrag.
label heisst: hallo ich gehöre in diese gruppe (bsp fischbeispiel:"ich bin ein hering")

gibt ein nettes e-book, vll ist das ja was für dich:
http://www-stat.stanford.edu/~tibs/ElemStatLearn/

dort ziehbar.
 
danke für den link. also wahrscheinlichkeitsrechnung spielt eine rolle ok. das beispiel mit dem spamfilter wird des öfteren aufgezeigt. kann man anhand eines einfachen beispiels sehen, wie es funktioniert?

also man erhält eine email. der inhalt besteht aus einem satz der einfachheit halber. wie sieht das programm nun, ob es spam ist? schlüsselwörter, mehrfach gleiche buchstaben, zuviele konsonanten hinterienander, keine leerzeichen etc. da gibt es ja diese eine formel, was beinhaltet die genau?
 
Eigeninitiative ist nicht dein Ding oder?

In dem Wikipedia-Artikel steht drinne, dass die Wahrscheinlichkeit genommen wird ob ein Wort in Spam-Mails vorkommt oder nicht.
Da musst du eben Buch führen über die Wörter.
 
du musst solche probleme etwas abstrakter betrachten ;)
also wenn du keine FUNDIERTE idee von prinzipien der wahrscheinlichkeitsrechnung hast ist alles an vorhaben in der richtung sowieso ungeeignet.
 
siehste mal! und mit so etwas rudimentären wie dem bayes kannste effektiv schon garnicht verkehrt krebsrisiko VORHERSAGEN.
großes tennis.
 
was hier vermittelt wird, leuchtet mir schon irgendwie ein, aber wie codiert man das in c? wie öffne ich die büchse der pandora sozusagen. ok...vergessen wir den vergleich.

also wenn man sich das ganze als blackbox vorstellt, kommen da eine emails rein und auf der anderen seite eine ham und spam raus. was stellen diese größen dar? wie definiere ich diese in c? in der blackbox wird jede mail mit nummern vermerkt und anschließend nach schlüsselwörtern durchsucht. char[]=["spamword1","spamwordx"] so in der art. schon da habe ich meine probleme mit dem suchen von wörtern in strings. nach einzelnen buchstaben zu suchen geht noch. ok nehmen wir mal an, diese problem ist gelöst. die wörter sind gezählt und werden mit wahrscheinlichkeitsfaktoren versehen. was könnte es da für besonderheiten geben? starke tendenz zu spam...wie macht man sinnvolle abschätzungen? am ende haben wir was über oder unter 50%. was passiert nun? neue emails, durch die es dann besser unterscheiden kann?
 
ich finde zum zählen Map-klassen gut, heißen die so in C++? in java mal zumindest, in python dictionaries.
 
pseudo code
'User kennzeichnet eine Email als SPAM = lernprozess
function addspam(string email)
for each spamwort in email
spamwort = spamwort + 1

for each hamwort in email
hamwort = hamwort - 1
}

eigentlicher spamfilter
function spamfilter(string email)
int spamwert = 0
int hamwert = 0
for each spamwort in email
spamwert += spamwortwert

for each hamwort in email
hamwert+ = hamwortwert

wenn man jetzt 50 50 hat dann reicht
if spamwert > hamwert
spam = true
else
spam = false

sonst multipliziert man noch die Werte mit den jeweiligen % zahlen. z. B. 60 40 etc.

richtige spamfilter haben dann, aber noch verschiedene Bereiche die durchlaufen werden, z. B. länge der email, anzahl links etc.
aber zum lernen muß man klein anfangen.
 
Zuletzt bearbeitet:
Zurück
Oben