gpt4 book ai didi

python - 帮助进行 John Zelle 的 Python 编程练习 (8-13)

转载 作者:太空宇宙 更新时间:2023-11-03 19:30:14 26 4
gpt4 key购买 nike

该程序似乎有效,但是创建的线性回归线似乎并不是真正的最佳拟合线。

我认为问题在于方程的实现。我不确定我的解释是否正确,我也不确定我是否在做练习最后一段应该做的事情。

这是图形库:http://mcsp.wartburg.edu/zelle/python/ppics1/code/graphics.py如果你想尝试一下。

这是练习:

编写一个程序,以图形方式绘制回归线,即通过点集合最适合的线。首先要求用户通过在图形窗口中单击数据点来指定数据点。要找到输入的结尾,请在窗口的左下角放置一个标记为“完成”的小矩形;当用户在该矩形内单击时,程序将停止收集点。回归线是具有以下等式的线:

这里是等式:/image/xj2uu.jpg我无法发布图片

x 是 x 值的平均值,.y 是 y 值的平均值。当用户单击点时,程序应将它们绘制在图形窗口中,并跟踪输入值的计数和x、y、x2 和 xy 值的运行总和。当用户在“完成”矩形内单击时,程序会计算与窗口左右边缘的 x 值相对应的 y 值(使用上面的方程),以计算跨越窗口的回归线的端点。绘制线条后,程序将暂停,等待再次单击鼠标,然后关闭窗口并退出。

我似乎无法正确格式化代码,所以我包含了这个 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 例程将用户在“完成”框中单击的点添加到回归列表中,因此每个数据集在左下角都有一个点。您可以通过在 pointBuild 返回之前添加“print xList, yList”来确认这一点。我会将例程修改为:

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

我想您可能还想看看“位于完成矩形中”逻辑。 IIUC,您只想知道 tempPoint.getX() 是否在 -50 到 -40 之间以及 .getY() 是否在 -50 到 -45 之间。

祝你好运!

关于python - 帮助进行 John Zelle 的 Python 编程练习 (8-13),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6256382/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com