目录
6.1.正态数据分布(Normal Data Distribution)
9.1.多项式回归(Polynomial Regression)
10.1.多元回归(Multiple Regression)
1.入门
机器学习使计算机能够从研究数据和统计信息中学习。机器学习是迈向人工智能(AI)方向的其中一步。机器学习是一种程序,可以分析数据并学习预测结果。
1.1.从何处开始
在本教程中,我们将回到数学并研究统计学,以及如何根据数据集计算重要数值。我们还将学习如何使用各种 Python 模块来获得所需的答案。并且,我们将学习如何根据所学知识编写能够预测结果的函数。
1.2.数据集
在计算机中,数据集指的是任何数据集合。它可以是从数组到完整数据库的任何内容。
一个数组的例子:
[99,86,87,88,111,86,103,87,94,78,77,85,86]
一个数据库的例子:
Carname | Color | Age | Speed | AutoPass |
---|---|---|---|---|
BMW | red | 5 | 99 | Y |
Volvo | black | 7 | 86 | Y |
VW | gray | 8 | 87 | N |
VW | white | 7 | 88 | Y |
Ford | white | 2 | 111 | Y |
VW | white | 17 | 86 | Y |
Tesla | red | 2 | 103 | Y |
BMW | black | 9 | 87 | Y |
Volvo | gray | 4 | 94 | N |
Ford | white | 11 | 78 | N |
Toyota | gray | 12 | 77 | N |
VW | white | 9 | 85 | N |
Toyota | blue | 6 | 86 | Y |
通过查看数组,我们可以猜测平均值可能约为 80 或 90,并且我们还可以确定最大值和最小值,但是我们还能做什么?
通过查看数据库,我们可以看到最受欢迎的颜色是白色,最老的车龄是 17 年,但是如果仅通过查看其他值就可以预测汽车是否具有 AutoPass,该怎么办?
这就是机器学习的目的!分析数据并预测结果!
在机器学习中,通常使用非常大的数据集。在本教程中,我们会尝试让您尽可能容易地理解机器学习的不同概念,并将使用一些易于理解的小型数据集。
1.3.数据类型
如需分析数据,了解我们要处理的数据类型非常重要。
我们可以将数据类型分为三种主要类别:
- 数值(Numerical)
- 分类(Categorical)
- 序数(Ordinal)
数值数据是数字,可以分为两种数值类别:
- 离散数据(Discrete Data):限制为整数的数字。例如:经过的汽车数量。
- 连续数据(Continuous Data):具有无限值的数字。例如:一件商品的价格或一件商品的大小。
- 分类数据 是无法相互度量的值。例如:颜色值或任何 yes/no 值。
- 序数数据 类似于分类数据,但可以相互度量。示例:A 优于 B 的学校成绩,依此类推。
通过了解数据源的数据类型,您就能够知道在分析数据时使用何种技术。
在下一节中,您将学习有关统计和分析数据的更多知识。
2.平均中位数模式
2.1.均值、中值和众数
从一组数字中我们可以学到什么?
在机器学习(和数学)中,通常存在三中我们感兴趣的值:
- 均值(Mean) - 平均值
- 中值(Median) - 中点值,又称中位数
- 众数(Mode) - 最常见的值
例如:我们已经登记了 13 辆车的速度:
speed = [99,86,87,88,111,86,103,87,94,78,77,85,86]
什么是平均,中间或最常见的速度值?
2.2.均值
均值就是平均值。
要计算平均值,请找到所有值的总和,然后将总和除以值的数量:
(99+86+87+88+111+86+103+87+94+78+77+85+86) / 13 = 89.77
NumPy 模块拥有用于此目的的方法:
2.2.1.实例
请使用 NumPy mean()
方法确定平均速度:
import numpy
speed = [99,86,87,88,111,86,103,87,94,78,77,85,86]
x = numpy.mean(speed)
print(x)
2.2.2.运行结果
2.3.中值
中值是对所有值进行排序后的中间值:
77, 78, 85, 86, 86, 86, 87, 87, 88, 94, 99, 103, 111
在找到中位数之前,对数字进行排序很重要。
NumPy 模块拥有用于此目的的方法:
2.3.1.实例
请使用 NumPy median()
方法找到中间值:
import numpy
speed = [99,86,87,88,111,86,103,87,94,78,77,85,86]
x = numpy.median(speed)
print(x)
2.3.2.运行结果
如果中间有两个数字,则将这些数字之和除以 2。
77, 78, 85, 86, 86, 86, 87, 87, 94, 98, 99, 103 (86 + 87) / 2 = 86.5
2.3.3.实例
使用 NumPy 模块:
import numpy
speed = [99,86,87,88,86,103,87,94,78,77,85,86]
x = numpy.median(speed)
print(x)
2.3.4.运行结果
2.4.众数
众值是出现次数最多的值:
99, 86, 87, 88, 111, 86, 103, 87, 94, 78, 77, 85, 86 = 86
SciPy 模块拥有用于此目的的方法:
2.4.1.实例
请使用 SciPy mode()
方法查找出现次数最多的数字:
from scipy import stats
speed = [99,86,87,88,111,86,103,87,94,78,77,85,86]
x = stats.mode(speed)
print(x)
2.4.2.运行结果
2.5.章节总结
均值、中值和众数是机器学习中经常使用的技术,因此了解它们背后的概念很重要。
3.标准差
3.1.什么是标准差?
标准差(Standard Deviation,又常称均方差)是一个数字,描述值的离散程度。低标准偏差表示大多数数字接近均值(平均值)。高标准偏差表示这些值分布在更宽的范围内。
例如:这次我们已经登记了 7 辆车的速度:
speed = [86,87,88,86,87,85,86]
标准差是:
0.9
意味着大多数值在平均值的 0.9 范围内,即 86.4。
让我们对范围更广的数字集合进行处理:
speed = [32,111,138,28,59,77,97]
标准差是:
37.85
这意味着大多数值都在平均值(平均值为 77.4)的 37.85 范围内。
如您所见,较高的标准偏差表示这些值分布在较宽的范围内。
NumPy 模块有一种计算标准差的方法:
3.1.2.实例
请使用 NumPy std()
方法查找标准差:
import numpy
speed = [86,87,88,86,87,85,86]
x = numpy.std(speed)
print(x)
3.1.3.运行结果
3.1.4.实例
import numpy
speed = [32,111,138,28,59,77,97]
x = numpy.std(speed)
print(x)
3.1.5.运行结果
3.2.方差
方差是另一种数字,指示值的分散程度。实际上,如果采用方差的平方根,则会得到标准差!或反之,如果将标准偏差乘以自身,则会得到方差!
如需计算方差,您必须执行以下操作:
1. 求均值:
(32+111+138+28+59+77+97) / 7 = 77.4
2. 对于每个值:找到与平均值的差:
32 - 77.4 = -45.4
111 - 77.4 = 33.6
138 - 77.4 = 60.6
28 - 77.4 = -49.4
59 - 77.4 = -18.4
77 - 77.4 = - 0.4
97 - 77.4 = 19.6
3. 对于每个差异:找到平方值:
(-45.4)2 = 2061.16
(33.6)2 = 1128.96
(60.6)2 = 3672.36
(-49.4)2 = 2440.36
(-18.4)2 = 338.56
(- 0.4)2 = 0.16
(19.6)2 = 384.16
4. 方差是这些平方差的平均值:
(2061.16+1128.96+3672.36+2440.36+338.56+0.16+384.16) / 7 = 1432.2
幸运的是,NumPy 有一种计算方差的方法:
3.2.1.实例
使用 NumPy var()
方法确定方差:
import numpy
speed = [32,111,138,28,59,77,97]
x = numpy.var(speed)
print(x)
3.2.2.运行结果
3.3.标准差
如我们所知,计算标准差的公式是方差的平方根:
√ 1432.25 = 37.85
或者,如上例所示,使用 NumPy 计算标准差:
3.3.1.实例
请使用 NumPy std() 方法查找标准差:
import numpy
speed = [32,111,138,28,59,77,97]
x = numpy.std(speed)
print(x)
3.3.2.运行结果
3.4.符号
3.5.章节总结
标准差和方差是机器学习中经常使用的术语,因此了解如何获取它们以及它们背后的概念非常重要。
4.百分位数
4.1.什么是百分位数?
统计学中使用百分位数(Percentiles)为您提供一个数字,该数字描述了给定百分比值小于的值。
例如:假设我们有一个数组,包含住在一条街上的人的年龄。
ages = [5,31,43,48,50,41,7,11,15,39,80,82,32,2,8,6,25,36,27,61,31]
什么是 75 百分位数?答案是 43,这意味着 75% 的人是 43 岁或以下。
NumPy 模块有一种用于找到指定百分位数的方法:
4.1.1.实例
使用 NumPy percentile()
方法查找百分位数:
import numpy
ages = [5,31,43,48,50,41,7,11,15,39,80,82,32,2,8,6,25,36,27,61,31]
x = numpy.percentile(ages, 75)
print(x)
4.1.2.运行结果
4.1.3.实例
90% 的人口年龄是多少岁?
import numpy
ages = [5,31,43,48,50,41,7,11,15,39,80,82,32,2,8,6,25,36,27,61,31]
x = numpy.percentile(ages, 90)
print(x)
4.1.4.运行结果
5.数据分布
5.1.数据分布(Data Distribution)
在本教程稍早之前,我们仅在例子中使用了非常少量的数据,目的是为了了解不同的概念。
在现实世界中,数据集要大得多,但是至少在项目的早期阶段,很难收集现实世界的数据。
5.2.我们如何获得大数据集?
为了创建用于测试的大数据集,我们使用 Python 模块 NumPy,该模块附带了许多创建任意大小的随机数据集的方法。
5.2.1实例
创建一个包含 250 个介于 0 到 5 之间的随机浮点数的数组:
import numpy
x = numpy.random.uniform(0.0, 5.0, 250)
print(x)
5.2.2.运行结果
5.3.直方图
为了可视化数据集,我们可以对收集的数据绘制直方图。
我们将使用 Python 模块 Matplotlib 绘制直方图:
5.3.1.实例
绘制直方图:
import numpy
import matplotlib.pyplot as plt
x = numpy.random.uniform(0.0, 5.0, 250)
plt.hist(x, 5)
plt.show()
5.3.2.运行结果
5.3.3.直方图解释
我们使用上例中的数组绘制 5 条柱状图。
第一栏代表数组中有多少 0 到 1 之间的值。
第二栏代表有多少 1 到 2 之间的数值。
等等。
我们得到的结果是:
52 values are between 0 and 1
48 values are between 1 and 2
49 values are between 2 and 3
51 values are between 3 and 4
50 values are between 4 and 5
注释:数组值是随机数,不会在您的计算机上显示完全相同的结果。
5.4.大数据分布
包含 250 个值的数组被认为不是很大,但是现在您知道了如何创建一个随机值的集,并且通过更改参数,可以创建所需大小的数据集。
5.4.1.实例
创建一个具有 100000 个随机数的数组,并使用具有 100 栏的直方图显示它们:
import numpy
import matplotlib.pyplot as plt
x = numpy.random.uniform(0.0, 5.0, 100000)
plt.hist(x, 100)
plt.show()
5.4.2.运行结果
6.正态数据分布
6.1.正态数据分布(Normal Data Distribution)
在上一章中,我们学习了如何创建给定大小且在两个给定值之间的完全随机数组。
在本章中,我们将学习如何创建一个将值集中在给定值周围的数组。
在概率论中,在数学家卡尔·弗里德里希·高斯(Carl Friedrich Gauss)提出了这种数据分布的公式之后,这种数据分布被称为正态数据分布或高斯数据分布。
6.1.1.实例
典型的正态数据分布:
import numpy
import matplotlib.pyplot as plt
x = numpy.random.normal(5.0, 1.0, 100000)
plt.hist(x, 100)
plt.show()
6.1.2.运行结果
注释:由于正态分布图具有钟形的特征形状,因此也称为钟形曲线。
6.1.3.直方图解释
我们使用 numpy.random.normal()
方法创建的数组(具有 100000 个值)绘制具有 100 栏的直方图。
我们指定平均值为 5.0,标准差为 1.0。
这意味着这些值应集中在 5.0 左右,并且很少与平均值偏离 1.0。
从直方图中可以看到,大多数值都在 4.0 到 6.0 之间,最高值大约是 5.0。
7.散点图
7.1.散点图(Scatter Plot)
散点图是数据集中的每个值都由点表示的图。
Matplotlib 模块有一种绘制散点图的方法,它需要两个长度相同的数组,一个数组用于 x 轴的值,另一个数组用于 y 轴的值:
x = [5,7,8,7,2,17,2,9,4,11,12,9,6]
y = [99,86,87,88,111,86,103,87,94,78,77,85,86]
x 数组代表每辆汽车的年龄。
y 数组表示每个汽车的速度。
7.1.1.实例
请使用 scatter()
方法绘制散点图:
import matplotlib.pyplot as plt
x = [5,7,8,7,2,17,2,9,4,11,12,9,6]
y = [99,86,87,88,111,86,103,87,94,78,77,85,86]
plt.scatter(x, y)
plt.show()
7.1.2.运行结果
7.1.3.散点图解释
x 轴表示车龄,y 轴表示速度。
从图中可以看到,两辆最快的汽车都使用了 2 年,最慢的汽车使用了 12 年。
注释:汽车似乎越新,驾驶速度就越快,但这可能是一个巧合,毕竟我们只注册了 13 辆汽车。
7.2.随机数据分布
在机器学习中,数据集可以包含成千上万甚至数百万个值。
测试算法时,您可能没有真实的数据,您可能必须使用随机生成的值。
正如我们在上一章中学到的那样,NumPy 模块可以帮助我们!
让我们创建两个数组,它们都填充有来自正态数据分布的 1000 个随机数。
第一个数组的平均值设置为 5.0,标准差为 1.0。
第二个数组的平均值设置为 10.0,标准差为 2.0:
7.2.1.实例
有 1000 个点的散点图:
import numpy
import matplotlib.pyplot as plt
x = numpy.random.normal(5.0, 1.0, 1000)
y = numpy.random.normal(10.0, 2.0, 1000)
plt.scatter(x, y)
plt.show()
7.2.2.运行结果
7.2.3.散点图解释
我们可以看到,点集中在 x 轴上的值 5 和 y 轴上的 10 周围。
我们还可以看到,在 y 轴上扩散得比在 x 轴上更大。
8. 线性回归
8.1.回归
当您尝试找到变量之间的关系时,会用到术语“回归”(regression)。在机器学习和统计建模中,这种关系用于预测未来事件的结果。