Suche nach einer Gleichung
-
Hallo,
ich beschäftige mich gerade mit dem Thema numerische Annäherung. Genauer gesagt geht es um folgendes Problem / um folgende Aufgabe:Ich habe eine "Blackbox", in der ein mir nicht bekanntes elektrotechnisches Netzwerk aufgebaut ist. Dieses verhält sich je nach äußeren Faktoren anders, d.h. Werte wie Admittanz, Phasenverschiebung usw., die ich messen kann, variieren z.B. nach der Temperatur (, und Luftfeuchtigkeit, Druck, usw.). Ich möchte nun versuchen eine Gleichung zu finden, die mir relativ präzise die Temperatur berechnet anhand der Messwerte, die mir zur Verfügung stehen (siehe oben). Den Referenzwert (= korrekter Wert) erhalte ich durch einen präzisen Temperatur-Messer. Das Problem ist, dass ich immer die anderen Störfaktoren wie Luftfeuchtigkeit oder Druck miteinbeziehen muss.
Als Grundlage habe ich nun einige Messungen der Admittanz, Phasenverschiebung, und dem Strom in Abhängigkeit zur Frequenz / zur Zeit gemacht, und habe somit parallel zum Referenzwert auch Messwerte als Variablen einer Gleichung. Was mir jetzt jedoch fehlt, sind die richtigen Koeffizienten, also die Gewichtung der Messwerte. Als Gleichung habe ich zurzeit eine Funktion mit 20 Koeffizienten und 16 Messwerten.
Nun meine eigentliche Frage: Anhand welcher mathematischen numerischen Annäherungsmethode lässt sich eine Gleichung finden, die mir im ersten Schritt "lokale" Optima findet, und als zweites als Erweiterung immer weiter nach optimaleren, "globaleren" Optima sucht?
Ich hoffe, dass ich mich einigermaßen klar ausgedrückt habe
Freue mich schon auf eure Antworten!dommynik
-
Mittels einer Regressionsrechnung, vermutlich in Deinem Fall multiple nicht-lineare Regression.
Für den Anfang mal mit multipler lineare Regression versuchen.
Kann aber zu unschönen Effekten bei so vielen Einflußgrößen führen.
Alternativ: neuronales Netz, und trainieren mit den Größen.
-
dommynik schrieb:
Nun meine eigentliche Frage: Anhand welcher mathematischen numerischen Annäherungsmethode lässt sich eine Gleichung finden, die mir im ersten Schritt "lokale" Optima findet, und als zweites als Erweiterung immer weiter nach optimaleren, "globaleren" Optima sucht?
Ich habe keine Ahnung, aber wenn du so was findest, kannst du das dann bei Nature einreichen? Würde nämlich so einige Leute - inklusive mir - geben, die gerne wisen würden, wie man in einem Black-Box-Problem ein globales Optimum finden kann.
-
Hey, danke für die Antworten.
@Marc++us
Mit multipler linearer Regression habe ich mich noch nie beschäftigt, werde ich aber gleich mal machen!
Und neuronale Netze - habe den Tipp schon mehrfach bekommen - klingt unheimlich schwer, zu programmieren. Ich stelle es mir nicht einfach vor, aber da werde ich auch mal schauen, was man machen kann!@otze
Mir ist bewusst, dass ein globales Optimum nicht mithilfe einer einfachen Gleichung zu finden ist! Ich bezog mich eher auf das Problem, dass ich nicht nur ein lokales Optimum finde, und das Programm dann blöderweise nicht mehr aus dem Optimum rauskommt (einfache Umsetzung des Gradientenverfahrens) - mir gings eher darum, eine Methode zu finden, die sich sofort weiter auf die Suche macht!dommynik
-
das war mir bewusst, ist aber das Selbe Problem. Denn wenn du aus jedem lokalen Optimum heraus ein besseres (ohne jegliches Wissen der Funktion) findest, dann findest du automatisch irgendwann das globale Optimum. Das geht nunmal nicht und ist ein schwieriges Problem der aktuellen Forschung, für das es keine allgemeine Lösung gibt.
Es gibt Algorithmen - insbesondere die evolutionären - die stabil gegenüber "kleinen" lokalen Optima sind. Aber was "klein" ist, ist mal wieder von der Funktion abhängig...juhu.
Ohne weiteres Wissen wirds nicht besser als:
1. zieh n zufällige Startpunkte 2. führe Gradientenabstieg auf jedem dieser Punkte durch 3. wähle den besten.
-
@otze
Die Idee mit der zufälligen Punkt-Auswahl und der Steigungsverfolgung ist auch die, die ich aktuell habe. Jedoch treten da einige Schwierigkeiten auf.Durch ein automatisches Verfahren werden mir demnächst Unmengen an Rohdaten geliefert (> 100.000 Referenzwerte und gleich viele Messwert-Pakete). Für vorerst 90% der berechneten Werte soll es eine maximal 10%-ige Abweichung vom Referenzwert geben. Da ich statistisch nicht so fit bin, fällt mir die Realisierung einer Formel dafür schwer. Ich denke aber, dass ich erst die lokalen Optima durch oben genanntes Verfahren suchen werden und danach die statistische Auswertung durchführe. Da stellt sich mir dann aber eine andere Frage :p
Gibt es Tools, mit der ich partielle Ableitungen einer Funktion mit 20 Variablen allgemein aufstellen kann? Es ist zurzeit (auf Rat eines Kollegen) eine relativ komplexe Gleichung, die ich mir lieber von einem Rechner berechnen lasse.
EDIT: Am liebsten wäre mir eine C++-Bibliothek, der ich als Input die Funktion mit allen Variablen gebe, und die mir allgemein partielle Ableitungen bilden kann! Oder auch gut: Gradienten bilden
dommynik
-
numerische Ableitungen sind die Hölle(und langsam), und symbolische Ableitungen sind noch schlimmer. Setz dich dran und rechne es von Hand aus. Wenn du 100.000 Datenpunkte hast, dann dauert Gradientenabstieg ne Weile. Da möchtest du nicht auch noch Overhead durch Faulheit haben.
Ein Tipp von mir: die numerische Ableitung ist relativ einfach zu implementieren und hilft dir dabei, Fehler in deiner Implementation der Ableitung zu finden. Wie mein Prof sagte: "beim ersten mal ist es immer falsch".
und zu deinen Anforderungen: eine Fehlerfunktion zu finden, die diese Anforderung analytisch darstellt ist schwierig, da die Fehlerfunktion unstetig ist. Der für die Regression verwendete MSE optimiert eine andere Norm. Und 1-Norm-Optimierung ist grausam. Dann wäre da noch der Hinge-Loss, der eine leichte Vereinfachung der Anforderung darstellt, aber er ist nicht stetig differenzierbar. Eventuell ginge noch der Softmaxfehler als stetige Annäherung des Hinge-Loss (Fehlerfunktion ist log(1+exp(a*x)) wobei x die gemessene Abweichung zum Referenzwert ist und a ein Hyperarameter ist)
Ich würde erst mal den MSE verwenden und hoffen, dass er das macht, was du brauchst.
Zum trainieren aber bitte nicht alle Datenpunkte verwenden, sondern so 40-60%. Die restlichen 40% brauchst du für die Fehlerabschätzung als Testset nach dem Training. Wenn du mehrere verschiedene Startpunkte miteinander vergleichen willst, brauchst du Kreuzvalidierung, sonst hast du am Ende Overfitting.
-
dommynik schrieb:
Und neuronale Netze - habe den Tipp schon mehrfach bekommen - klingt unheimlich schwer, zu programmieren. Ich stelle es mir nicht einfach vor, aber da werde ich auch mal schauen, was man machen kann!
Steht dir Matlab zur Verfügung?
-
@otze
Du hast mich überzeugt, ich werde die Ableitungen selber per Hand berechnen. Sei mir nicht böse, wenn ich nur die Hälfte von dem, was du schreibst, verstehe, ich bin erst seit kurzem an dem Thema dran, und es fällt mir schwer, mit statistischen Begriffen zu arbeiten. Ich werde, denke ich, erstmal nach einigen lokalen Optima suchen, und dann schauen, wie ich diese statistisch auswerten kann.@KasF
Nein, leider nicht. Ich habe auch nicht unbedingt vor, damit zu arbeiten - zumindest bei neuronalen Netzen. Ich lese mich da gerade ein und finde das Thema unheimlich spannend! Ein Problem bei den neuronalen Netzen ist jedoch, dass ich keine Gleichung im herkömmlichen Sinn (f(x) = ...) bekomme, sondern eben ein Netzwerk, das sich nicht so einfach in eine Gleichung packen lässt. Oder irre ich mich? Denn ich würde gerne eine Gleichung erhalten
-
Natürlich ist ein neuronales Netz als Gleichung darstellbar. Als Zeitunabhängige Funktion (was du willst, das ist keine Gleichung, sondern eine Funktionsdefinition) gehen aber nur die vorwärtsgerichteten Netzwerke. Und das sind die, die du haben willst.
dreischichtes Netzwerk (mehr willst du nicht):
f(x)=g_2(b_2+W_2 g_1(W_1x+b_1))wobei: g_2 und g_1 die Aktivierungsfunktionenen der Neuronenschichten sind, b_1 und b_2 Gewichtsvektoren und W_1, W_2 Gewichtsmatrizen.
-
@otze
Nachdem ich mich nun richtig in das Thema eingelesen habe und einige Publikationen zu dem Thema durchgegangen bin, muss ich gestehen, dass ich noch mehr von der Idee überzeugt bin. Wenn ich das richtig verstehe, werde ich drei Schichten nutzen, die Input-Schicht mit 16 Inputs (das sind meine Messwerte), eine Hidden-Schicht mit einer zurzeit unbestimmten Anzahl von Neuronen und einer Output-Schicht mit einem Output, dem gesuchten Wert. Da ich keine zeitlichen Prognosen machen möchte, ist ein vorwärtsgerichtetes Netzwerk das, was ich brauche.Das nächste, was ich definieren müsste, wäre die optimale Anzahl der zwischengeschalteten Neuronen, die Art der Aktivierungsfunktion jedes Neurons...der Rest ergibt sich ja durch das Trainieren (Gewichtung und Schwellenwert) - und natürlich ein optimales Verfahren, um das System lernen zu lassen (Änderung der Gewichtungen und Schwellenwerte anhand von Differenz von erwartetem Wert und erhaltenem Wert). Wenn ich falsch liege, oder ich etwas wichtiges übersehen habe, dann her damit!
Ich mache mich wieder ans lesen,
dommynik