使用列表

我在上节课中构建的示例程序,有三个数据点,我们想用一个二次多项式来插值。在那个程序中,我首先列出了数据点的x和y坐标。

#初始数据点集。x1 = 1.51 y1 = 2.55 x2 = 1.83 y2 = 2.82

当我们处理更大的数据集时,以这种方式列出数据点会变得越来越笨拙。列出这些数据的更方便的方法是使用Python列表结构。

#初始数据点集。x = [1.04, 1.51, 1.83] y = [2.71, 2.55, 2.82]

为了处理存储在这些列表中的单个数字,我们将使用索引表示法。要引用x值列表中的第一个数字,我们使用表示法xs[0]。下面是重写的程序的其余部分,以使用带有索引表示法的列表数据。

#构造多项式的系数diff10 = (y [1] y [0]) / (x [1] - x [0]) diff21 = (y [2] y [1]) / (x [2] - x [1]) c = y [0] b = diff10 = (diff21-diff10) / (x [2] - x[0]) #这是x的值,我们需要评估x = 1.7 #计算多项式的值在x使用#牛顿多项式形式的p = * (x-xs [1]) * (x-xs [0]) + b * (x-xs [0]) + c#打印结果打印(“大约1.7 x = y = = ', p)

列表和循环

也许使用列表数据格式最令人信服的原因是,通过使用循环,列表可以很自然地实现自动化。下面是一个例子:我们从创建一个数据值列表开始。

Data = [1.7,2.3,1.0,1.2,2.4]

假设我们要对这些数据值求和。下面的Python代码片段展示了如何做到这一点。

Sum = 0对于数据中的x: Sum += x

这是Python for循环的第一个例子。for循环是一种迭代结构,用于遍历某个数据值列表中的每个成员。对于列表的每个成员,For循环将该成员临时赋值给变量x。在循环体(冒号后面的代码行)中,指定要对当前值执行的操作。在本例中,我们希望将x的当前值添加到存储在sum变量中的运行总数上。Python操作符+=是一个命令,用于将x的值添加到sum的当前值上,并使其成为sum变量的新值。

循环体可以由多个语句组成。Python使用缩进来指定哪些语句属于循环体。在下一个示例中,我们想要计算数据列表中赢博体育项的平均值。要做到这一点,我们需要计算数据项的总和,并计算列表中有多少项。为此,我们引入了两个变量sum和count,并让循环体为数据列表中的每个成员更新这两个变量。

Sum = 0 count = 0 for x in data: Sum += x count += 1 average = Sum /count

要缩进Python程序中的代码行,可以使用空格或制表符。缩进语句最广泛使用的约定是每一级缩进使用四个空格。或者,您可以使用单个选项卡来进行一级缩进。任何一种方法都是可以的,尽管你不应该混合使用这两种缩进方式:如果你试图运行一个缩进不一致的程序,Python解释器会给你一个错误消息。

Visual Studio Code将自动为您处理缩进。只要在for循环的第一行末尾键入冒号并按enter键,代码就会自动为您缩进下面的行。要退出缩进,只需在一行开始处按退格键。

在一系列索引上迭代

访问列表元素的一种常用方法是使用列表索引表示法。

例如,下面是一个数据值列表:

List = [12,3,4,5,2]

列表中的每个项都与列表索引相关联。任何列表中的第一项的索引值为0,第二项的索引值为1,依此类推。您可以使用索引符号来访问列表中的单个项。例如,要打印列表中倒数第二项,可以使用语句

print(列表[3])

由于索引值从0开始,因此包含五个项目的列表中的最后一个索引是索引4,这使得倒数第二项的索引为3。

迭代列表项的另一种方法是迭代索引而不是列表项本身。为此,我们使用Python的range()结构:

对于范围(0,5)中的n: print(list[n])

表达式范围(0,5)有效地设置了从0到4的索引值列表。(范围构造总是在范围内第二个数字之前的值中向上运行。)然后,for循环遍历索引号列表,每次使用一个索引号查找原始列表中的数字。

示例-线性回归

在线性回归中,我们寻求最适合一组数据点的线性函数。

数据点通常不落在一条直线上,但可以构造一条最接近拟合数据点的直线。

