在Python中,数据挖掘编程是进行数据分析和数据挖掘的重要组成部分,若要掌握数据挖掘编程,需要对其基础知识有一定的了解及使用能力。本章致力于讲述数据挖掘编程中的基础知识点,首先介绍了Python使用入门须掌握的基本命令、判断与循环、函数、库的导入与添加,然后针对数据分析预处理和数据挖掘建模的常用库进行了相应介绍,从而让读者对Python数据挖掘编程基础有一定的了解。
学习目标
● 掌握Python基本命令的使用方法。
● 掌握Python判断与循环的使用方法。
● 掌握Python函数的自定义和使用方法。
● 掌握库的导入与添加的使用方法。
● 了解Python数据分析及预处理的常用库。
● 了解Python数据挖掘建模的常用框架和库。
初步接触Python的读者可以通过熟悉基本命令、判断与循环、函数和库的导入与添加来了解Python语言。下面分别对这些内容展开详细讲解。
Python包含许多命令,用于实现各种各样的功能。通过掌握其基本命令的使用,如基本运算、数据结构等,初学者可以更快速地打开Python语言的大门。
1.基本运算
在初次认识Python时,可以将其当作一个方便的计算器。读者可以打开Python,试着输入如代码清单2-1所示的命令。
代码清单2-1 Python基本运算
代码清单2-1所示的命令是Python的几种基本运算,第一种是赋值运算,第二种是乘法运算,最后一种是幂运算(即 a 3 )。这些命令几乎适用于所有编程语言。Python也支持多重赋值运算,方法如下。
这句多重赋值命令相当于完成了如下赋值命令。
Python支持对字符串的灵活操作,如代码清单2-2所示。
代码清单2-2 Python字符串操作
2.数据结构
Python有4个内置的数据结构——List(列表)、Tuple(元组)、Dictionary(字典)和Set(集合),可以统称为容器(container),而这4个内置的数据结构实际上是一些“东西”组合而成的结构,这些“东西”可以是数字、字符、列表,也可以是它们的组合。简而言之,容器里的数据结构可以是任意的,且容器内部的元素类型不需要相同。
(1)列表或元组
列表和元组都是序列结构,两者很相似,但又有一些不同的地方。
从外形上看,列表与元组的区别是,列表使用方括号进行标记,如m=[0, 2, 4],而元组使用圆括号进行标记,如n=(6, 8, 10),但访问列表和元组中元素的方式都是一样的,如m[0]等于0,n[2]等于10等。因为容器的数据结构可以是任意类型,所以如下关于列表p的定义也是成立的。
从功能上看,列表与元组的区别是,列表可以被修改,而元组不可以。例如,如果列表m=[0, 2, 4],那么语句m[0]=1会将列表m修改为[1, 2, 4],而对于元组n=(6, 8, 10),语句n[0]=1将会报错。需要注意的是,如果已经有一个列表m,需要将m复制为列表n,那么使用n=m是无效的,这时n仅仅是m的别名(或引用),修改n的同时也会修改m。正确的复制方法应该是n=m[:]。
与列表有关的函数是list,与元组有关的函数是tuple,但list函数和tuple函数的用法和功能几乎一样,都是将某个对象转换为列表或元组,例如,list('cd')的结果是['c', 'd'],tuple([0, 1, 2])的结果是(0, 1, 2)。一些常见的与列表或元组相关的函数如表2-1所示。
表2-1 与列表或元组相关的函数
此外,列表作为对象,自带了很多实用的方法(元组不允许修改,因此方法很少),如表2-2所示。
表2-2 与列表相关的方法
此外,列表还有“列表解析”这一功能。该功能能够简化列表内元素操作的代码。使用append()方法对列表元素进行操作,如代码清单2-3所示。
代码清单2-3 使用append()方法对列表元素进行操作
将代码清单2-3使用列表解析进行简化,如代码清单2-4所示。
代码清单2-4 使用列表解析进行简化
(2)字典
在数学上,字典实际上是一个映射。与此同时,字典也相当于一个列表,然而其下标不再是以0开头的数字,而是自己定义的键(Key)。
创建一个字典的基本方法如下。
其中,“January”“February”就是字典的键,在整个字典中必须是唯一的,而“1”“2”就是键对应的值。访问字典中元素的方法也很直观,如代码清单2-5所示。
代码清单2-5 访问字典中的元素
还有其他一些比较方便的方法可以创建一个字典,如通过dict函数创建,或通过dict.fromkeys创建,如代码清单2-6所示。
代码清单2-6 通过dict或dict.fromkeys创建字典
字典的函数和方法很多,大部分与列表是一样的,此处不再赘述。
(3)集合
Python内置了集合这一数据结构,它的概念与数学上集合的概念基本一致。集合的元素是不重复的,而且是无序的。集合不支持索引。一般通过花括号({})或set函数创建一个集合,如代码清单2-7所示。
代码清单2-7 创建集合
由于集合的特殊性(特别是无序性),所以集合会有一些特别的运算,如代码清单2-8所示。
代码清单2-8 特别的集合运算
判断和循环是所有编程语言的基本命令,Python的判断语句格式如下。
需要特别指出的是,Python一般不使用花括号({}),也没有end语句,可使用缩进对齐作为语句的层次标记。同一层次的缩进量要一一对应,否则会报错。以下是一个错误的缩进示例,如代码清单2-9所示。
代码清单2-9 错误的缩进示例
不管是哪种语言,正确的缩进都是一个优雅的编程习惯。
Python中有for循环和while循环两种,如代码清单2-10所示。
代码清单2-10 for循环和while循环
在代码清单2-10中,for循环含有in和range语法。in是一个非常方便而且非常直观的语法,用于判断一个元素是否在列表或元组中。range用于生成连续的序列,一般语法格式为range(a, b, c),表示以 a 为首项、 c 为公差且不超过 b -1的等差数列,如代码清单2-11所示。
代码清单2-11 使用range生成等差数列
输出结果如下。
函数是Python为了使代码效率最大化、减少冗余而提供的最基本的程序结构。函数实现了对整段程序逻辑的封装,是程序逻辑的结构化或过程化的一种编程方法。其中,可以通过自定义方式和函数式编程方式进行函数的设计与应用。
1.自定义函数
在Python中,使用def关键字自定义函数,如代码清单2-12所示。
代码清单2-12 自定义函数
自定义函数其实很普通,但与一般编程语言不同的是,Python的函数返回值可以是各种形式。例如,可以返回列表,也可以返回多个值,如代码清单2-13所示。
代码清单2-13 返回列表和返回多个值的自定义函数
使用def自定义peb函数时,需要使用规范的命名,添加计算内容,并明确返回值,代码相对复杂,因此,Python支持使用lambda定义“行内函数”,如代码清单2-14所示。
代码清单2-14 使用lambda定义函数
2.函数式编程
函数式编程(Functional Programming)或函数程序设计,又称泛函编程,是一种编程范型。函数式编程可以将计算机运算视为数学上的函数计算,并且可以避免程序状态以及易变对象对函数的影响。
在Python中,函数式编程主要由lambda、map、reduce、filter函数构成,其中lambda在代码清单2-14中已经介绍,这里不再赘述。
假设有一个列表 a =[5, 6, 7],需要将列表 a 中的每个元素都加3,并生成一个新列表,可以通过列表解析操作实现该要求,如代码清单2-15所示。
代码清单2-15 使用列表解析操作列表元素
使用map函数实现代码清单2-15中的示例,如代码清单2-16所示。
代码清单2-16 使用map函数操作列表元素
在代码清单2-16中,首先定义一个列表,然后用map函数将命令逐一应用到列表 a 中的每个元素,最后返回一个数组。map函数也支持多参数的设置,例如,map(lambda x, y: x * y, a, b)表示将 a 、 b 两个列表的元素对应相乘,并将结果返回新列表。
通过代码清单2-15和代码清单2-16可以看出,列表解析虽然代码简短,但是本质上还是for循环。在Python中,for循环的效率并不高,而map函数实现了相同的功能,并且效率更高。
reduce函数与map函数不同,map函数是逐一遍历,而reduce函数是对可迭代对象中的元素进行累积操作计算。在Python 3中,reduce函数已经被移出全局命名空间,被置于functools库中,使用时需要通过from functools import reduce导入reduce函数。使用reduce函数可以算出 n 的阶乘,如代码清单2-17所示。
代码清单2-17 使用reduce函数计算 n 的阶乘
在代码清单2-17中,range(1, n+1)相当于给出了一个列表,其中的元素是1~ n 这 n 个整数。lambda x, y: x * y构造了一个二元函数,返回两个参数的乘积。reduce函数首先将列表的头两个元素(即 n 、 n +1)作为函数的参数进行运算,得到 n ( n +1);然后将 n ( n +1)与 n +2作为函数的参数,得到 n ( n +1)( n +2);再将 n ( n +1)( n +2)与 n +3作为函数的参数……依此递推,直到列表遍历结束,返回最终结果。如果用循环命令,那么需要写成如代码清单2-18所示的形式。
代码清单2-18 使用循环命令计算 n 的阶乘
filter函数的功能类似于一个过滤器,可用于筛选出列表中符合条件的元素,如代码清单2-19所示。
代码清单2-19 使用filter函数筛选列表元素
要使用filter函数,首先需要一个返回值为bool型的函数,如代码清单2-19中的lambda x: x>2 and x<6定义了一个函数,判断 x 是否大于2且小于6,然后将这个函数作用到range(10)的每个元素中,若判断结果为True,则取出该元素,最后将满足条件的所有元素组成一个列表并返回。
也可以使用列表解析筛选列表元素,如代码清单2-20所示。
代码清单2-20 使用列表解析筛选列表元素
可见使用列表解析并不比filter语句复杂。需要注意的是,使用map函数、reduce函数或filter函数的最终目的都是兼顾简洁和效率,因为map函数、reduce函数或filter函数的循环速度比Python内置的for或while循环要快得多。
在Python的默认环境中,并不会将所有的功能都加载进来,因此需要手动加载更多的库(或模块、包等),甚至需要额外安装第三方的扩展库,以丰富Python的功能,实现所需的目的。
1.库的导入
Python本身内置了很多强大的库,如与数学相关的math库,可以提供更加丰富、复杂的数学运算,如代码清单2-21所示。
代码清单2-21 使用math库进行数学运算
导入库时,除了可以直接使用“import库名”命令导入外,也可以为库起一个别名,使用别名导入,如代码清单2-22所示。
代码清单2-22 使用别名导入库
此外,如果不需要导入库中的所有函数,那么可以特别指定导入函数的名字,如代码清单2-23所示。
代码清单2-23 通过名称导入指定函数
直接导入库中的所有函数,如代码清单2-24所示。
代码清单2-24 导入库中的所有函数
读者可以通过help('modules')命令获得已经安装的所有模块名。
2.添加第三方库
虽然Python自带了很多库,但是不一定可以满足所有的需求。就数据分析和数据挖掘而言,还需要添加一些第三方库以拓展Python的功能。
常见的安装第三方库的方法如表2-3所示。
表2-3 常见的安装第三方库的方法
其中,最常用的安装第三方库的方法主要是使用pip命令安装。其中,最简单的安装命令为“pip install库名”,但国内使用pip命令安装库时,可能会出现下载速度缓慢甚至网络连接断开的情况。配置国内源可以提高pip下载的速度,在pip install命令后面带上“-i源地址”参数即可。例如,使用清华源安装pandas库,首先打开Anaconda Prompt,输入如下命令,即可自动下载并安装pandas库。
Python本身的数据分析功能不强,需要安装一些第三方扩展库以增强其能力。数据分析及预处理常用库有NumPy、pandas、Matplotlib等,如表2-4所示。
表2-4 Python数据分析及预处理常用库
NumPy的前身Numeric最早是由吉姆·弗贾宁与其他协作者共同开发的。2005年,特拉维斯·奥利芬特在Numeric中结合了另一个同性质的程序库Numarray的特色,并加入了其他扩展,开发出了NumPy。
NumPy是用Python进行科学计算的基础软件包,也是一个Python库,提供多维数组对象和各种派生对象(如掩码数组和矩阵),以及用于数组快速操作的各种API,包括数学、逻辑、形状操作、排序、选择、输入/输出、离散傅立叶变换、基本线性代数、基本统计运算和随机模拟等,因而能够快速地处理数据量大且烦琐的数据运算。
NumPy还是很多更高级的扩展库的依赖库,后面介绍的pandas、Matplotlib、SciPy等库都依赖于NumPy。值得强调的是,NumPy中的内置函数处理数据的速度是C语言级别的,非常快,因此在编写程序的时候,应当尽量使用这些内置函数,从而避免效率瓶颈的现象。
pandas的名称源自面板数据(panel data)和Python数据分析(Data Analysis),最初是被作为金融数据分析工具而开发出来的,由AQR Capital Management于2008年4月开发,并于2009年底开源。
pandas是Python的核心数据分析支持库,提供了快速、灵活、明确的数据结构,旨在简单且直观地处理关系型、标记型数据。pandas与其他第三方科学计算支持库也能够完美地集成。pandas还包含了高级的数据结构和精巧的工具,使得在Python中处理数据非常快速和简单。pandas中常用的数据结构为Series(一维数据)与DataFrame(二维数据),这两种数据结构足以处理金融、统计、社会科学、工程等领域里的大多数典型用例。
pandas的功能非常强大,可提供高性能的矩阵运算,可用于数据挖掘和数据分析,同时提供数据清洗功能,支持类似SQL的数据增、删、查、改,并且带有丰富的数据处理函数,支持时间序列分析功能,支持灵活处理缺失数据等。
无论数据挖掘还是数学建模,都免不了会遇到数据可视化的问题。Matplotlib是约翰·亨特在2008年左右的博士后研究中发明出来的,最初只是为了可视化癞痢病人的一些健康指标,而后逐渐变成了Python上使用较为广泛的可视化工具包。
同时Matplotlib还是Python中的著名绘图库,主要用于二维绘图,也可以进行简单的三维绘图。Matplotlib还提供了一整套与Matlab相似但更为丰富的命令,可以非常快捷地使用Python可视化数据,而且允许输出达到出版质量的多种图像格式,还十分适合交互式制图,同时也可方便地作为绘图控件,嵌入GUI应用程序或CGI、Flask、Django中。
此外,Matplotlib绘图库还有很多特点,例如不仅支持交互式绘图,还支持非交互式绘图;支持曲线(折线)图、条形图、柱状图、饼图,绘制的图形可进行配置;支持Linux、Windows、macOS与Solaris的跨平台绘图。由于Matplotlib的绘图函数基本上与Matlab的绘图函数作用差不多,所以迁移学习的成本比较低。同时,Matplotlib还支持LaTeX的公式插入。
Python拥有丰富的第三方库,在许多方面都有着广泛的应用,且随着各种模块的逐步完善,它在科学领域的地位越来越重要,这其中就包括数据挖掘领域。Python数据挖掘建模中常用的框架包括TensorFlow、Keras、PyTorch、PaddlePaddle、Caffe等,常用的库包括scikit-learn、jieba、SciPy、OpenCV、Pillow、Gensim和SnowNLP等。
scikit-learn(简称sklearn)项目最早由数据科学家大卫·库尔纳佩在2007年发起,需要NumPy和SciPy等库的支持,经研发后,scikit-learn成为一个开源的机器学习库。
scikit-learn是Python下强大的机器学习工具包,提供了完善的机器学习工具箱,包括数据预处理、分类、回归、聚类、预测、模型分析等,同时还是一种简单高效的数据挖掘和数据分析工具,可在各种环境中重复使用。scikit-learn内部还实现了各种各样成熟的算法,容易安装和使用,样例也十分丰富。由于scikit-learn依赖于NumPy、SciPy和Matplotlib,所以只需要提前安装好这几个库,基本可以正常安装与使用。若使用scikit-learn创建机器学习模型,则须注意以下几点。
1)所有模型提供的接口都为model.fit(),用于训练模型。需要注意的是,用于分类与回归算法的训练模型的语句为fit(X, y),用于非分类与回归算法的训练模型的语句为fit(X)。
2)分类与回归模型提供如下接口。
● model.predict(X_new):预测新样本。
● model.predict_proba(X_new):预测概率,仅对某些模型有用(如逻辑回归)。
● model.score():得分越高,模型拟合效果越好。
3)非分类与回归模型提供如下接口。
● model.transform():在fit函数的基础上,进行标准化、降维、归一化等数据处理操作。
● model.fit_transform():fit函数和transform函数的组合,既包含训练,又包含数据处理操作。
scikit-learn本身还提供了一些实例数据用于练习,常见的有安德森鸢尾花卉数据集、手写图像数据集等。
虽然scikit-learn已经足够强大了,但它并不包含一种强大的模型——人工神经网络。人工神经网络是功能相当强大但原理又相当简单的模型,在语言处理、图像识别等领域都有重要的作用。近年来逐渐引人注意的深度学习算法,本质上也是一种神经网络,可见在Python中实现神经网络是非常必要的。常用的深度学习框架包括TensorFlow、Keras、PyTorch、PaddlePaddle和Caffe等。
1.TensorFlow
2015年11月10日,Google推出了全新的开源工具TensorFlow,它是基于Google 2011年开发的深度学习基础框架DistBelief构建而成的。TensorFlow主要用于深度神经网络,一经推出就获得了较大的成功,并迅速成为用户使用较多的深度学习框架。
Tensor意味着数据,Flow意味着流动、计算、映射,TensorFlow即数据的流动、计算、映射,同时也体现了数据是有向地流动、计算和映射的。
TensorFlow是一个“神经网络”库,具有高度的灵活性,可以将用户使用Python绘制的计算图放到计算核心之中;具有可移植性,可以在CPU、GPU上运行;可以自动计算梯度导数,使用户不必纠结于具体的求解细节,只须关注模型的定义与验证;通过在底层上对线程、队列、异步操作给予良好的支持,在多计算单元控制上将不同的计算任务分配到不同的单元之中,实现性能最优化;支持C++、Python、Java、Go、JavaScript等接口的衔接。
2.Keras
Keras是由Python编写而成并使用TensorFlow、Theano以及CNTK作为后端的一个深度学习框架,也是深度学习框架中较容易使用的框架之一。同时,利用Keras不仅可以搭建普通的神经网络,还可以搭建各种深度学习模型,如自编码器、循环神经网络、递归神经网络、卷积神经网络等。
Theano是Python的一个库,是由深度学习专家约书亚·本吉奥带领的实验室开发出来的,用于定义、优化和高效地解决多维数组数据对应数学表达式的模拟估计问题。Theano具有高效地实现符号分解、高度优化的速度和稳定性等特点,最重要的是Theano实现了GPU加速,使得密集型数据的处理速度是CPU的数十倍。
用Theano即可搭建起高效的神经网络模型,然而对于普通读者而言,它的使用门槛还是相当高的。Keras正是为此而生,它大大简化了搭建各种神经网络模型的步骤,允许普通用户轻松地搭建并求解具有几百个输入节点的深层神经网络,而且定制的自由度非常大。
因此,对于Keras深度学习库而言,Keras具有高度模块化、用户友好性和易扩展特性,支持卷积神经网络、循环神经网络以及两者的组合,可无缝衔接CPU和GPU的切换。使用Keras搭建神经网络模型的过程相当简洁,也相当直观,就像搭积木一般。通过Keras,只需要短短几十行代码,即可搭建起一个非常强大的神经网络模型,甚至深度学习模型。值得注意的是,Keras的预测函数与scikit-learn的有所差别,Keras用model.predict()方法给出概率,用model.predict_classes()给出分类结果。
3.PyTorch
2017年1月,Facebook人工智能研究院(现为Meta人工智能研究院)在GitHub上开源了PyTorch。PyTorch是一个基于Torch的Python开源机器学习库,也是一个深度学习框架,可用于自然语言处理等应用程序。PyTorch不仅能够实现强大的GPU加速,还支持动态神经网络,这一点是现在很多主流框架(如TensorFlow)都不支持的。
PyTorch可以帮助构建深度学习项目,强调灵活性,允许用Python表达深度学习模型。PyTorch提供命令式体验,直接使用nn.module封装便可使网络搭建更快速和方便。另外,调试PyTorch就像调试Python代码一样简单。
由于PyTorch的易使用性,它在社区中得到较早的应用,并且在发布几年后即成长为优秀的深度学习工具之一。PyTorch清晰的语法、简化的API和易于调试的功能,使其成为深度学习的最佳选择之一。除此之外,PyTorch中还存在较为完备的与应用领域对应的PyTorch库,如表2-5所示。
表2-5 与应用领域对应的PyTorch库
4.PaddlePaddle
飞桨(PaddlePaddle)是一个易用、高效、灵活、可扩展的深度学习框架,于2016年正式向专业社区开源。PaddlePaddle是一个工业技术平台,拥有先进的技术和丰富的功能,涵盖了核心深度学习框架、基本模型库、端到端的端开发套件、工具、组件和服务平台。
除此之外,PaddlePaddle还支持超大规模深度学习模型的训练、多端多平台部署的高性能推理引擎等;支持命令式编程模式(动态图)功能、性能和体验;原生推理库性能显著优化,轻量级推理引擎实现了对硬件支持的极大覆盖;新增了CUDA下多线程多流支持、TRI子图对动态shape输入的支持,强化量化推理,性能显著优化;全面提升了对支持芯片的覆盖度(包括寒武纪、比特大陆等)以及对应的模型数量和性能。
PaddlePaddle源自工业实践,已被制造业、农业、企业服务等领域广泛采用。
5.Caffe
Caffe是一个深度学习框架,是由伯克利人工智能研究所和社区贡献者共同开发的。
Caffe对整个深度学习领域起到了极大的推动和影响作用,因为在深度学习领域,Caffe框架是人们无法绕过的一座山。这不仅是由于Caffe无论在结构、性能以及代码质量上都称得上是一款十分出色的开源框架,更重要的是,Caffe将深度学习的每一个细节都原原本本地展现出来,大大降低了人们学习和开发的难度。
Caffe主要应用在视频、图像处理等方面,核心语言是C++,支持命令行、Python和MATLAB接口,支持在CPU、GPU运行,且通用性好,非常稳健、快速,性能优异。
Caffe具有上手快的特点,它的模型与相应优化都是以文本形式而非代码形式给出的。Caffe运行速度快,能够运行较复杂的模型与海量的数据,且使用者可以使用Caffe提供的各层类型来定义自己的模型。
除了前面所介绍的常用于数据挖掘建模的库之外,还有许多库也运用于数据挖掘建模,如jieba、SciPy、OpenCV、Pillow等。
1.jieba
jieba是一个被广泛使用的Python第三方中文分词库。jieba使用简单,并且支持Python、R、C++等多种编程语言的实现,对新手而言是一个较好的入门分词工具。在GitHub社区,jieba长期有着较高的讨论度,社区中也有不少与jieba相关的实例。
相比其他分词工具,jieba不仅提供了分词功能,还提供了分词以外的其他功能,如词性标注、添加自定义词典、关键词提取等。
jieba库可提供精确模式、全模式和搜索引擎模式3种分词模式。
● 精确模式采用最精确的方式将语句切分,适用于文本分析。
● 全模式可以快速地扫描语句中所有可以成词的部分,但无法解决歧义问题。
● 搜索引擎模式在精确模式的基础上再切分长词,适用于搜索引擎的分词。
jieba词性标注是基于规则与统计相结合的词性标注方法。jieba词性标注与其分词的过程类似,即利用词典匹配与隐马尔可夫模型(Hidden Markov Model, HMM)共同合作实现。而且,通过jieba库进行词性标注,具有效率高、处理能力强等特点。
2.SciPy
SciPy是数学、科学和工程的开源软件。SciPy库依赖于NumPy,可提供方便快捷的 n 维数组操作。SciPy库是用NumPy数组构建的,可提供许多用户友好和高效的数值例程,如用于数值积分和优化的例程。SciPy可以运行在所有流行的操作系统上,安装便捷且免费。同时,SciPy易于使用,且功能强大到足以被一些世界领先的科学家和工程师所依赖。
SciPy库包含最优化、线性代数、积分、插值、拟合、特殊函数、快速傅里叶变换、信号处理、图像处理、常微分方程求解和其他科学与工程中常用的计算等功能。显然,这些功能都是挖掘与建模必备的。
NumPy提供了多维数组功能,但只是一般的数组,并不是矩阵。SciPy提供了真正的矩阵,以及大量基于矩阵运算的对象与函数。
3.OpenCV
OpenCV是一个开源计算机视觉库,由英特尔公司资助。OpenCV由一系列C函数和少量C++类所组成,可实现很多图像处理和计算机视觉方面的通用算法。同时,OpenCV包含的函数有500多个,包括读取与写入图像、矩阵操作和数学库等函数,可以满足图像处理的许多应用领域,如工厂产品检测、医学成像、信息安全、摄像机标定、立体视觉和机器人视觉等。
OpenCV作为一个基于C/C++语言编写的跨平台开源软件,可以在Windows、Linux、Android和macOS上运行,同时提供了Python、Ruby、MATLAB等语言的接口。
OpenCV是模块结构,主要包含以下4个模块。
1)核心功能模块(core),包含OpenCV基本数据结构、动态数据结构、绘图函数、数组操作相关函数、与OpenGL的互操作等内容。
2)图像处理模块(imgproc),包含线性和非线性的图像滤波、图像的几何变换、图像转换、直方图相关、结构分析和形状描述、运动分析和对象跟踪、特征检测、目标检测等内容。
3)2维功能模块(features2D),包含特征检测和描述、特征检测器、描述符提取器、描述符匹配器、关键点绘制函数和匹配功能绘制函数等内容。
4)高层GUI图形用户界面模块(highgui),包含媒体的输入/输出、视频捕捉、图像和视频的编码解码、图形交互界面的接口等内容。
4.Pillow
PIL(Python Imaging Library)作为Python 2的第三方图像处理库,是Pillow的前身。随着Python 3的更新,PIL移植到Python 3中并更名为Pillow,且加入了许多新特性。
与OpenCV相同,Pillow也是模块结构,主要包括以下4个模块。
1)图像功能模块(Image),包含读写图像、图像混合、图像放缩、图像裁切、图像旋转等内容。
2)图像滤波功能模块(ImageFilter),包含各类图像滤波核。
3)图像增强功能模块(ImageEnhance),包含色彩增强、亮度增强、对比度增强、清晰度增强等内容。
4)图像绘画功能模块(ImageDraw),包含绘制几何形状、绘制文字等内容。
同时,利用Pillow中的函数可以从大多数图像格式的文件中读取数据,然后对读取的图像进行处理,最后写入常见的图像格式文件中。Pillow官网中有一些应用例子可供读者查阅参考。
本章的主要目的是了解Python数据挖掘编程的基础知识,为后续的项目开发奠基。首先,结合Python数据挖掘编程基础,重点介绍了Python的使用入门知识、Python数据分析及预处理常用库,以及Python数据挖掘建模常用库。然后结合实际操作,对Python基本语句的使用进行介绍;结合实际意义与作用,对常用库进行了简单介绍。