2017-11-30 4 views
1

Ich bin Anfänger zu Python und ich bin zugewiesen, um meinen eigenen Algorithmus zu erstellen, um lineare Regression ohne Verwendung von Import zu lösen. Das Problem ist, wenn ich mein Programm versuche, den Fehler zu berechnen, gibt es den seltsamen Wert (ich vergleiche es mit Berechnung von Microsoft Excel). Hier ist mein Programm:Python, seltsam Wert bei der Berechnung der Fehler der linearen Regression

x=[1.,1.,2.,2.,2.,2.,2.,2.,2.,3.,3.,3.,3.,3.,3.,3.,3.,3.,3.,3.,3.,3.,3.,3.,3.,3.,3.,3.,4.,4.,4.,4.,4.,4.,4.,4.,4.,4.,4.,4.,4.,4.,4.,4.,4.,4.,4.,4.,4.,4.,4.,4.,4.,4.,4.,4.,4.,4.,4.,4.,4.,4.,4.,4.,4.,4.,4.,4.,4.,5.,5.,5.,5.,5.,5.,5.,5.,6.] 
y=[67.,62.,109.,83.,91.,88.,123.,100.,109.,137.,131.,122.,122.,118.,115.,131.,143.,142.,122.,140.,150.,140.,150,150.,140.,150.,130.,130.,138.,135.,146.,146.,145.,145.,144.,140.,150.,152.,157.,155.,153.,154.,158.,162.,161.,162.,165.,171.,162.,169.,167.,150.,170.,140.,140.,150.,150.,150.,160.,150.,150.,150.,150.,140.,160.,170.,160.,160.,170.,171.,188.,170.,150.,150.,160.,160.,180.,170.] 
sumx = 0 
sumxdoubled = 0 
sumxsquare = 0 
sumxy = 0 
meanx = 0 
sumy = 0 
sumerror = 0 
n= 78 

for i in range(78): 
    sumxy = sumxy + (x[i] * y[i]) 
print("Total (x.y) : ",sumxy) 

for i in range(78): 
    sumx = sumx + x[i] 
print("Total x : ",sumx) 

for i in range(78): 
    sumxsquare = sumxsquare + (x[i] ** 2) 
print("Total (x^2) : ",sumxsquare) 

sumxdoubled = sumx ** 2 
print("(Total x)^2 : ",sumxdoubled) 

meanx = sumx/n 
print("Average x : ",meanx) 

for i in range(78): 
    sumy = sumy + y[i] 
print("Total y : ",sumy) 

meany = sumy/n 
print("Average y : ",meany) 

a1 = ((n*sumxy) - (sumx * sumy))/((n*sumxsquare) - sumxdoubled) 
print("a1 = ",a1) 

a0 = meany - a1 * meanx 
print("a0 = ",a0) 
for i in range (78): 
    sumerror = sumerror + (y[i] - a0 - (a1 * x[i])) 
print("Total error = ",sumerror) 

Und der Ausgang ist:

Total (x.y) : 42117.0 
Total x : 283.0 
Total (x^2) : 1093.0 
(Total x)^2 : 80089.0 
Average x : 3.628205128205128 
Total y : 11201.0 
Average y : 143.60256410256412 
a1 = 22.312294288480153 
a0 = 62.64898354307843 
Total error = -7.673861546209082e-13 

Der Wert Fehler, wenn ich die gleichen Daten versuchen, mit Microsoft Excel -14.25 ist

Warum der Python gibt den Wert an, ist nicht einmal in der Nähe von Excel-Wert -14.25? Ich konnte nicht erraten, was mit dem Programm falsch ist, weil ich sicher bin, dass ich den richtigen Algorithmus verwende, um den Fehler zu berechnen.

Antwort

2

Ihr Problem ist nicht mit Python, so viel wie mit Ihrer Mathematik. Wenn Sie Ihren Fehler berechnen, müssen Sie zunächst Klammern hinzuzufügen, um sicherzustellen, dass Sie die korrekte Berechnung tun:

sumerror = sumerror + (y[i] - a0 - (a1 * x[i])) # <-- missing brackets 
sumerror = sumerror + (y[i] - (a0 - (a1 * x[i]))) 

Aber dann sind Sie nicht einmal fertig, müssen Sie durch n dieses Ergebnis dividieren dann nehmen die Quadratwurzel.

>>> sumerror = (sumerror/n)**0.5 
>>> print("Total error = ",sumerror) 
Total error = 12.724274483009689 

Da dies eine Frage in einem Programmier Forum ist, werde ich darauf hinweisen, dass während du da bist du ein lof von eingebauten Funktionen verwenden können, um die Dinge einfacher auf sich selbst zu machen.

Ist schlecht, Sie haben die Länge Ihrer Listen hart codiert, die Sie jedes Mal aktualisieren müssen, wenn Sie neue Listen verwenden. Es gibt eine integrierte Funktion len(), die das für Sie bekommen wird. In diesem Fall ist das nicht einmal nötig, aber Sie können einfach sum() und den etwas fortgeschritteneren Zip verwenden, um die Listen zusammenzufügen.

# zip(x, y) returns an iterator like [(x0, y0), (x1, y1), ..., (xn, yn)] 
>>> sumxy = sum(x*y for x, y in zip(x, y)) 
>>> print("Total (x.y) : ",sumxy) 
Total (x.y) : 42117.0 
Verwandte Themen