这是线性回归的必要公式。给定一组坐标为xi和yi的点,我们计算平均值

两个数据序列的协方差和x序列的方差

由此我们构造了回归线的系数

α = y - β x

最佳拟合回归线有如下方程

Y = α + β x

下面是一个Python程序,它为上图所示的数据集构造回归线。

这个例子的数据集是美国几十年来的农业人口。x = (1935, 1940, 1945, 1950, 1955, 1960, 1965, 1970, 1975, 1980] y =(32.1, 30.5, 24.4, 23日,19.1,15.6,12.4,9.7,8.9,7.2)#计算平均值的两个数据集数年x = 0 xSum = 0:计数+ = 1 xSum + =年ySum流行y = 0:流行xBar ySum + = = xSum /计数yBar = ySum /计数#计算方差和方差协方差协方差= 0 = 0范围(0,计数):我的协方差+= (x[i]-xBar)*(y[i]-yBar)方差+= (x[i]-xBar)**2 #计算回归线的系数beta =协方差/方差alpha = yBar - beta * xBar #使用回归线计算x为1955年时y #的估计值estimate = alpha + beta * 1955打印(“1955年农场人口约为”,估计)

迭代一系列索引值

本程序的一部分介绍了循环构造中的另一个新思想。协方差的公式

要求同时遍历x链表和y链表。这意味着我们一直在使用的for循环结构

对于x年

不会在这里工作。我们需要遍历x列表和y列表来计算协方差。这个问题的解决方案是建立一个循环,迭代索引变量i的赢博体育可能值:

covariance = 0 for i in range(0,count): covariance += (x[i]-xBar)*(y[i]-yBar)

将这个循环结构与列表索引表示法结合使用,就得到了我们需要的东西。

Python有一个len()函数,可以赢博体育于列表或字符串来确定它们的长度。这对于编写这种类型的循环非常有用。

covariance = 0 for i in range(0,len(x)): covariance += (x[i]-xBar)*(y[i]-yBar)

打印表格

当我们编写程序时,我们想要开始做的事情是使用更大的数据列表,扩展我们可用的技术来打印这些数据。

为了以表的形式打印数据,我们需要构造一个循环来打印表的各个行。此外,我们希望对每行上打印的文本进行仔细的控制,以确保表的列排列得很好。Python通过使用字符串format()方法解决了这个问题。此方法作用于一个特殊准备的字符串,该字符串包含格式化规范,该规范充当一系列具有相关格式化信息的占位符。传递给format方法的参数是要放在占位符中的值。下面是一个例子:假设我们想要打印上面例子中x和y列表中的数据。这就是我们如何使用循环和格式字符串来管理它。

x = (1935, 1940, 1945, 1950, 1955, 1960, 1965, 1970, 1975, 1980] y =(32.1, 30.5, 24.4, 23日,19.1,15.6,12.4,9.7,8.9,7.2)打印(年人口的)我的范围(0,len (x)):打印(“{:5 d} {: > 4.1 f}’.format (x[我],[我]))

每个占位符都包含在一对花括号中。占位符以冒号开头。在设置占位符以打印数字时,需要为该数字设置格式类型:d表示十进制整数,f表示浮点数。如果希望使用一定数量的字符打印数字,可以在格式代码前面放置一个宽度说明符。在上面的示例中,我用于年份的宽度说明符5指定应该使用总共5个字符来打印年份值。如果要打印的数字少于5个字符,则会在末尾加上额外的空格,使字符数达到5个。我用于人口数字的宽度说明符4.1指定该数字应该使用总共4位数字打印,小数点右边有1位数字。与f说明符一起使用的>字符表示应该打印右对齐的数字。如果数字少于4位,则应在左侧填充额外的空格,使字符数达到4。

您可以在这里找到更多关于格式说明符的文档。

编程练习

一旦我们构造了一条回归线,我们就可以用它来预测不同x值的y值。

y预测= α + β x

与预测值相关的残差是给定xi的预测值与实际值yi之间的差。

残差= yi - (α + β xi)

另一种判断预测质量的方法是计算一系列预测的误差平方和:

修改上面的程序以打印残差表和计算的回归线的SSE。