Помогите с упражнением (8-13) для программирования на Python от John Zelle

1

Программа, похоже, работает, однако созданная линейная регрессионная линия не кажется действительно лучшей линией.

Я думаю, что проблема заключается в реализации уравнения. Я не уверен, правильно ли я это интерпретирую, также я не уверен, что я делаю то, что должно быть сделано в отношении последнего абзаца упражнения.

вот графическая библиотека: 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()
Теги:

1 ответ

0
Лучший ответ

Я думаю, проблема в том, что ваша процедура 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.

Удачи!

  • 0
    Спасибо @DSM! Координаты x и y добавляются в соответствующие списки. pointBuild () теперь выглядит следующим образом: 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())

Ещё вопросы

Сообщество Overcoder
Наверх
Меню