Hallo Freunde,
ich suche eine Möglichkeit um Datenbanken zu programmieren. Darin sollen
viele, viele Datensätze eingelesen werden und komplexe Abfragen
erstattet sein.. So nach dem Motto trifft Punkt A zu ist das vollkommen
richtig. Trift Punkt A nur teilweise zu errechne die Wahrscheinlichkeit,
dass A richtig ist... So in der Art. Ich hoffe Ihr versteht mein
Anliegen.
Achja und ne graphische Oberfläche wäre auch was feines. Evtl. sogar ne
graphische Ausgabe der Abfrage á la Excel oder sowas.
Kenntnisse hab ich fortgeschritten in C und Grundkenntnisse in C#.
Welche Programmiersprache ist empfehlenswert? Eine extra Sprache zum DB
programmieren? Alles in C zu proggen wäre sicher ein Graus...
Viele Grüße,
Phil
Phil schrieb:> Hallo Freunde,>> ich suche eine Möglichkeit um Datenbanken zu programmieren. Darin sollen> viele, viele Datensätze eingelesen werden und komplexe Abfragen> erstattet sein.. So nach dem Motto trifft Punkt A zu ist das vollkommen> richtig. Trift Punkt A nur teilweise zu errechne die Wahrscheinlichkeit,> dass A richtig ist... So in der Art. Ich hoffe Ihr versteht mein> Anliegen.
Nicht wirklich.
Erst mal sehe ich nicht, warum das eine Datenbank im herkömmlichen Sinne
sein muss. Datenbanken setzt man dann ein, wenn es gilt, viele Daten
miteinander zu verknüpfen und so jede Information nur einmal zu
speichern. Der klassische relationale Aufbau geht über Tabellen, die
unter anderem auch Querverweise in andere Tabellen haben. In deinem
Anforderungsprofil lässt sich nichts erkennen, was auf einen derartigen
Aufbau schliessen lässt.
Allerdings wird der Begriff "Datenbank" in der Programmierung gerne auch
mal etwas weiter gefasst.
Eine Array bestehend aus Strukturen mit den Daten darin, nennt man auch
schon gerne mal die 'Datenbank des Programms' und meint damit einfach
nur das dort der Platz ist, an dem alles zentral gespeichert ist.
> Welche Programmiersprache ist empfehlenswert?
Die, die du kannst.
> Eine extra Sprache zum DB> programmieren? Alles in C zu proggen wäre sicher ein Graus...
Yep.
grafische Oberflächenprogrammierung in C ist zwar möglich, aber nicht
lustig.
Phil schrieb:> Ich hoffe Ihr versteht mein> Anliegen.
Nicht wirklich.
> Achja und ne graphische Oberfläche wäre auch was feines. Evtl. sogar ne> graphische Ausgabe der Abfrage á la Excel oder sowas.
Solls eine haben oder nicht?
Das sollte von Anfang an klar sein, sonst wirds ein Chaos.
> Kenntnisse hab ich fortgeschritten in C und Grundkenntnisse in C#.
Dann nimm doch eine von denen.:-)
> Welche Programmiersprache ist empfehlenswert?
Achtung, gleich fängt hier ein Glaubenskrieg an...
> Eine extra Sprache zum DB> programmieren? Alles in C zu proggen wäre sicher ein Graus...
Wenn du c schon kannst, warum nicht, außer es widerspricht deinen
Anforderungen.
Diese Anforderungen solltest du auch mal ganz ausführlich irgendwo
festmachen, Stichwort Lastenheft/Pflichtenheft.
:-)
Hallo Phil,
Schau dir doch mal QT an.
Das ist C, es können "einfach" graphische Oberflächen programmiert
werden.
Eine Schnittstelle zu allen gängigen Datenbanken ist ebenfalls
vorhanden.
Beispiele gibt es auch genug im Netz.
Gruß,
Tom
Karl heinz Buchegger schrieb:> Nicht wirklich.> Erst mal sehe ich nicht, warum das eine Datenbank im herkömmlichen Sinne> sein muss. Datenbanken setzt man dann ein, wenn es gilt, viele Daten> miteinander zu verknüpfen und so jede Information nur einmal zu> speichern.
Ok. Dann nochmal ausführlicher.
Es gibt meinetwegen 100-200 Parameter. Es gibt 10000 Ereignisse.
Beispiel:
Parameter A: klein
Parameter B: blau
Parameter C: warm
Ereignis 1:
klein, blau, warm --> Wahrscheinlihkeit 100%
Ereignis 2:
klein, hellblau, warm --> Wahrscheinlichkeit 95%
Eregnis 3:
groß, grün, kalt --> Wahrscheinlichkeit 0%
Ich hoffe damit ist es verständlicher.
Ich möchte quasi Parameter und Ereignisse eingeben und auswerten lassen.
Das Projekt ist auf 2 Jahre angesetzt. Mal gucken obs klappt. Wenn nicht
auch gut. Aber ich brauch noch ne passende Sprache.
Der Endnutzer soll nachher die Möglichkeit haben neue Ereignisse
einzugeben und so die Datenbank selbständig erweitern. Zukunftsmusik
bzw. nice to have wäre eine online Anbindung an eine externe von vielen
Klienten bearbeitbare Datenbank.
Karl heinz Buchegger schrieb:>> Welche Programmiersprache ist empfehlenswert?>> Die, die du kannst.
Das kann ich ja fast nicht glauben, dass man dieses Problem am
sinnvollsten in C oder C# lösen würde.. Deshalb würde ich gerne wissen
welche Sprache sich für mein Problem eignet.
Vlad Tepesch schrieb:> das hört sich weniger nach Datenbank, sondern eher nach Expertensystem> an
Das mit dem Expertensystem hört sich gut an bzw. ist es prinzipiell das
was ich machen möchte. Super!
Wiki nennt folgende Sprachen:
CLIPS: Softwarewerkzeug zur Erstellung von Expertensystemen.
d3web: Open-source Software zur Erstellung von Expertensystemen.
JESS: Regelsystem für die Java Plattform - Nachfolger und Erweiterung
des CLIPS Regelsystems.
Prolog: eine Logik-Programmiersprache zur Erstellung von
Expertensystemen.
Kennt einer eine? Oder gibts noch ne andere Empfehlung? Graphische
Oberfläche und -Auswertungsmöglichkeiten wären ein Muss
Phil schrieb:> Karl heinz Buchegger schrieb:>> Nicht wirklich.>> Erst mal sehe ich nicht, warum das eine Datenbank im herkömmlichen Sinne>> sein muss. Datenbanken setzt man dann ein, wenn es gilt, viele Daten>> miteinander zu verknüpfen und so jede Information nur einmal zu>> speichern.>> Ok. Dann nochmal ausführlicher.>> Es gibt meinetwegen 100-200 Parameter. Es gibt 10000 Ereignisse.
Das klärt immer noch nicht, warum das jetzt eine Datenbank im Sinne
einer relationalen Datenbank sein muss und nicht einfach nur ein
1
structEvent
2
{
3
doubleParameter[200];
4
}
5
6
structEventDatabase[10000];
oder meinetwegen eine verkettete Liste oder dergleichen.
Eine Datenbank (mit all ihrem Overhead) setzt man dann ein, wenn man zb
Rechnungen mit Kundendaten verknüpfen will. Es kann x Rechnungen geben,
die alle demselben Kunden zugeordnet sind. Daher möchte man den Kunden
nur einmal speichern und in die Rechnungen kommen verweise auf diesen
Kunden rein. Dazu kommt dann in einer richtigen Datenbank die leidigen
Probleme: Wie stellt man sicher, dass eine Operation als ganzes
rückgängig gemacht werden kann, wenn eine Teiloperation schief geht; wie
macht man es, dass 5 Sachbearbeiter gleichzeitig mit der Datenbank
interagieren können, etc.
Das sind Problemstellungen, für die sich eine richtige Datenbank lohnt.
Hat man diese Problemstellungen nicht, so braucht man eine Datenbank
nicht. Was nicht heißen soll, dass man nicht trotzdem eine einsetzt,
einfach deswegen, weil man sie fertig hat.
> Beispiel:> Parameter A: klein> Parameter B: blau> Parameter C: warm>> Ereignis 1:> klein, blau, warm --> Wahrscheinlihkeit 100%>> Ereignis 2:> klein, hellblau, warm --> Wahrscheinlichkeit 95%>> Eregnis 3:> groß, grün, kalt --> Wahrscheinlichkeit 0%>> Ich hoffe damit ist es verständlicher.
Ist schon klar. Du willst von jedem Datensatz wissen, wie 'gut' er mit
den Suchbegriffen übereinstimmt. Für irgendeine, noch näher zu
bestimmende, Definition von 'gut'.
Aber auch hier:
Der Knackpunkt liegt bisher immer noch in der Definition von 'gut' also
in einer Funktion
f( selectionset, data )
so dass f eine Aussage darüber macht, wie gut ein bestimmter 'Datensatz'
zu den Suchkriterien passt und nicht darin eine relationale Datenbank
zur Verfügung zu haben.
> Der Endnutzer soll nachher die Möglichkeit haben neue Ereignisse> einzugeben und so die Datenbank selbständig erweitern. Zukunftsmusik> bzw. nice to have wäre eine online Anbindung an eine externe von vielen> Klienten bearbeitbare Datenbank.
Dann würde ich damit anfangen, mir eine fertige Datenbank wie zb. SQLite
in Source Code zu besorgen und dort mal nachzusehen ob man die Funktion
modifizieren kann, die bei einem SELECT ... WHERE die Datensätze anhand
der Suchbegriffe auswählt.
> Kennt einer eine? Oder gibts noch ne andere Empfehlung? Graphische> Oberfläche und -Auswertungsmöglichkeiten wären ein Muss
graphische Oberfläche würde ich erst mal beiseite legen.
Und zwar aus dem Grund: Ich würde eine strikte Trennung zwischen der
eigentlichen Datenengine und der Ein/Ausgabe anstreben.
Beides kann parallel entstehen, aber die strikte Trennung würde ich auf
keinen Fall aufgeben (schon allein deswegen, weil du irgendwann online
gehen willst)
Für mich hört sich das auch sehr nach Machine Learning an.
Wenn die Parameter von einander unabhängig sind, ließe sich das einfach
über Wahrscheinlichkeitsrechnung erarbeiten, und dann evtl. mit
irgendeinem priority Datentyp sortieren.
Wenn die Parameter von einander abhängig sind, ginge das mit etwas mehr
Aufwand auch.
Der eigentlich Sinn von Machine Learning wäre natürlich unbekannte
Kombinationen vorherzusagen, aber das ließe sich vielleicht auch gut
nutzen um die Datenmenge zu komprimieren.
jetzt hört sich es wieder etwas anders an.
Ein Expertensystem wird von Experten entworfen und mit deren Wissen
gefütert und bleibt dann immer gleich.
zB, der Windows-Problem-Beseitigungsassistent ist ein Beispiel dafür.
(wenn auch vielleicht nicht das beste)
Was du suchst hört sich jetzt eher nach einem Klassifikator an.
Du hast einen Eingeberaum von 100 Merkmalen (Farbton, temperatur, Größe)
und möchtest eine Wahrscheinlichkeit für verschiedene Klassen
(Ereignis1, Ereignis 2, Ereignis 3) haben.
Die Frage ist, wie gut du die Zusammenhänge deiner Inputdaten kennst.
entweder man erzeugt Trainingsdaten aus Messwerten der Größen mit
händischer Bewertung der Klasse und trainierst damit einen Klassifikator
(supervised).
Im Extremfall können das auch einzelne handimplementierte Regeln sein,
was dann wieder in Richtung Expertensystem geht, wobei dieses sich durch
Interaktivität und schrittweises Vorgehen auszeichnet.
Der Klassifikator kann dann zur Klassifikation unbekannter
Eingabevektoren benutzt werden.
Oder du lässt den Klassifikator selbst Klassen suchen (unsupervised,
clustering).
Meist sind die Klassifikatoren nach dem Training jedoch fix.
Das ganze so zu entwerfen, dass zur Laufzeit ein trainierter
Klassifikator mit neuen Daten 'nachtrainiert' wird ist je nach
Klassifikator sehr aufwendig bis unmöglich.
Such dir mal ein paar Bücher/Seiten/Infos zu den Themen 'Machinelles
Lernen', 'Data Mining', 'Wissensmanagement'
@Vlad
Ich bin mir immeer noch nicht sicher, ob das ganze überhaupt so komplex
angedacht ist.
Ich denke er will einfach nur in einem Datenwust Daten wiederfinden, die
so ungefähr auf seine Suchbegriffe passen, wobei dieses 'so ungefähr'
der entscheidende Punkt ist.
Das klassische Problem:
Du suchst in einer Datenbank nach dem "Mayer Hubert". Der bewusste
Hubert schreibt sich aber nicht mit ay sondern mit ei. Die Suchanfrage
nach "Mayer Hubert" liefert daher kein Ergebnis. Eine erweiterte Suche
würde aber hochkommen mit:
Mayer Hubert hab ich keinen gefunden. Aber mit 85% Wahrscheinlichkeit
könntest du einen "Maier Hubert" gemeint haben. Jedoch nicht "Berger
Helga", denn die hat nach meinen Kriterien nur 0% Übereinstimmung mit
deinem Suchbegriff.
In dem Fall würde ich mal empfehlen sich mit den Themen Data Mining, web
crawling und Internet Suche zu beschäftigen, evtl. könnte man einen
angepassten top-k Algorithmus benutzen, um nicht immer alle Parameter
für alle Ereignisse durch zu arbeiten.
Willst du die Daten nur speichern?
Also alle möglichen Kombinationen + das Ergebnis in eine Datenbank und
dann daraus abfragen?
Wenn ja könnte man eine SQL-Datebank aufsetzen und die dann per C,C#,...
abfragen, Libs gibts für fas jede Sprache...
Oder soll das irgendwie selbstständig (a la KI) ablaufen?
Im Prinzip könnte man das als Fehlersuche für eine Autowerkstatt sehen.
Sprich ich habe ein Problem. Das Auto fährt nicht.
Dann habe ich tausend Möglichkeiten warum das nicht sein kann und ich
fang an Parameter einzugeben wie z.B. der Auspuff qualmt oder so.
Dann gibt es eine Liste an Ursachen die ebn genau das Problem mit dem
qualmenden Auspuff enthalten. Ganz oben steht natürlich die
wahrscheinlichste. Auf Platz zwei die zweitwahrscheinlichste.
Wobei das wahreinschlichste abhängig von der allgemeinen
Eintrittswahrscheinlichkeit (sprich was ist meinetwegen bei dem Autotyp
oder allgemein die häufigste Ursache) UND den detektierbaren
Problemen/Parametern wie ebn dem qualmenden Auspuff abhängig ist.
Das Wissen für die Datenbank soll natürlich ständig erweitert werden und
sie somit flexibel bleiben...
Da ich an so ein Problem noch nie ran gegangen bin wäre ich für
jeglichen Input offen. Wie z.B. theoretische Grundlagen und ebn die
Programmiersprache.
Ich weiß halt wo ich hin will und was ich kann. Den Weg muss ich mir
erst erarbeiten.. logischerweise
Phil schrieb:> Da ich an so ein Problem noch nie ran gegangen bin wäre ich für> jeglichen Input offen. Wie z.B. theoretische Grundlagen und ebn die> Programmiersprache.
Alles klar.
Dein theoretisches Rüstzeug lautet "Expertensystem"
http://www.informatik.uni-leipzig.de/~brewka/lehre1.html
weitere Begriffe zum Suchen:
"wissensbasiertes system" bzw. "knowledge-based system"
"decision theory"
"decision-making"
"decision support systems" bzw. "DSS"
"self service software"
Phil schrieb:
> Wobei das wahreinschlichste abhängig von der allgemeinen> Eintrittswahrscheinlichkeit (sprich was ist meinetwegen bei dem Autotyp> oder allgemein die häufigste Ursache) UND den detektierbaren> Problemen/Parametern wie ebn dem qualmenden Auspuff abhängig ist.
Demnach: Subjektive Bewertung + detektierbare Parameter
Ich möchte jetzt ungern so ein Buzzword rein werfen, aber das sind
typische Probleme der Fuzzy-Logic.
Beispiele:
Riesen Problem + Auspuff qualmt stark -> Folgerung 1
Riesen Problem + Auspuff qualmt ein bisschen -> Folgerung 2
Kleines Problem + Auspuff qualmt ein bisschen -> Folgerung 3
Es handelt sich also um ein Problem mit logischen Verknüpfungen, wobei
die logischen Aussagen Wahrscheinlichkeitscharakter haben - das
behandelt die Fuzzy-Logic.
Vielleicht wirst Du ja auch unter diesem Schlagwort fündig.
Neuronale Netze, machen eigentlich genau das, was Du haben willst. Das
hat aber nicht viel mit Datenbanken zu tun. OK, Du kannst die
Parametersätze in einer Datenbank speichern. Das ist aber eher trivial.
Aus den Datensätzen dann eine Funktion zu finden, die die Parameter
optimal auf die ausgegebene "Wahrscheinlichkeit" abbildet, ist hier die
Hauptaufgabe.
Also neuronale Netze funktionieren prinzipiell so:
Man gibt einen Satz Eingangswerte (bei Dir "Parameter") vor und das
gewünschte Ausgangssignal (bei Dir "Wahrscheinlichkeit"). Damit
trainiert man das System. So macht man das dann für alle Parametersätze.
Am Schluss hat man dann ein künstliches neuronales Netz, das (im
günstigen Fall ;-) auch bei noch nicht bekannten Parametersätzen
vernünftige Ausgabedaten liefert. Habe mal vor Jahren ein wenig mit
neuronalen Netzen experimentiert. Interessante Sache. Ich weiß
allerdings nicht, ob es inzwischen fortgeschrittene, überlegene
Technologien gibt. Bin da momentan nicht am Ball.
>Im Prinzip könnte man das als Fehlersuche für eine Autowerkstatt sehen.
OK, das wäre dann ein klassisches Expertensystem. Das funktioniert aber
gewöhnlich so, dass der Anwender immer wieder Fragen beantwortet oder
Werte eingibt, worauf das System dann entscheidet, welche weiteren
Fakten vom Anwender abgefragt werden. Am Schluss steht dann im Idealfall
die korrekte Antwort des Systems.
Vergiss also das Thema neuronale Netze wieder.
High Performer schrieb:> Neuronale Netze, machen eigentlich genau das, was Du haben willst.
neuroanle Netze sind nicht die einzigen Klassifikationsalogrithmen.
SVMs mit rbf-Kernel bringen auch sehr oft gute Ergebnisse.
High Performer schrieb:>>Im Prinzip könnte man das als Fehlersuche für eine Autowerkstatt sehen.>> OK, das wäre dann ein klassisches Expertensystem.
Naja - hier kommt es darauf an, ob er einen oder mehrere Experten hat,
die diese Regeln aufstellen können.
Wenn ja, dann ist definitiv das Expertensystem das richtige.
Wenn er einfach nur ein Haufen Daten hat, mit der entsprechenden
Diagnose, dann würde ich nicht veruschen, das in ein Expertensystem zu
quetschen, sondern würde versuchen einen Klassifikator zu finden, der
mit den Daten gut umgehen kann.
Nachteil ist allerdings, dass man dann alle Einganswerte ermitteln muss,
bevor man eine Lösung bekommt.
Hier ist das schrittweise auf Regeln basierte Inferenz-System des
Expertensystems von großem Vorteil.
Also ich hätte jetzt aufgrund Deiner Angaben an eine Data Warehouse
Lösung gedacht.
Viele Quellen(User) speichern Daten ine eine Datenbank. Einige
Sourcen(z.B. Manager) definieren was sie in welcher Form aus den Daten
herauslesen möchten.
Möglicherweise liege ich mit meiner Anahme auch komplett falsch. Wenn
nicht, nach Datawarehouse, Olap, etc. suchen.