Python,当试图计算线性回归的误差时,它是一个奇怪的值

我是Python新手,我被分配到创build我自己的algorithm来解决线性回归,而不使用任何导入。 问题是,当我尝试我的程序来计算错误,它给了奇怪的价值(我比较微软的Excel中计算)。 这是我的程序:

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 (xy) : ",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) 

输出是:

 Total (xy) : 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 

当我尝试使用Microsoft Excel的相同数据时的错误值是-14.25

为什么python给出的值甚至不接近excel值-14.25 ? 我无法猜测程序出了什么问题,因为我确定我正在使用正确的algorithm来计算错误。

你的问题不是python,就像你的math一样。 当你计算你的错误,首先你必须添加括号,以确保你做了正确的计算:

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

但是,你甚至没有完成,你需要用n除以这个结果然后取平方根。

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

由于这是一个编程论坛的问题,我会指出,当你在那里时,你可以使用一些内置的函数来让你自己更容易。

 for i in range(78): sumxy = sumxy + (x[i] * y[i]) 

是坏的,你已经硬编码你的列表的长度,你需要更新每次使用新的列表。 有一个内置的函数len()会为你得到这个。 在这种情况下,甚至不需要,你可以使用sum()和稍微高级的zip将列表连接在一起。

 # 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 (xy) : ",sumxy) Total (xy) : 42117.0