Программа, похоже, работает, однако созданная линейная регрессионная линия не кажется действительно лучшей линией.
Я думаю, что проблема заключается в реализации уравнения. Я не уверен, правильно ли я это интерпретирую, также я не уверен, что я делаю то, что должно быть сделано в отношении последнего абзаца упражнения.
вот графическая библиотека: http://mcsp.wartburg.edu/zelle/python/ppics1/code/graphics.py
если вы хотите попробовать.
вот упражнение:
Напишите программу, которая графически отображает линию регрессии, то есть линию, наиболее подходящую для подсчета очков. Сначала попросите пользователя указать точки данных, щелкнув их в графическом окне. Чтобы найти конец ввода, поместите маленький прямоугольник с надписью "Готово" в левом нижнем углу окна; программа перестанет собирать точки, когда пользователь нажимает внутри этого прямоугольника. Линия регрессии - это строка со следующим уравнением:
вот уравнение: http://i.stack.imgur.com/xj2uu.jpg Я не могу отправлять фотографии
x является средним значением x-, а .y является средним значением y-. Когда пользователь нажимает на точки, программа должна рисовать их в графическом окне и отслеживать количество входных значений и текущую сумму значений x, y, x2 и xy. Когда пользователь нажимает внутри прямоугольника "Готово", программа затем вычисляет значение y (используя приведенные выше уравнения), соответствующие значениям x в левом и правом краях окна, чтобы вычислить конечные точки линий регрессии, проходящих через окно. После того, как линия будет нарисована, программа остановится для другого щелчка мыши, чтобы закрыть окно и выйти.
Я не могу получить код, отформатированный правильно, поэтому я включил этот http://pastebin.com/JsQ0eM2R
# 8-13-LOB.py
from graphics import *
def listMulti(list1,list2):
tempAcc = 0
for i in range(len(list1)):
tempAcc += list1[i] * list2[i]
print tempAcc
return tempAcc
def squareList(iterable):
itSum = 0
for i in iterable:
itSum += i**2
return itSum
def listMean(iterable):
return sum(iterable)/len(iterable)
def regression(xList,yList,win):
xBar = listMean(xList)
yBar = listMean(yList)
xListSq = squareList(xList)
xListXyList = listMulti(xList,yList)
m = ((xListXyList) - ((len(xList)*xBar*yBar)))/\
((xListSq) - (len(xList)* (xBar**2)))
y1 = yBar + m*(-50.0 - xBar)
y2 = yBar + m*(50.0 - xBar)
Line(Point(-50.0,y1),Point(50.0,y2)).draw(win)
return "ybar: %f\txBar: %f\tm: %f\ty1: %f\ty2: %f" %(yBar,xBar,m,y1,y2)
def windraw():
win = GraphWin("Line of Best Fit",500,500)
win.setCoords(-50.0,-50.0,50.0,50.0)
doneBox = Rectangle(Point(-50,-50),Point(-40,-45))
doneBox.setWidth(3)
doneBoxTxt = Text(Point(-45,-47.5),"DONE")
doneBox.draw(win)
doneBoxTxt.draw(win)
return win
def pointBuild(xList,yList,win):
tempPoint = Point(25,25) # prime tempPoint for sentinel loop
# tests if given point is past rectangle created for doneBox
while (tempPoint.getX() - (Point(-40,-45)).getX() == abs(tempPoint.getX() - (Point(-40,-45)).getX())) or\
(tempPoint.getY() - (Point(-40,-45)).getY() == abs(tempPoint.getY() - (Point(-40,-45)).getY())):
tempPoint = win.getMouse()
tempPoint.draw(win)
xList.append(tempPoint.getX()); yList.append(tempPoint.getY())
def main():
xList,yList = [],[]
win = windraw()
pointBuild(xList,yList,win)
print regression(xList,yList,win)
# Test out coordinate lists accumulation from pointBuild
for i in range(len(xList)-1):
print "Point(%2.2f,%2.2f)" % (xList[i],yList[i])
win.getMouse()
win.close()
main()
Я думаю, проблема в том, что ваша процедура pointBuild добавляет точку, в которой пользователь щелкает в поле "DONE" в списке регрессии, поэтому каждый набор данных имеет точку в левом нижнем углу. Вы можете подтвердить это, добавив "print xList, yList" перед возвратом pointBuild. Я бы изменил процедуру:
while True: # (a common python idiom for "do forever until we break")
tempPoint = win.getMouse()
if (tempPoint is in the DONE rectangle):
# get out, we're done: don't forget to handle the case where
# there are no points in xList/yList!
break
else:
# draw the point
# add it to xList, yList
Я думаю, вы также можете посмотреть на логику "находится в DONE rectangle". IIUC, вы просто хотите узнать, находится ли tempPoint.getX() между -50 и -40 и .getY() между -50 и -45.
Удачи!
def pointBuild(xList,yList,win): while True: tempPoint = win.getMouse() if -50 <= tempPoint.getX() <= -40 and -50 <= tempPoint.getY() <= -45: break else: tempPoint.draw(win) xList.append(tempPoint.getX()); yList.append(tempPoint.getY())