提交 2bea8f92 编写于 作者: W wizardforcel

ch13pic

上级 9b4b0a07
...@@ -44,6 +44,8 @@ heights ...@@ -44,6 +44,8 @@ heights
heights.scatter('MidParent') heights.scatter('MidParent')
``` ```
![](img/13-1.png)
收集数据的主要原因是能够预测成年子女的身高,他们的父母与数据集中相似。 在注意到两个变量之间的正相关之后,我们在第 7.1 节中做了这些预测。 收集数据的主要原因是能够预测成年子女的身高,他们的父母与数据集中相似。 在注意到两个变量之间的正相关之后,我们在第 7.1 节中做了这些预测。
我们的方法是,基于新人的双亲身高周围的所有点来做预测。 为此,我们编写了一个名为`predict_child`的函数,该函数以双亲身高作为参数,并返回双亲身高在半英寸之内的,所有子女的平均身高。 我们的方法是,基于新人的双亲身高周围的所有点来做预测。 为此,我们编写了一个名为`predict_child`的函数,该函数以双亲身高作为参数,并返回双亲身高在半英寸之内的,所有子女的平均身高。
...@@ -74,6 +76,8 @@ heights_with_predictions = heights.with_column( ...@@ -74,6 +76,8 @@ heights_with_predictions = heights.with_column(
heights_with_predictions.scatter('MidParent') heights_with_predictions.scatter('MidParent')
``` ```
![](img/13-2.png)
给定双亲身高的预测值,大致位于给定身高处的垂直条形的中心。这种预测方法称为回归。 本章后面我们会看到这个术语的来源。 我们也会看到,我们是否可以避免将“接近”任意定义为“在半英寸之内”。 但是首先我们要开发一个可用于很多环境的方法,来决定一个变量作为另一个变量的预测值有多好。 给定双亲身高的预测值,大致位于给定身高处的垂直条形的中心。这种预测方法称为回归。 本章后面我们会看到这个术语的来源。 我们也会看到,我们是否可以避免将“接近”任意定义为“在半英寸之内”。 但是首先我们要开发一个可用于很多环境的方法,来决定一个变量作为另一个变量的预测值有多好。
## 相关性 ## 相关性
...@@ -97,6 +101,8 @@ heights_with_predictions.scatter('MidParent') ...@@ -97,6 +101,8 @@ heights_with_predictions.scatter('MidParent')
hybrid.scatter('acceleration', 'msrp') hybrid.scatter('acceleration', 'msrp')
``` ```
![](img/13-3.png)
注意正相关。 散点图倾斜向上,表明加速度较大的车辆通常成本更高;相反,价格更高的汽车通常具有更大的加速。 注意正相关。 散点图倾斜向上,表明加速度较大的车辆通常成本更高;相反,价格更高的汽车通常具有更大的加速。
`msrp``mpg`的散点图表明了负相关。 `mpg`较高的混合动力车往往成本较低。 这似乎令人惊讶,直到你明白了,加速更快的汽车往往燃油效率更低,行驶里程更低。 之前的散点图显示,这些也是价格更高的车型。 `msrp``mpg`的散点图表明了负相关。 `mpg`较高的混合动力车往往成本较低。 这似乎令人惊讶,直到你明白了,加速更快的汽车往往燃油效率更低,行驶里程更低。 之前的散点图显示,这些也是价格更高的车型。
...@@ -105,6 +111,8 @@ hybrid.scatter('acceleration', 'msrp') ...@@ -105,6 +111,8 @@ hybrid.scatter('acceleration', 'msrp')
hybrid.scatter('mpg', 'msrp') hybrid.scatter('mpg', 'msrp')
``` ```
![](img/13-4.png)
除了负相关,价格与效率的散点图显示了两个变量之间的非线性关系。 这些点似乎围绕在一条曲线周围,而不是一条直线。 除了负相关,价格与效率的散点图显示了两个变量之间的非线性关系。 这些点似乎围绕在一条曲线周围,而不是一条直线。
但是,如果我们只将数据限制在 SUV 类别中,价格和效率之间仍然负相关的,但是这种关系似乎更为线性。 SUV 价格与加速度之间的关系也呈线性趋势,但是斜率是正的。 但是,如果我们只将数据限制在 SUV 类别中,价格和效率之间仍然负相关的,但是这种关系似乎更为线性。 SUV 价格与加速度之间的关系也呈线性趋势,但是斜率是正的。
...@@ -114,10 +122,14 @@ suv = hybrid.where('class', 'SUV') ...@@ -114,10 +122,14 @@ suv = hybrid.where('class', 'SUV')
suv.scatter('mpg', 'msrp') suv.scatter('mpg', 'msrp')
``` ```
![](img/13-5.png)
```py ```py
suv.scatter('acceleration', 'msrp') suv.scatter('acceleration', 'msrp')
``` ```
![](img/13-6.png)
你会注意到,即使不关注变量被测量的单位,我们也可以从散点图的大体方向和形状中得到有用的信息。 你会注意到,即使不关注变量被测量的单位,我们也可以从散点图的大体方向和形状中得到有用的信息。
事实上,我们可以将所有的变量绘制成标准单位,并且绘图看起来是一样的。 这给了我们一个方法,来比较两个散点图中的线性程度。 事实上,我们可以将所有的变量绘制成标准单位,并且绘图看起来是一样的。 这给了我们一个方法,来比较两个散点图中的线性程度。
...@@ -141,6 +153,8 @@ plots.xlim(-3, 3) ...@@ -141,6 +153,8 @@ plots.xlim(-3, 3)
plots.ylim(-3, 3); plots.ylim(-3, 3);
``` ```
![](img/13-7.png)
```py ```py
Table().with_columns( Table().with_columns(
'acceleration (standard units)', standard_units(suv.column('acceleration')), 'acceleration (standard units)', standard_units(suv.column('acceleration')),
...@@ -150,6 +164,8 @@ plots.xlim(-3, 3) ...@@ -150,6 +164,8 @@ plots.xlim(-3, 3)
plots.ylim(-3, 3); plots.ylim(-3, 3);
``` ```
![](img/13-8.png)
我们在这些数字中看到的关联与我们之前看到的一样。 另外,由于现在两张散点图的刻度完全相同,我们可以看到,第二张图中的线性关系比第一张图中的线性关系更加模糊。 我们在这些数字中看到的关联与我们之前看到的一样。 另外,由于现在两张散点图的刻度完全相同,我们可以看到,第二张图中的线性关系比第一张图中的线性关系更加模糊。
我们现在将定义一个度量,使用标准单位来量化我们看到的这种关联。 我们现在将定义一个度量,使用标准单位来量化我们看到的这种关联。
...@@ -176,18 +192,26 @@ plots.ylim(-3, 3); ...@@ -176,18 +192,26 @@ plots.ylim(-3, 3);
r_scatter(0.9) r_scatter(0.9)
``` ```
![](img/13-9.png)
```py ```py
r_scatter(0.25) r_scatter(0.25)
``` ```
![](img/13-10.png)
```py ```py
r_scatter(0) r_scatter(0)
``` ```
![](img/13-11.png)
```py ```py
r_scatter(-0.55) r_scatter(-0.55)
``` ```
![](img/13-12.png)
### 计算`r` ### 计算`r`
目前为止,`r`的公式还不清楚。 它拥有超出本课程范围的数学基础。 然而,你将会看到,这个计算很简单,可以帮助我们理解`r`的几个属性。 目前为止,`r`的公式还不清楚。 它拥有超出本课程范围的数学基础。 然而,你将会看到,这个计算很简单,可以帮助我们理解`r`的几个属性。
...@@ -223,6 +247,8 @@ t ...@@ -223,6 +247,8 @@ t
t.scatter(0, 1, s=30, color='red') t.scatter(0, 1, s=30, color='red')
``` ```
![](img/13-13.png)
第一步:将每个变量转换为标准单位。 第一步:将每个变量转换为标准单位。
```py ```py
...@@ -282,6 +308,8 @@ r ...@@ -282,6 +308,8 @@ r
t.scatter('y', 'x', s=30, color='red') t.scatter('y', 'x', s=30, color='red')
``` ```
![](img/13-14.png)
### `correlation `函数 ### `correlation `函数
...@@ -338,6 +366,8 @@ nonlinear = Table().with_columns( ...@@ -338,6 +366,8 @@ nonlinear = Table().with_columns(
nonlinear.scatter('x', 'y', s=30, color='r') nonlinear.scatter('x', 'y', s=30, color='r')
``` ```
![](img/13-15.png)
```py ```py
correlation(nonlinear, 'x', 'y') correlation(nonlinear, 'x', 'y')
0.0 0.0
...@@ -355,6 +385,8 @@ line = Table().with_columns( ...@@ -355,6 +385,8 @@ line = Table().with_columns(
line.scatter('x', 'y', s=30, color='r') line.scatter('x', 'y', s=30, color='r')
``` ```
![](img/13-16.png)
```py ```py
correlation(line, 'x', 'y') correlation(line, 'x', 'y')
1.0 1.0
...@@ -365,6 +397,8 @@ outlier = Table().with_columns( ...@@ -365,6 +397,8 @@ outlier = Table().with_columns(
outlier.scatter('x', 'y', s=30, color='r') outlier.scatter('x', 'y', s=30, color='r')
``` ```
![](img/13-17.png)
```py ```py
correlation(outlier, 'x', 'y') correlation(outlier, 'x', 'y')
0.0 0.0
...@@ -401,6 +435,8 @@ sat2014 ...@@ -401,6 +435,8 @@ sat2014
sat2014.scatter('Critical Reading', 'Math') sat2014.scatter('Critical Reading', 'Math')
``` ```
![](img/13-18.png)
```py ```py
correlation(sat2014, 'Critical Reading', 'Math') correlation(sat2014, 'Critical Reading', 'Math')
0.98475584110674341 0.98475584110674341
...@@ -416,6 +452,8 @@ correlation(sat2014, 'Critical Reading', 'Math') ...@@ -416,6 +452,8 @@ correlation(sat2014, 'Critical Reading', 'Math')
2012 年,在著名的《新英格兰医学杂志》(New England Journal of Medicine)上发表的一篇论文,研究了一组国家巧克力消费与的诺贝尔奖之间的关系。《科学美国人》(Scientific American)严肃地做出回应,而其他人更加轻松。 欢迎你自行决定!下面的图表应该让你有兴趣去看看。 2012 年,在著名的《新英格兰医学杂志》(New England Journal of Medicine)上发表的一篇论文,研究了一组国家巧克力消费与的诺贝尔奖之间的关系。《科学美国人》(Scientific American)严肃地做出回应,而其他人更加轻松。 欢迎你自行决定!下面的图表应该让你有兴趣去看看。
![](img/13-19.png)
## 回归直线 ## 回归直线
相关系数`r`并不只是测量散点图中的点聚集在一条直线上的程度。 它也有助于确定点聚集的直线。 在这一节中,我们将追溯高尔顿和皮尔逊发现这条直线的路线。 相关系数`r`并不只是测量散点图中的点聚集在一条直线上的程度。 它也有助于确定点聚集的直线。 在这一节中,我们将追溯高尔顿和皮尔逊发现这条直线的路线。
...@@ -445,6 +483,8 @@ heights_with_predictions = heights.with_column( ...@@ -445,6 +483,8 @@ heights_with_predictions = heights.with_column(
heights_with_predictions.scatter('MidParent') heights_with_predictions.scatter('MidParent')
``` ```
![](img/13-20.png)
### 标准单位下的度量 ### 标准单位下的度量
让我们看看,我们是否能找到一个方法来确定这条线。 首先,注意到线性关联不依赖于度量单位 - 我们也可以用标准单位来衡量这两个变量。 让我们看看,我们是否能找到一个方法来确定这条线。 首先,注意到线性关联不依赖于度量单位 - 我们也可以用标准单位来衡量这两个变量。
...@@ -504,6 +544,8 @@ heights_with_su_predictions = heights_SU.with_column( ...@@ -504,6 +544,8 @@ heights_with_su_predictions = heights_SU.with_column(
heights_with_su_predictions.scatter('MidParent SU') heights_with_su_predictions.scatter('MidParent SU')
``` ```
![](img/13-21.png)
这个绘图看起来就像在原始刻度上绘图。 只改变了轴上的数字。 这证实了我们可以通过在标准单位下工作,来理解预测过程。 这个绘图看起来就像在原始刻度上绘图。 只改变了轴上的数字。 这证实了我们可以通过在标准单位下工作,来理解预测过程。
### 确定标准单位下的直线 ### 确定标准单位下的直线
...@@ -512,12 +554,15 @@ heights_with_su_predictions.scatter('MidParent SU') ...@@ -512,12 +554,15 @@ heights_with_su_predictions.scatter('MidParent SU')
这里是一个橄榄形散点图,两个变量以标准单位测量。 45 度线显示为红色。 这里是一个橄榄形散点图,两个变量以标准单位测量。 45 度线显示为红色。
![](img/13-22.png)
但是 45 度线不是经过垂直条形的中心的线。你可以看到在下图中,1.5 个标准单位的垂直线显示为黑色。蓝线附近的散点图上的点的高度都大致在 -2 到 3 的范围内。红线太高,无法命中中心。 但是 45 度线不是经过垂直条形的中心的线。你可以看到在下图中,1.5 个标准单位的垂直线显示为黑色。蓝线附近的散点图上的点的高度都大致在 -2 到 3 的范围内。红线太高,无法命中中心。
![](img/13-23.png)
所以 45 度线不是“均值图”。该线是下面显示的绿线。 所以 45 度线不是“均值图”。该线是下面显示的绿线。
![](img/13-24.png)
两条线都经过原点`(0,0)`。绿线穿过垂直条形的中心(至少大概),比红色的 45 度线平坦。 两条线都经过原点`(0,0)`。绿线穿过垂直条形的中心(至少大概),比红色的 45 度线平坦。
...@@ -535,10 +580,14 @@ heights_with_su_predictions.scatter('MidParent SU') ...@@ -535,10 +580,14 @@ heights_with_su_predictions.scatter('MidParent SU')
regression_line(0.95) regression_line(0.95)
``` ```
![](img/13-25.png)
```py ```py
regression_line(0.6) regression_line(0.6)
``` ```
![](img/13-26.png)
`r`接近于 1 时,散点图,45 度线和回归线都非常接近。 但是对于`r`较低值来说,回归线显然更平坦。 `r`接近于 1 时,散点图,45 度线和回归线都非常接近。 但是对于`r`较低值来说,回归线显然更平坦。
### 回归效应 ### 回归效应
...@@ -656,6 +705,8 @@ heights_with_predictions ...@@ -656,6 +705,8 @@ heights_with_predictions
heights_with_predictions.scatter('MidParent') heights_with_predictions.scatter('MidParent')
``` ```
![](img/13-27.png)
灰色圆点显示回归预测,全部在回归线上。 注意这条线与均值的金色图非常接近。 对于这些数据,回归线很好地逼近垂直条形的中心。 灰色圆点显示回归预测,全部在回归线上。 注意这条线与均值的金色图非常接近。 对于这些数据,回归线很好地逼近垂直条形的中心。
### 拟合值 ### 拟合值
...@@ -676,12 +727,16 @@ def fit(table, x, y): ...@@ -676,12 +727,16 @@ def fit(table, x, y):
heights.with_column('Fitted', fit(heights, 'MidParent', 'Child')).scatter('MidParent') heights.with_column('Fitted', fit(heights, 'MidParent', 'Child')).scatter('MidParent')
``` ```
![](img/13-28.png)
另一个绘制直线的方式是在表方法`scatter`中,使用选项`fit_line=True` 另一个绘制直线的方式是在表方法`scatter`中,使用选项`fit_line=True`
```py ```py
heights.scatter('MidParent', fit_line=True) heights.scatter('MidParent', fit_line=True)
``` ```
![](img/13-29.png)
### 斜率的测量单位 ### 斜率的测量单位
斜率是一个比值,值得花点时间来研究它的测量单位。 我们的例子来自熟悉的医院系统中产妇的数据集。 孕期体重与高度的散点图看起来像是一个橄榄球,已经在一场比赛中使用了很多次,但足够接近橄榄球,我们可以让我们的拟合直线穿过它来证明。 在后面的章节中,我们将看到如何使这种证明更正式。 斜率是一个比值,值得花点时间来研究它的测量单位。 我们的例子来自熟悉的医院系统中产妇的数据集。 孕期体重与高度的散点图看起来像是一个橄榄球,已经在一场比赛中使用了很多次,但足够接近橄榄球,我们可以让我们的拟合直线穿过它来证明。 在后面的章节中,我们将看到如何使这种证明更正式。
...@@ -691,6 +746,8 @@ baby = Table.read_table('baby.csv') ...@@ -691,6 +746,8 @@ baby = Table.read_table('baby.csv')
baby.scatter('Maternal Height', 'Maternal Pregnancy Weight', fit_line=True) baby.scatter('Maternal Height', 'Maternal Pregnancy Weight', fit_line=True)
``` ```
![](img/13-30.png)
```py ```py
slope(baby, 'Maternal Height', 'Maternal Pregnancy Weight') slope(baby, 'Maternal Height', 'Maternal Pregnancy Weight')
3.5728462592750558 3.5728462592750558
...@@ -757,6 +814,8 @@ little_women.show(3) ...@@ -757,6 +814,8 @@ little_women.show(3)
little_women.scatter('Periods', 'Characters') little_women.scatter('Periods', 'Characters')
``` ```
![](img/13-31.png)
为了探索数据,我们将需要使用上一节定义的函数`correlation``slope``intercept``fit ` 为了探索数据,我们将需要使用上一节定义的函数`correlation``slope``intercept``fit `
```py ```py
...@@ -775,6 +834,8 @@ lw_with_predictions = little_women.with_column('Linear Prediction', fit(little_w ...@@ -775,6 +834,8 @@ lw_with_predictions = little_women.with_column('Linear Prediction', fit(little_w
lw_with_predictions.scatter('Periods') lw_with_predictions.scatter('Periods')
``` ```
![](img/13-32.png)
对应于散点图上的每个点,预测的误差是计算为实际值减去预测值。 它是点与直线之间的垂直距离,如果点在线之下,则为负值。 对应于散点图上的每个点,预测的误差是计算为实际值减去预测值。 它是点与直线之间的垂直距离,如果点在线之下,则为负值。
```py ```py
...@@ -812,16 +873,22 @@ Slope of Regression Line: 87.0 characters per period ...@@ -812,16 +873,22 @@ Slope of Regression Line: 87.0 characters per period
Intercept of Regression Line: 4745.0 characters Intercept of Regression Line: 4745.0 characters
``` ```
![](img/13-33.png)
如果我们用不同的线来创建我们的估计,误差将会不同。 下面的图表显示了如果我们使用另一条线进行估算,误差会有多大。 第二张图显示了通过使用完全愚蠢的线获得了较大误差。 如果我们用不同的线来创建我们的估计,误差将会不同。 下面的图表显示了如果我们使用另一条线进行估算,误差会有多大。 第二张图显示了通过使用完全愚蠢的线获得了较大误差。
```py ```py
lw_errors(50, 10000) lw_errors(50, 10000)
``` ```
![](img/13-34.png)
```py ```py
lw_errors(-100, 50000) lw_errors(-100, 50000)
``` ```
![](img/13-35.png)
### 均方根误差(RMSE) ### 均方根误差(RMSE)
我们现在需要的是误差大小的一个总体衡量。 你会认识到创建它的方法 - 这正是我们开发标准差的方式。 我们现在需要的是误差大小的一个总体衡量。 你会认识到创建它的方法 - 这正是我们开发标准差的方式。
...@@ -854,11 +921,15 @@ lw_rmse(50, 10000) ...@@ -854,11 +921,15 @@ lw_rmse(50, 10000)
Root mean squared error: 4322.16783177 Root mean squared error: 4322.16783177
``` ```
![](img/13-36.png)
```py ```py
lw_rmse(-100, 50000) lw_rmse(-100, 50000)
Root mean squared error: 16710.1198374 Root mean squared error: 16710.1198374
``` ```
![](img/13-37.png)
正如预期的那样,不好的直线 RMSE 很大。 但是如果我们选择接近于回归线的斜率和截距,则 RMSE 要小得多。 正如预期的那样,不好的直线 RMSE 很大。 但是如果我们选择接近于回归线的斜率和截距,则 RMSE 要小得多。
```py ```py
...@@ -866,6 +937,8 @@ lw_rmse(90, 4000) ...@@ -866,6 +937,8 @@ lw_rmse(90, 4000)
Root mean squared error: 2715.53910638 Root mean squared error: 2715.53910638
``` ```
![](img/13-38.png)
这是对应于回归线的均方根误差。 通过显着的数学事实,没有其他线路能击败这一条。 这是对应于回归线的均方根误差。 通过显着的数学事实,没有其他线路能击败这一条。
回归线是所有直线之间的唯一直线,使估计的均方误差最小。 回归线是所有直线之间的唯一直线,使估计的均方误差最小。
...@@ -875,6 +948,8 @@ lw_rmse(lw_reg_slope, lw_reg_intercept) ...@@ -875,6 +948,8 @@ lw_rmse(lw_reg_slope, lw_reg_intercept)
Root mean squared error: 2701.69078531 Root mean squared error: 2701.69078531
``` ```
![](img/13-39.png)
这个声明的证明需要超出本课程范围的抽象数学。 另一方面,我们有一个强大的工具 -- Python,它可以轻松执行大量的数值计算。 所以我们可以使用 Python 来确认回归线最小化的均方误差。 这个声明的证明需要超出本课程范围的抽象数学。 另一方面,我们有一个强大的工具 -- Python,它可以轻松执行大量的数值计算。 所以我们可以使用 Python 来确认回归线最小化的均方误差。
### 数值优化 ### 数值优化
...@@ -898,6 +973,8 @@ lw_mse(lw_reg_slope, lw_reg_intercept)**0.5 ...@@ -898,6 +973,8 @@ lw_mse(lw_reg_slope, lw_reg_intercept)**0.5
2701.690785311856 2701.690785311856
``` ```
![](img/13-40.png)
它和我们之前使用`lw_rmse `得到的值相同。 它和我们之前使用`lw_rmse `得到的值相同。
```py ```py
...@@ -982,6 +1059,8 @@ shotput ...@@ -982,6 +1059,8 @@ shotput
shotput.scatter('Weight Lifted') shotput.scatter('Weight Lifted')
``` ```
![](img/13-41.png)
这不是橄榄形的散点图。 事实上,它似乎有一点非线性成分。 但是,如果我们坚持用一条直线来做出预测,那么所有直线之中仍然有一条最好的直线。 这不是橄榄形的散点图。 事实上,它似乎有一点非线性成分。 但是,如果我们坚持用一条直线来做出预测,那么所有直线之中仍然有一条最好的直线。
我们为回归线的斜率和截距建立公式,它来源于橄榄形的散点图,并给出了下列值: 我们为回归线的斜率和截距建立公式,它来源于橄榄形的散点图,并给出了下列值:
...@@ -1022,6 +1101,8 @@ fitted = fit(shotput, 'Weight Lifted', 'Shot Put Distance') ...@@ -1022,6 +1101,8 @@ fitted = fit(shotput, 'Weight Lifted', 'Shot Put Distance')
shotput.with_column('Best Straight Line', fitted).scatter('Weight Lifted') shotput.with_column('Best Straight Line', fitted).scatter('Weight Lifted')
``` ```
![](img/13-42.png)
### 非线性回归 ### 非线性回归
上面的图表强化了我们之前的观察,即散点图有点弯曲。 因此,最好拟合曲线而不是直线。 研究假设举起的重量与铅球距离之间是二次关系。 所以让我们使用二次函数来预测,看看我们能否找到最好的曲线。 上面的图表强化了我们之前的观察,即散点图有点弯曲。 因此,最好拟合曲线而不是直线。 研究假设举起的重量与铅球距离之间是二次关系。 所以让我们使用二次函数来预测,看看我们能否找到最好的曲线。
...@@ -1073,6 +1154,8 @@ shotput_fit = best.item(0)*(x**2) + best.item(1)*x + best.item(2) ...@@ -1073,6 +1154,8 @@ shotput_fit = best.item(0)*(x**2) + best.item(1)*x + best.item(2)
shotput.with_column('Best Quadratic Curve', shotput_fit).scatter(0) shotput.with_column('Best Quadratic Curve', shotput_fit).scatter(0)
``` ```
![](img/13-43.png)
## 视觉诊断 ## 视觉诊断
假设数据科学家已经决定使用线性回归,基于预测变量估计响应变量的值。 为了了解这种估计方法的效果如何,数据科学家必须知道估计值距离实际值多远。 这些差异被称为残差。 假设数据科学家已经决定使用线性回归,基于预测变量估计响应变量的值。 为了了解这种估计方法的效果如何,数据科学家必须知道估计值距离实际值多远。 这些差异被称为残差。
...@@ -1129,6 +1212,8 @@ def scatter_fit(table, x, y): ...@@ -1129,6 +1212,8 @@ def scatter_fit(table, x, y):
scatter_fit(heights, 'MidParent', 'Child') scatter_fit(heights, 'MidParent', 'Child')
``` ```
![](img/13-44.png)
通过绘制残差和预测变量来绘制残差图。函数`residual_plot`就是这样做的。 通过绘制残差和预测变量来绘制残差图。函数`residual_plot`就是这样做的。
```py ```py
...@@ -1145,6 +1230,8 @@ def residual_plot(table, x, y): ...@@ -1145,6 +1230,8 @@ def residual_plot(table, x, y):
residual_plot(heights, 'MidParent', 'Child') residual_plot(heights, 'MidParent', 'Child')
``` ```
![](img/13-45.png)
双亲身高在横轴上,就像原始散点图中一样。 但是现在纵轴显示了残差。 请注意,该图看上去以`y=0`的横线为中心(以深蓝色显示)。 还要注意,绘图没有显示上升或下降的趋势。 我们稍后会观察到所有的回归都是如此。 双亲身高在横轴上,就像原始散点图中一样。 但是现在纵轴显示了残差。 请注意,该图看上去以`y=0`的横线为中心(以深蓝色显示)。 还要注意,绘图没有显示上升或下降的趋势。 我们稍后会观察到所有的回归都是如此。
### 回归诊断 ### 回归诊断
...@@ -1158,6 +1245,10 @@ def regression_diagnostic_plots(table, x, y): ...@@ -1158,6 +1245,10 @@ def regression_diagnostic_plots(table, x, y):
regression_diagnostic_plots(heights, 'MidParent', 'Child') regression_diagnostic_plots(heights, 'MidParent', 'Child')
``` ```
![](img/13-46.png)
![](img/13-47.png)
这个残差图表明,线性回归是合理的估计方法。 注意残差关于`y=0`的横线上下对称分布,相当于原始散点图大致上下对称。 还要注意,绘图的垂直延伸,在子女身高最常见的值上相当均匀。 换句话说,除了一些离群点之外,绘图并不是一些地方窄。另一些地方宽。 这个残差图表明,线性回归是合理的估计方法。 注意残差关于`y=0`的横线上下对称分布,相当于原始散点图大致上下对称。 还要注意,绘图的垂直延伸,在子女身高最常见的值上相当均匀。 换句话说,除了一些离群点之外,绘图并不是一些地方窄。另一些地方宽。
换句话说,在预测变量的观察范围内,回归的准确性似乎是相同的。 换句话说,在预测变量的观察范围内,回归的准确性似乎是相同的。
...@@ -1168,6 +1259,8 @@ regression_diagnostic_plots(heights, 'MidParent', 'Child') ...@@ -1168,6 +1259,8 @@ regression_diagnostic_plots(heights, 'MidParent', 'Child')
绘制数据的散点图,通常表明了两个变量之间的关系是否是非线性的。 然而,通常情况下,残差图中比原始散点图中更容易发现非线性。 这通常是因为这两个图的规模:残差图允许我们放大错误,从而更容易找出规律。 绘制数据的散点图,通常表明了两个变量之间的关系是否是非线性的。 然而,通常情况下,残差图中比原始散点图中更容易发现非线性。 这通常是因为这两个图的规模:残差图允许我们放大错误,从而更容易找出规律。
![](img/13-48.png)
我们的数据是海牛的年龄和长度的数据集,这是一种海洋哺乳动物(维基共享资源图)。 数据在一个名为`dugong`的表中。 年龄以年为单位,长度以米为单位。 因为海牛通常不跟踪他们的生日,年龄是根据他们的牙齿状况等变量来估计的。 我们的数据是海牛的年龄和长度的数据集,这是一种海洋哺乳动物(维基共享资源图)。 数据在一个名为`dugong`的表中。 年龄以年为单位,长度以米为单位。 因为海牛通常不跟踪他们的生日,年龄是根据他们的牙齿状况等变量来估计的。
```py ```py
...@@ -1204,6 +1297,10 @@ correlation(dugong, 'Length', 'Age') ...@@ -1204,6 +1297,10 @@ correlation(dugong, 'Length', 'Age')
regression_diagnostic_plots(dugong, 'Length', 'Age') regression_diagnostic_plots(dugong, 'Length', 'Age')
``` ```
![](img/13-49.png)
![](img/13-50.png)
虽然你可以发现原始散点图中的非线性,但在残差图中更明显。 虽然你可以发现原始散点图中的非线性,但在残差图中更明显。
在长度的较低一端,残差几乎都是正的;然后他们几乎都是负的;然后在较高一端,残差再次为正。 换句话说,回归估计值过高,然后过低,然后过高。 这意味着使用曲线而不是直线来估计年龄会更好。 在长度的较低一端,残差几乎都是正的;然后他们几乎都是负的;然后在较高一端,残差再次为正。 换句话说,回归估计值过高,然后过低,然后过高。 这意味着使用曲线而不是直线来估计年龄会更好。
...@@ -1220,6 +1317,10 @@ regression_diagnostic_plots(dugong, 'Length', 'Age') ...@@ -1220,6 +1317,10 @@ regression_diagnostic_plots(dugong, 'Length', 'Age')
regression_diagnostic_plots(hybrid, 'acceleration', 'mpg') regression_diagnostic_plots(hybrid, 'acceleration', 'mpg')
``` ```
![](img/13-51.png)
![](img/13-52.png)
注意残差图在加速度的较低一端变得发散。 换句话说,对于较低的加速度,误差的大小的变化比较高值更大。 残差图中比原始的散点图中更容易注意到不均匀的变化。 注意残差图在加速度的较低一端变得发散。 换句话说,对于较低的加速度,误差的大小的变化比较高值更大。 残差图中比原始的散点图中更容易注意到不均匀的变化。
如果残差图显示`y=0`的横线处的不均匀变化,则在预测变量的范围内,回归的估计不是同等准确的。 如果残差图显示`y=0`的横线处的不均匀变化,则在预测变量的范围内,回归的估计不是同等准确的。
...@@ -1337,6 +1438,8 @@ np.std(hybrid.column('residual')), np.sqrt(1 - r**2)*np.std(hybrid.column('mpg') ...@@ -1337,6 +1438,8 @@ np.std(hybrid.column('residual')), np.sqrt(1 - r**2)*np.std(hybrid.column('mpg')
scatter_fit(heights, 'MidParent', 'Child') scatter_fit(heights, 'MidParent', 'Child')
``` ```
![](img/13-53.png)
拟合值的范围在 64 到 71 之间,而所有子女的身高则变化很大,大约在 55 到 80 之间。 拟合值的范围在 64 到 71 之间,而所有子女的身高则变化很大,大约在 55 到 80 之间。
为了在数值上验证结果,我们只需要计算双方的一致性。 为了在数值上验证结果,我们只需要计算双方的一致性。
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册