第一部分:分类
第一章 机器学习基础
Python 语言的优势
-
基于以下三个原因,我们选择 Python 作为实现机器学习算法的编程语言:
- Python 的语法清晰;
- 易于操作纯文本文件;
- 使用广泛,存在大量的开发文档。
-
可执行伪代码
- Python 具有清晰的语法结构,它也被称作可执行伪代码(executable pseudo-code);
- 默认安装的 Python 开发环境已经附带了很多高级数据类型,如列表、元组、字典、集合、队列等,无需进一步编程就可以使用这些数据类型的操作;
- 使用这些数据类型使得实现抽象的数学概念非常简单;
- Python 语言处理和操作文本文件非常简单,非常易于处理非数值型数据;
- Python 语言提供了丰富的正则表达式函数以及很多访问 Web 页面的函数库,使得从HTML 中提取数据变得非常简单直观。
-
Python 比较流行
- Python 语言使用广泛,代码范例也很多,便于快速学习和掌握;
- 此外,在开发实际应用程序时,也可以利用丰富的模块库缩短开发周期;
- 在科学和金融领域,Python 语言得到了广泛应用;
- SciPy 和 NumPy 等许多科学函数库都实现了向量和矩阵操作,这些函数库增加了代码的可读性,另外,科学函数库 SciPy 和 NumPy 使用底层语言编写,提高了相关应用程序的计算性能;
- Python 的科学工具可以与绘图工具 Matplotlib 协同工作,Matplotlib 可以绘制 2D、3D图形,也可以处理科学研究中经常使用到的图形;
- Python 开发环境还提供了交互式 shell 环境,允许用户开发程序时查看和检测程序内容;
-
Python 语言的特色
- Python 语言则与 Java 和 C 完全不同,它清晰简练,而且易于理解,即使不是编程人员也能够理解程序的含义,而 Java 和 C 对于非编程人员则像天书一样难于理解;
- Python 语言是高级编程语言,我们可以花费更多的时间处理数据的内在含义,而无须花费太多精力解决计算机如何得到数据结果,Python 语言使得我们很容易表达自己的目的。
-
Python 语言的缺点
- Python 语言唯一的不足是性能问题;
- Python 程序运行的效率不如 Java 或者 C 代码高,但是我们可以使用 Python 调用 C 编译的代码;
- 这样,我们就可以同时利用 C 和 Python 的优点,逐步地开发机器学习应用程序;
- 我们可以首先使用 Python 编写实验程序,如果进一步想要在产品中实现机器学习,转换成 C 代码也不困难;
- 如果程序是按照模块化原则组织的,我们可以先构造可运行的 Python 程序,然后再逐步使用 C 代码替换核心代码以改进程序的性能;
- C++ Boost 库就适合完成这个任务,其他类似于 Cython 和 PyPy 的工具也可以编写强类型的 Python 代码,改进一般 Python 程序的性能。
- 如果程序的算法或者思想有缺陷,则无论程序的性能如何,都无法得到正确的结果;
- 如果解决问题的思想存在问题,那么单纯通过提高程序的运行效率,扩展用户规模都无法解决这个核心问题,从这个角度来看, Python 快速实现系统的优势就更加明显了,我们可以快速地检验算法或者思想是否正确,如果需要,再进一步优化代码。
- Python 语言唯一的不足是性能问题;
NumPy 函数库基础
-
NumPy函数库将数据表示为矩阵形式,只需要执行简单的矩阵运算而不需要复杂的循环操作。
-
NumPy 矩阵与数组的区别
-
NumPy 函数库中存在两种不同的数据类型(矩阵 matrix 和数组 array),都可以用于处理行列表示的数字元素;
-
虽然它们看起来很相似,但是在这两个数据类型上执行相同的数学运算可能得到不同的结果,其中 NumPy 函数库中的 matrix 与 MATLAB 中 matrices 等价。
import numpy as np from numpy import * # 构造一个4×4的随机数组,因为产生的是随机数组,不同计算机的输出结果可能与上述结果完全不同。 rint(random.rand(4, 4)) # 调用 mat() 函数可以将数组转化为矩阵,输入下述命令: randomMat = mat(random.rand(4, 4)) # 由于使用随机函数产生矩阵,不同计算机上输出的值可能略有不同: print(randomMat.I) # .I操作符实现了矩阵求逆的运算。 """ [[ 4.71629641 -1.94916498 1.36821745 -4.01802929] [ -3.16839776 1.71731342 0.36038256 1.9790573 ] [ 13.17442453 -2.56783332 -1.87777552 -8.30747618] [ -8.63665271 1.10967629 1.05564456 6.65494258]] """ # 执行下面的命令存储逆矩阵: invRandMat = randomMat.I # 接着执行矩阵乘法,得到矩阵与其逆矩阵相乘的结果: print(invRandMat * randomMat) """ [[ 1.00000000e+00 0.00000000e+00 -4.44089210e-16 -4.44089210e-16] [ 5.55111512e-17 1.00000000e+00 2.22044605e-16 2.22044605e-16] [ -2.22044605e-16 -1.77635684e-15 1.00000000e+00 -8.88178420e-16] [ 2.22044605e-16 8.88178420e-16 0.00000000e+00 1.00000000e+00]] """ """ 结果应该是单位矩阵,除了对角线元素是1,4×4矩阵的其他元素应该全是0。 实际输出结果略有不同,矩阵里还留下了许多非常小的元素,这是计算机处理误差产生的结果。 """ # 输入下述命令,得到误差值: myEye = randomMat * invRandMat print(myEye - eye(4)) # 函数 eye(4) 创建4×4的单位矩阵。 """ [[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 8.88178420e-16] [ 0.00000000e+00 2.22044605e-16 0.00000000e+00 0.00000000e+00] [ 0.00000000e+00 -2.22044605e-16 2.22044605e-16 0.00000000e+00] [ -1.77635684e-15 0.00000000e+00 0.00000000e+00 0.00000000e+00]] """
-
本章小结
-
学习机器学习算法,必须了解数据实例,每个数据实例由多个特征值组成。
-
分类是基本的机器学习任务,它分析未分类数据,以确定如何将其放入已知群组中。为了构建和训练分类器,必须首先输入大量已知分类的数据,我们将这些数据称为训练样本集。