Einfache Lineare Regression

  • Da ich das noch für diverse Statistiken brauche habe ich mir mal das Zusammengebastelt.
    Hab nebenbei auch das erste mal mit GDI+ gearbeitet :D
    Funktioniert nur zur berechnung einer Regressionsgeraden! Für die anderen braucht man das Gauß-Verfahren mit Matritzen... leider hab ich noch keine ahnung wie ich sowas per script lösen lasse -.-

    Bin mir ziemlich sicher das es sich noch optimieren lässt aber fürs erste genügt es mir :)

    Der Code:

    Spoiler anzeigen
    [autoit]

    #include <GuiConstantsEx.au3>
    #include <GDIPlus.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Opt("MustDeclareVars", 1)
    Dim $input[6][2], $formel, $hgui, $gui, $graphic, $pos0, $pos1, $faktor, $width, $height, $padding_bottom
    ;Einstellungen GDI+
    $faktor = 10
    $width = 300
    $height = 300
    $padding_bottom = 10

    [/autoit] [autoit][/autoit] [autoit]

    ;Werte für die Regression [][0] = x-wert, [][1] = f(x)-wert
    $input[0][0] = 20
    $input[0][1] = 0
    $input[1][0] = 16
    $input[1][1] = 3
    $input[2][0] = 15
    $input[2][1] = 7
    $input[3][0] = 16
    $input[3][1] = 4
    $input[4][0] = 13
    $input[4][1] = 6
    $input[5][0] = 10
    $input[5][1] = 10

    [/autoit] [autoit][/autoit] [autoit]

    $formel = getlreg($input)
    MsgBox(0, "Formel:", "f(x) = "&$formel[0]&"x + ("& $formel[1] &") ")

    [/autoit] [autoit][/autoit] [autoit]

    $gui = GUICreate("Einfache Lineare Regression", $width, $height)
    $hgui = WinGetHandle($gui)
    GUISetState()
    _GDIPlus_Startup ()
    $graphic = _GDIPlus_GraphicsCreateFromHWND($hgui)
    For $i = 0 To UBound($input)-1
    _GDIPlus_GraphicsFillRect($graphic, $input[$i][0]*$faktor, $height-$padding_bottom-$input[$i][1]*$faktor, 5, 5)
    Next
    $pos0 = 0*$formel[0] + $formel[1]
    $pos1 = $width*$formel[0] + $formel[1]
    _GDIPlus_GraphicsDrawLine($graphic, 0*$faktor, $height-$padding_bottom-$pos0*$faktor, $width*$faktor, $height-$padding_bottom-$pos1*$faktor)
    _GDIPlus_Shutdown()

    [/autoit] [autoit][/autoit] [autoit]

    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func getlreg(ByRef $array)
    Local $average, $new[2], $out[2]
    If Not IsArray($array) Then
    SetError(1)
    Return 0
    EndIf
    $average = getav($array)
    For $i = 0 To UBound($array)-1
    $new[0] += ($array[$i][0] - $average[0]) * ($array[$i][1] - $average[1])
    $new[1] += ($array[$i][0] - $average[0]) ^ 2
    Next
    $out[0] = $new[0] / $new[1]
    $out[1] = $average[0] - ($new[0] / $new[1]) * $average[1]
    Return $out
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func getsum(ByRef $array)
    Local $out[2]
    If Not IsArray($array) Then
    SetError(1)
    Return 0
    EndIf

    For $i = 0 To UBound($array)-1
    $out[0] += $array[$i][0]
    $out[1] += $array[$i][1]
    Next
    Return $out
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func getav(ByRef $array)
    Local $sums, $out[2]
    $sums = getsum($array)
    $out[0] = $sums[0] / UBound($array)
    $out[1] = $sums[1] / UBound($array)
    Return $out
    EndFunc

    [/autoit]

    MFG FireFlyer

    *Paradox ist, wenn man sich im Handumdrehen den Fuss bricht* :D

    3 Mal editiert, zuletzt von FireFlyer (17. Februar 2009 um 09:07)

  • Naja man verwendet es zum größten Teil in der angewandten Mathematik besonders wenn man über Messungen auf eine Funktion schließen will. Bei einer Messung kommt nie 100% das raus was man haben will, also wie z.b. in meinem beispiel, die Punkte sind gestreut. Mit der linearen Regression kann man nun auf eine Funktion zurückschließen (bei mir halt eben nur eine gerade, x² etc ist leider nicht drin :().

    Man bekommt also quasi die Steigung und den Wert des Schnittpunktes bei x=0 raus z.b.:

    f(x) = -0,5x + 5

    daraus kann man jetzt z.b. schließen (wieder als beispiel) der X-Wert ist der Preis für ein Produkt und der Y-Wert ist die Nachfrage. Wenn der Preis (xwert) steigt dann sinkt also die nachfrage.
    Da ich als Hauptfach (gym) Biologie hatte wurde das bei uns oft in der Genetik verwendet um irgendwelche zusammenhänge herzustellen (z.b. nahrung und vermehrung etc.)
    Wir hatten das allerdings alles nur mit dem Taschenrechner gemacht -.- also werte eingetippt Funktion ausgesucht x ode x² oder x³ usw und flupp war das ergebnis da...
    Das hier war nun mein erster Versuch es so zu lösen und es gleich noch per Programmiersprache umzusetztn :)

    Jetzt kommt der nächste Schritt: x², x³ usw. dafür verwendet man das Gauß-Verfahren (haben wir auch alles in der Schule gemacht) nur mir wird nicht klar wie man dem Script beibringen soll eine Matrix nach einem bestimmten Muster aufzulösen o_O hat das schonmal jemand gemacht?

    MFG FireFlyer

    *Paradox ist, wenn man sich im Handumdrehen den Fuss bricht* :D