




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
机器学习及应用
全套课件目录第01章导论第02章Python初步第03章决策树第04章神经网络第05章支持向量机第06章贝叶斯分类器第07章集成学习第08章聚类第09章降维第10章概率图模型第11章深度学习初步第01章导论机器学习的概念机器学习基本术语概念学习与假设空间模型评估与选择1.1引言机器学习(MachineLearning)是计算机程序随着经验积累自动提高性能或系统自我改进的过程,即通过经验提高性能的某类程序;以一个更形式化的定义来说,对于某类任务T和性能度量P,如果一个计算机程序在T上以P衡量的性能,随着经验E而自我完善,就称这个计算机程序从经验
E中学习。机器学习通常需要一定的算法,依据特定的指令序列,将输入变换得到输出,然而,对于现实中的很多任务,我们并没有确定的算法,我们希望计算机自动地为学习任务提取相应的算法;例如为每天收取的邮件进行分类,区分是垃圾邮件还是正常邮件。尽管我们知道输入/输出分别应该是邮件文档以及是否为垃圾邮件,然而并不知道应该按照怎样确定的规则将这种输入变换成输出。1.1引言在计算机系统中,经验通常以数据的形式存在。为了能够自动地从经验中提取出学习算法,需要获得过去大量的邮件实例作为数据。从实例数据中学习出垃圾邮件的模型,以此作为判断的依据。机器学习所研究的主要内容,是如何在计算机上从数据中产生模型的算法,即学习算法。有了学习算法,我们将经验以数据的形式提供给计算机,计算机就能基于这些数据产生相应的模型。继而在面对新的情况时,学习到的模型能够提供相应的判断,比如计算机能够正确分类一封新邮件是否是垃圾邮件。机器学习是研究学习算法的学问,机器学习的过程是从大量数据中自动地寻找有用模型的过程。1.2基本术语
1.2基本术语
1.2基本术语
1.2基本术语机器学习算法可以表示为一个函数y=f(x),假设以手写体图像x作为输入,向量y作为输出,其中向量y的形式与目标向量的形式相同。在训练数据的基础上,函数f(x)的精确形式在训练阶段或学习阶段被确定。一旦模型被训练出来,它就能确定新的手写体数字集合中的图像标签。这些新的手写体数字图像组成的集合称为测试集(TestSet)。使用学习得到的模型进行预测的过程称为测试(Testing),被预测的样本称为测试样本(TestingSample)。学习得到的模型适用于新样本的能力称为泛化(Generalization)能力。如果希望预测的结果是离散值,此类学习任务称为分类(Classification);如果希望预测的结果是连续值,此类学习任务称为回归(Regression)。1.3概念学习与假设空间
1.4归纳偏好机器学习算法在学习过程中对某种类型假设的偏好,称为归纳偏好(InductiveBias)。归纳学习的一个基本属性:学习器如果不对目标概念的形式做预先的假定,它从根本上就无法对未见实例进行分类。归纳偏好可看作学习算法自身在一个可能很庞大的假设空间中对假设进行选择的启发式或价值观。一种算法如果有偏性越强,那它的归纳能力越强,可以分类更多的未见实例。引导学习算法确立“正确”偏好的一个一般性原则是“奥卡姆剃刀”(Occam’srazor)原则,即优先选择拟合数据的最简单的假设。学习算法自身的归纳偏好与问题是否相配,往往会起到决定性的作用。1.5经验误差与过拟合把分类错误的样本数占样本总数的比例称为“错误率”,即如果在m
个样本中有a个样本分类错误,则错误率E=a/m;1-E称为“精度”,精度=1-错误率。把学习器的实际预测输出与样本的真实输出之间的差异称为“误差”,学习器在训练集上的误差称为“训练误差”或“经验误差”,在新样本上的误差称为“测试误差”或“泛化误差”。过拟合:对于一个假设,当存在其他的假设对训练样例的拟合比它差,但事实上在包含训练集合以外的实例的整个分布上表现得却更好时,说这个假设过度拟合训练样例。欠拟合,是指学习器对训练样本的一般性质尚未学好。发生过拟合可能原因:训练样例含有随机错误或噪声、学习器的学习能力过于强大、训练样例太少。过拟合是无法彻底避免的。1.6模型评估与选择通过将已有的训练集划分为一部分来做训练,即拟合一个假设,而剩下的部分称作“验证集”,用来检验假设的泛化能力;交叉验证法称为“k折交叉验证”或“k倍交叉验证”,
每次用k-1个子集的并集作为训练集,余下的那个子集作为验证集。这样就可以获得
k个组训练/验证集,从而可进行k次训练和验证,最终返回的是这k个验证结果的均值。验证集是在模型评估与选择中用于评估测试的数据集,而学得模型在实际使用中遇到的称为测试集。研究对比不同算法的泛化性能时,用测试集验证集上的性能来进行模型选择;“模型选择”(ModelSelection):使用评估方法来对学习器的泛化误差进行评估。1.6模型评估与选择
1.7性能度量
1.7性能度量对于数据分布D和概率密度函数,错误率可描述精确度可描述为在回归任务中,最常用的性能度量是“均方误差”,定义为对于数据分布和概率密度,均方误差可描述为1.7性能度量误率和精度虽然常用,但是并不能满足所有任务需求。例如在信息检索中,经常会关心“检索出的信息中有多少比例是用户感兴趣的”、“用户感兴趣的信息中有多少被检索出来了”。更为适用于此类需求的性能度量是查准率(Precision)与查全率(Recall)。对于二分类问题,可将样例根据其真实类别与学习器预测类别的组合划分为真正例(TruePositive,TP)、假正例(FalsePositive,FP)、真负例(TrueNegative,TN)、假负例(FalseNegative,FN)四种情形。对于一个正实例,如果预测也是正的,则它是一个真正例;如果对正实例的预测是负的,则它是一个假负例。对于一个负实例,如果预测也是负的,则它是一个真负例;如果将负实例预测为正的,则它是一个假正例。在二分类问题中有两种类型的错误,即假正例和假负例。例如,对于身份认证应用,用户通过声音登录他的账户。假正例是错误地允许冒名顶替者(模仿真实用户的声音)登录,而假负例是拒绝合法用户。1.7性能度量对于二分类问题令
、
、
、
分别表示真正例、假正例、真负例、假负例对应的样例数,则显然有
。查准率与查全率
分别定义为:一般来说,查准率高时,查全率往往偏低;而查全率高时,查准率往往偏低。推荐系统中查准率更重要;逃犯信息检索系统查全率更重要。真实情况预测结果正例负例正例(真正例)(假负例)负例(假正例)(真负例)混淆矩阵1.7性能度量
1.8发展历程1.8发展历程人工智能领域发展到一定的阶段,机器学习应运而生。推理期:20世纪50年代到70年代初,逻辑推理能力,“逻辑理论家”程序、“通用问题求解”程序;知识期:20世纪70年代中期开始,专家系统,“知识工程”之父费根鲍姆;随着“知识工程瓶颈”的到来随之产生,让机器自己学习知识;1950年图灵提出了机器学习的可能性。20世纪50年代感知机自适应线性神经元。20世纪60年代至70年代,统计学习技术、强化学习技术,符号学习技术代表性工作主要有跳棋程序、学习机器、结构学习系统、基于逻辑的归纳学习系统、概念学习系统。1.8发展历程机器学习的发展离不开人工智能(ArtificialIntelligence,AI)研究的推动。随着人工智能领域发展到一定的阶段,机器学习应运而生。20世纪80年代,机器学习成为一个独立的学科领域,作为解决“知识工程瓶颈”问题的关键;20世纪90年代中期之前,逻辑知识表示与归纳逻辑程序设计,与此同时,连接主义学习由于BP算法的成功而兴起;20世纪90年代中期,统计学习开始占据了机器学习的主流,支持向量机算法;21世纪初,连接主义学习以“深度学习”算法的形式卷土重来,严格的理论基础的缺乏,很难有效地表示出复杂数据之间的关系,深度学习为机器学习走向工程实践带来了极大的便利,在一定程度上缓解了复杂模型下“过拟合”的问题。1.9应用现状机器学习在模式识别方面应用,是光学字符识别(OCR),即从字符图像识别字符编码。这是多类问题的一个例子。对于人脸识别,输入是人脸图像,而类是需要识别的人,并且学习程序应当学习人脸图像与身份之间的关联性。医学诊断中,输入是关于患者的信息,而类是疾病。生物测定学使用人的生理和行为特征来识别或认证人的身份,它需要集成来自不同形态的输入。机器学习方法在大型数据库中的应用称为数据挖掘。零售业、金融业、制造业、医学领域、电信领域、科学研究领域;机器学习中的大多数方法来自统计学。关注的是统计模型的发展与优化,偏数学;机器学习者更关注的是能够解决问题,偏实践,重点研究学习算法在计算机上执行的效率与准确性的提升;1.9应用现状计算机视觉涉及图像处理与机器学习。图像处理技术用于将图像处理为适合进入机器学习模型中的输入,机器学习则负责从图像中识别出相关的模式。应用如百度识图、手写字符识别、车牌识别等;语音识别就是音频处理技术与机器学习的结合。相关应用有苹果的语音助手Siri等;自然语言处理让机器理解人类的语言的一门领域。大量使用了编译原理相关的技术,语义理解,机器学习等技术;2010年以后,机器学习大量的应用都与大数据高度耦合。
1.9应用现状第02章Python初步NumPy库Matplotlib库SciPy库Scikit-learn库2.1Python概述Python是一种解释型、面向对象、动态数据类型的高级程序设计语言。由于Python语言的简洁、易读以及可扩展性,在国外用Python做科学计算的研究机构日益增多,一些知名大学已经采用Python教授程序设计课程。众多开源的科学计算软件包都提供了Python的调用接口,例如著名的计算机视觉库OpenCV、三维可视化库VTK、医学图像处理库ITK。而Python专用的科学计算扩展库就更多了,例如如下4个十分经典的科学计算扩展库:NumPy、SciPy、matplotlib和Scikit-learn,它们分别为Python提供了快速数组处理、数值运算以及绘图功能。因此Python语言及其众多的扩展库所构成的开发环境十分适合工程技术、科研人员处理实验数据、制作图表,甚至开发科学计算应用程序。2.2NumPy库介绍多维度数组ndarray,它是由同样数据类型的元素组成的表,通常是数值元素。NumPy数组的下标从0开始。线性降维假设构成数据集的各变量间独立无关。每一个线性的数组称为轴(axes),秩是描述轴的数量。2.2.1ndarray对象import
numpy
as
npNumpy是Python的一个科学计算的库,提供了矩阵运算的功能。一般与Scipy、matplotlib一起使用。2.2Numpy库介绍创建数组print(np.array([1,2,3,4]))
print(np.array([[1,2],[3,4]]))[1234][[12][34]]numpy.arange方法:通过指定开始值、终值和步长等参数创建等差数列,结果不包含终值。示例:运行结果:print(np.arange(15))
print(np.arange(10,20,2))
print(np.arange(15).reshape(3,5))[01234567891011121314][1012141618][[01234][56789][1011121314]]numpy.array方法:以list或tuple变量为参数产生数组,示例:运行结果:2.2Numpy库介绍创建数组print(np.linspace(1,3,9))numpy.linspace方法:通过指定开始值、终值和元素个数等参数创建等差数列,结果包含终值。示例:[1.1.251.51.752.2.252.52.753.]运行结果:使用numpy.zeros、numpy.ones、numpy.eye等方法构造特定矩阵,示例:[[0.0.0.0.][0.0.0.0.][0.0.0.0.]][[1.1.1.1.][1.1.1.1.][1.1.1.1.]][[1.0.0.][0.1.0.][0.0.1.]]运行结果:print(np.zeros((3,4)))
print(np.ones((3,4)))
print(np.eye(3))2.2Numpy库介绍常见属性示例:a=np.zeros((2,2,2))
print(a.ndim)print(a.shape)
print(a.size)
print(a.dtype)3(2,2,2)8float64属性名功能属性名功能ndim数组的维数size数组的元素数shape数组每一维的大小dtype数组元素的数据类型运行结果:2.2Numpy库介绍除了类似以上的一元ufunc函数外,Numpy中还包括了下面的二元ufunc:add:元素对应相加。subtract:第一个数组元素减去第二个的元素。multiply:数组元素相乘。divide、floor_divide:除法,或向下整除(丢弃余数)。power:第一个数组中的元素A,第二个数组中的元素B,返回A的B次方。maximum、fmax:返回两个数组中较大值组成的数组。mod:求模,即求余数。2.2.2ufunc函数函数名功能属性名功能exp计算各元素的指数square计算各元素的平方根sqrt计算各元素的平方sin计算各元素的正弦函数2.2Numpy库介绍基本数组统计函数2.2.3常用函数库函数名功能属性名功能sum求和product计算数组所有元素的乘积mean算术平均数min计算各元素最小值std标准差max计算各元素最大值var方差argmin最小值元素的索引利用numpy.random模块产生随机数rand(3,2):产生0~1之间的均匀分布的样本,数组形状是(3,2)。randn(3,2):产生正态分布的随机数,数组形状是(3,2)。normal(100,10,(3,2)):产生正态分布的随机数,期望是100,标准差是10,数组形状是(3,2)。2.2Numpy库介绍uniform(10,30,(3,2)):产生均匀分布的随机值,起始值是10,终值是30,数组形状是(3,2)。poisson():产生λ系数为2.0的泊松分布随机数。permutation(5):返回一个[0,5)的5个整数的随机排列。permutation(a):返回数组a的随机排列。randint(20,50,5):从[20,50]范围内随机产生5个整数。
操作多维数组沿轴0对数组进行堆叠,等价于np.concatenate(tup,axis=0):vstack(),示例如下:a=np.array([1,2,3])
b=np.array([2,3,4])
c=np.vstack((a,b))
print("1stexampleofvstack:\n",c)1stexampleofvstack:[[123][234]]运行结果:2.2Numpy库介绍沿轴1对数组进行堆叠,等价于np.concatenate(tup,axis=1):hstack(),示例如下:d=np.array([[1],[2],[3]])
e=np.array([[2],[3],[4]])
f=np.vstack((a,b))
print("2ndexampleofvstack:\n",f)2ndexampleofvstack:[[123][234]]g=np.hstack((a,b))
print("1stexampleofhstack:\n",g)
h=np.hstack((d,e))
print("2ndexampleofhstack:\n",h))1stexampleofhstack:[123234]2ndexampleofhstack:[[12][23][34]]运行结果:运行结果:2.2Numpy库介绍沿水平轴,在指定位置拆分数组:hsplit(),示例如下:i=np.random.randint(0,25,(2,12))
j=np.hsplit(i,3)
print(i)
print(j)[[324814601261152218][173112407232222123]][array([[3,24,8,14],[17,3,11,24]]),array([[6,0,12,6],[0,7,23,2]]),array([[1,15,22,18],[22,2,1,23]])]
常用的numpy.linalg函数linalg模块提供了许多方阵(包括矩阵)的基本运算函数。使用这个模块可以解线性方程组、计算逆矩阵、求特征值、以及求解行列式等。假设要求解以下方程组,先将系数写成
、
矩阵,再利用linalg.solve方法解方程。2.2Numpy库介绍[0.3750.1250.-0.25-0.25]原矩阵:[1,0,1,0,1]验证结果:[[1.0.1.0.1.]]运行结果如下2.2Numpy库介绍函数名功能函数名功能det()计算矩阵行列式matrix_rank()计算矩阵的秩inv()矩阵求逆sqrt计算各元素的平方根示例代码:2.2Numpy库介绍[[1.0.0.][0.1.0.][0.0.0.]]矩阵的秩为:2伴随矩阵为:[[0.16.-48.0.0.][-32.16.16.0.0.][32.-32.32.0.-64.][0.0.0.-64.32.][0.-64.64.64.-32.]]运行结果如下:矩阵的行列式是:-128.0逆矩阵是:[[0.-0.1250.3750.0.][0.25-0.125-0.125-0.-0.][-0.250.25-0.250.0.5][0.0.0.0.5-0.25][-0.0.5-0.5-0.50.25]]矩阵的秩为:
32.2Numpy库介绍首先假设矩阵的大小为,即行列。1-范数是指矩阵列向量中绝对值之和的最大值。2-范数的计算方法为矩阵的最大特征值的开平方型为:norm(x,ord=None,axis=None,keepdims=False)其中ord参数默认为2,表示2-范数;当ord值为1时,表示1-范数;当ord值为np.inf时是指无穷范数。示例及运行结果如下:B=np.array([3,4,5,6])print("1-范数为:",np.linalg.norm(B))print("2-范数为:",np.linalg.norm(B))print("2-范数为:",np.linalg.norm(B,ord=2))print("无穷范数为:",np.linalg.norm(B,ord=np.inf))1-范数为:9.27361849552-范数为:9.27361849552-范数为:9.2736184955无穷范数为:
6.0
求矩阵范数范数是指矩阵行向量中绝对值之和的最大值。对应linalg模块中函数原型为:2.3Matplotlib库介绍载入绘图模块pyplot,假定命名为plt。调用plt.figure()方法创建绘图对象Figure。利用figsize参数指定绘图对象的宽度和高度分别为8英寸和6英寸。调用plt.plot()方法在子图对象(Axes)上绘制点线图。color:“g”、“k”、“green”、“blue”等直接指定颜色。或者与样本点数量一致的一个NumPy数组,每个元素的值是0~1之间的一个浮点值,对应的是每个点对应所选定调色板中的颜色值。这个在以不同颜色区分每种样本的时候很有用。linewidth:设置线宽,单位是象素。marker:指定点的样式,如“o”每个点就是一个圆形。2.3.1快速绘制2D图表
绘制二维图形一般流程2.3Matplotlib库介绍设置axes子图对象中其它对象的属性。常见属性包括:xlabel、ylabel:分别设置x、y轴的标题文字。title:设置子图的标题xlim、ylim:设置x轴和y轴的上下限xticks、yticks:设置x轴刻度、y轴刻度各对象属性之间的从属关系如图:2.3Matplotlib库介绍使用plt.show()方法显示绘图窗口。使用plt.savefig()方法将当前的figure对象保存成分辨率72dpi的图像文件,如果不设置的话,将使用Matplotlib配置文件中的配置。
举例快速绘制2D图表举例2.3Matplotlib库介绍创建figure对象,记作fig。
使用figure对象创建子图(subplot)或轴(axes)实例。figure对象作为最上层的Artist对象,可以调用add_subplot()方法和plt.subplot()方法创建新的子图,也就是将figure设置的绘图对象分成几个部分。
例如参数’221’,输出区域参数’22’表示两行两列的4块区域,顺序参数’1’表示选择图形输出的区域在第一块。2.3.2Artist对象创建Artist对象的标准创建流程 Artist作为MatplotlibAPI中的三个图层之一,是经常处理的绘图对象。它分为两种类型,一种是基础类型对象,例如标准绘图对象Line2D、Rectangle、Text、AxesImage等。另一种是容器类型,可以包含多个基础类型对象,例如Axes、Axis和Figure等。
2.3Matplotlib库介绍通过调用plt.subplots(x,y)方法可以一下产生个子窗口,并且以NumPy数组的方式保存在axes对象中,而fig仍然是整个图像对象,因此可以通过对axes进行索引来访问每个子窗口。访问Axes子图索引举例如下,最后plt.subplots_adjust()方法用于调整图像边框,使得各个图之间的间距为0。2.3Matplotlib库介绍 Figure对象也可以调用add_axes()方法绘制子图。事先计算好绘图区的位置,提供left、bottom、width、height四个参数,取值范围在[0,1]区间内,该方法的返回类型是axes子图对象。
利用axes对象的方法创建基础类型对象。
利用axes子图对象调用绘制线条的plot()函数,创建一组Line2D对象,返回所有创建的Line2D对象列表。如果调用的绘图对象是绘制柱状图的bar函数或直方统计图的hist()函数,将返回一个Patch对象列表;如果调用的绘图对象是绘制散列图scatter函数,则将返回一个PathCollection对象。2.3Matplotlib库介绍
举例2.3Matplotlib库介绍
绘制效果如图:2.3Matplotlib库介绍通过plt.gcf函数获取当前的Figure绘图对象,也可以通过plt.gca获得当前的axes子图对象。可以通过plt.getp函数获取对象的各种属性。指定属性名:返回对象的指定属性值。不指定属性名:打印出对象的所有属性和其值。2.3.3配置属性调用这些对象的属性设置方法set_*,或属性设置函数setp,设置不同对象属性值:plt.setp(lines,color="r",linewidth=2.0)lines[0].set_color('red')2.3Matplotlib库介绍mpl_toolkits.mplot3d模块提供了简单的3D绘图功能。流程如下:载入绘图模块pyplot以及mplot3d模块。创建Axes3D对象绘制三维图形对象:绘制三维曲面图绘制三维散点图绘制多边形图设置图形坐标范围、展示效果等设置x轴的坐标范围设置x轴标签显示图例2.3.43D图表2.3Matplotlib库介绍mpl_toolkits.mplot3d模块提供了简单的3D绘图功能。流程如下:载入绘图模块pyplot以及mplot3d模块。创建Axes3D对象绘制三维图形对象:绘制3D曲面图绘制3D散点图绘制多边形图设置图形坐标范围、展示效果等设置X轴的坐标范围设置X轴标签显示图例2.3.43D图表2.3Matplotlib库介绍使用plt.show()方法显示绘图窗口。以四面体为例,首先设置好四面体的顶点坐标和所有面对应的顶点,再加上一些属性(如颜色、宽度、透明度),示例代码如下:2.3Matplotlib库介绍
绘制效果如图:2.4SciPy库函数2.4.1线性代数模块 scipy.linalg模块提供了标准线性代数运算,包含了numpy.linalg当中的所有函数。因此建议优先选择使用scipy.linalg。线性方程组求解 solve函数用于解线性方程组中的,其函数原型为:scipy.linalg.solve(a,b,sym_pos=False,lower=False,verwrite_a=False,overwrite_b=False,debug=False,check_finite=True)主要参数含义如下:a:可以是
矩阵也可以是
二维数组。b:长度为
的一维数组返回值:线性方程组的解,既可以是长度为
的一维数组,也可以是的二维数组,取决于的大小。2.4SciPy库函数最小二乘解
如果等式中的矩阵不是方阵,那么就可以使用lstsq函数求解最小二乘解,计算出使得的2范数最小的向量。其函数原型为:scipy.linalg.lstsq(a,b,cond=None,overwrite_a=False,overwrite_b=False,check_finite=True)主要参数含义如下:a:待求解等式中左边的
矩阵。b:待求解等式中右边的矩阵或者向量,是长度为
的一维数组或者
的二维数组。返回值:x:等式的最小二乘解;residuals:表示残差总和;rank:表示矩阵的有效秩。2.4SciPy库函数特征值和特征向量
对于某个给定
维空间上的线性变换,该
维空间中的一个向量就投影成了一个新的向量()。向量与向量在同一条直线上,只是向量的长度发生了缩放,此缩放比例称为线性变换的特征值。
scipy.linalg模块中的eig函数用于求解方阵的一般或广义特征值问题。其函数原型为:scipy.linalg.eig(a,b=None,left=False,right=True,overwrite_a=False,overwrite_b=False,check_finite=True)主要参数含义如下:a:用于计算其特征值和特征向量的复矩阵或实矩阵。left:标识是否用于计算和返回左特征向量,默认值为“False”。right:标识是否用于计算和返回右特征向量,默认值为“True”。返回值:矩阵
的特征值和特征向量。2.4SciPy库函数奇异值分解
奇异值分解方法用于获得非方阵的一些重要特征。svd()函数原型为:scipy.linalg.svd(a,full_matrices=True,compute_uv=True,overwrite_a=False,check_finite=True,lapack_driver='gesdd')主要参数含义如下:a:
待分解矩阵;full_matrices:如果为True(默认),那么
是一个
阶矩阵,
是
阶矩阵;如果为False,
则是
的矩阵,
是
的矩阵,其中
。compute_uv:默认为True,除了
(对应公式中的
)以外是否计算
和
。返回值:
,其中
是由对角线非零元素组成的一维数组而不是对角矩阵。2.4SciPy库函数2.4.2优化和拟合模块
识别给定问题的目标、变量和约束的过程被称为建模。模型建立好之后,可以使用优化算法找到最小值或等式的数值解等问题。scipy.optimization子模块提供了函数最小值、曲线拟合和非线性方程组求解等算法。非线性方程组求解:scipy.optimization子模块提供的fsolve函数用于求解非线性方程组。其函数原型为:scipy.optimization.fsolve(func,x0,args=(),fprime=None,full_output=0,col_deriv=0,xtol=1.49012e-08,maxfev=0,band=None,epsfcn=None,factor=100,diag=None)主要参数含义如下:func:计算方程组误差的函数。x0:未知数的初始值。fprime:按行对各未知数求偏导,计算func函数的雅可比矩阵。2.4SciPy库函数
示例:
最小二乘拟合:一种数学优化技术。可以简便地求得未知数据,并使之与实际数据之间误差的平方和最小。还可用于曲线拟合。其函数原型为:scipy.optimize.leastsq(func,x0,args=(),Dfun=None,full_output=0,col_deriv=0,ftol=1.49012e-08,xtol=1.49012e-08,gtol=0.0,maxfev=0,epsfcn=None,factor=100,diag=None)2.4SciPy库函数
主要参数含义如下:func:需要拟合的差值函数,用于计算真实数据和拟合数据之间的误差。x0:待拟合参数的初始值
示例:2.4SciPy库函数函数最小值
scipy.optimize模块提供了多种优化算法计算函数最小值,例如Nelder-Mead、Powell等。该模块中求解最小值函数的函数原型如下:scipy.optimize.minimize(fun,x0[,args,method,jac,hess,...])主要参数含义如下:fun:待求解最小值的目标函数。x0:未知参数的初始值。args:其它传递给目标函数或者导数函数(例如雅可比矩阵、海森矩阵)的参数。method:支持的优化函数类型,例如:Nelder-Mead、Powell、CG、BFGS、Newton-CG、L-BFGS-B等。jac:目标函数的雅可比矩阵,即函数对各自变量的一阶偏导数,针对CG,BFGS,Newton-CG,L-BFGS-B,TNC等优化算法。hess:目标函数的海森矩阵,即函数对各自变量的二阶偏导数。针对Newton-CG、dogleg、trust-ncg等优化算法。2.4SciPy库函数
示例:2.4SciPy库函数2.4.3统计模块SciPy的stats模块提供了大约80种连续随机变量和10多种离散分布变量。连续随机变量:表示连续型的随机分布,比如均匀分布(uniform)、正态分布(norm)、贝塔分布(beta)等。举几个生成分布函数的例子:正态分布,函数:stats.norm((<shape(s)>,loc=0,scale=1)指数分布,函数:stats.expon((<shape(s)>,loc=0,scale=1)伽玛分布,函数:stats.gamma((<shape(s)>,loc=0,scale=1)其中,参数loc是此概率分布的均值,参数scale是此概率分布的标准差。下面以生成20个[0,1]区间上的均匀分布随机数和20个服从参数λ=0.5的指数分布随机数举例:2.4SciPy库函数连续随机变量的常见调用方法包括:rv_continuous.rvs(size=n):从某一连续随机变量(由loc和scale标识)中做n次采样。rv_continuous.stats():计算连续随机变量的部分统计值,如期望值和方差。rv_continuous.pdf(x):x点的概率密度函数,表示连续型随机变量在各点取值规律。rv_continuous.fit(data):对一组随机取样data拟合,找出最适合取样数据的概率密度函数的系数。
调用方法举例:2.4SciPy库函数离散随机变量:表示离散型的随机分布,比如伯努利分布(bernoulli)、几何分布(geom)、泊松分布(poisson)等。其常见调用方法有:rv_discrete.rvs(size=n):同连续随机变量,从某一分布d中做n次采样。rv_discrete.cdf(x):累计分布函数,用于描述随机变量落在任一区间上的概率。rv_discrete.pmf(x):概率质量分布函数,表示离散随机变量在各特定取值上的概率。
调用方法举例:2.4SciPy库函数2.4.4稀疏矩阵模块稀疏矩阵大部分元素为0,使用ndarray数组保存会浪费内存空间。sparse模块专门用于解决稀疏矩阵有效存储与快速计算问题。稀疏矩阵的存储coo_matrix(arg1[,shape,dtype,copy]):该函数用于创建矩阵,无法对矩阵的元素进行增删改等操作。dok_matrix(arg1[,shape,dtype,copy]):该函数适用于逐渐添加矩阵元素。采用字典来记录矩阵中不为0的元素,字典key存储的是记录元素位置信息的元组,value是记录元素的具体值。示例:[[00000][00020][00104][03000]]2.4SciPy库函数图的表示及相关函数求取有向图的拉普拉斯矩阵scipy.sparse.csgraph.laplacian(csgraph,normed=False,return_diag=False,use_out_degree=False)求取最短路径scipy.sparse.csgraph.shortest_path(csgraph,method='auto',directed=True,return_predecessors=False,unweighted=False,overwrite=False,indices=None)深度遍历的生成树scipy.sparse.csgraph.breadth_first_tree(csgraph,i_start,directed=True)广度遍历的生成树scipy.sparse.csgraph.depth_first_tree(csgraph,i_start,directed=True)
2.4SciPy库函数给定图的最小生成树scipy.sparse.csgraph.minimum_spanning_tree(csgraph,overwrite=False)以一个无向图为例,代码如下:2.4SciPy库函数代码:续上2.4SciPy库函数运行效果:2.5scikit-learn库函数2007年发起的GoogleSummerofCode项目2010年,FebianPedregosa,GaelVaroquaux,AlexandreGramfort等人开始领导该项目,并公开发布了第一个版本(v0.1beta)。2012年11月,scikit-learn已成为维护良好并且十分流行的scikits,奠定了其在机器学习领域的地位。scikit-learn是一个由第三方志愿者维护的、不断改进的机器学习库,截至2017年10月,scikit-learn的版本已经更新到了0.19.1。scikit-learn是一个建立在NumPy、SciPy和Matplotlib模块之上的,主要用Python语言开发的开源机器学习模块。为了获得更好的性能,也有一些核心算法是用Cython完成的,如支持向量机、逻辑回归和线性支持向量机是用Cython包装LIBLINEAR实现的。2.5scikit-learn库函数
2.5.1datasets2.5scikit-learn库函数其调用方式为:load_XXX([return_X_Y])。其中,XXX表示对应的数据集名称,如波士顿房价数据集,就是load_boston;参数return_X_Y是一个boolean值,默认值为false,表示返回数据集全部信息,当用户设为true时,函数仅返回数据集(包括类别数据)。Sklearn0.19.1自带的数据集有波士顿房价数据集(load_boston)鸢尾花数据集(load_iris)书写数字数据集(load_digits)糖尿病数据集(load_diabetes)体能训练数据集(load_linnerud)红酒数据集(load_wine)乳腺癌数据集(load_breast_canscer)
样本图像数据集(Sampleimages)2.5scikit-learn库函数sklearn内嵌了2个JPEG格式的样例图像,分别是china.jpg和flower.jpg,如图2-9所示。使用load_sample_images()加载2幅样本图像,load_sample_image(image_name),加载指定的样本图像,并存放到NumPy数组中。2.5scikit-learn库函数生成数据集分类和聚簇数据集生成器,产生一个包括特征和离散目标的矩阵。单标签(Singlelabel)生成器:make_blobs、make_classification、make_gaussian_quantiles、make_hastie_10_2等;多标签(Multilabel)生成器:make_multilabel_calssification;双簇(Biclustering)生成器:make_bicluster、make_checkerboard。回归数据集生成器,产生一个带有噪声的、随机特征可以稀疏线性组合的回归目标。主要包括:make_regression、make_spare_uncorrelated、make_friedman1等生成函数。流形学习数据集生成器,包括:make_s_curve和make_swiss_roll生成函数。用于压缩的数据集生成器,主要包括:make_low_rank_matrix、make_spd_matrix、make_sparse_coded_signal、make_sparese_spd_matrix生成函数。2.5scikit-learn库函数其他形式的数据集svmlight/libsvm格式的数据集。每一行都采用<label><feature-id>:<feature-value><feature-id>:<feature-value>...。此格式特别适用于稀疏数据集。在本模块中,scipy稀疏的CSR矩阵用于X,NumPy数组用于y。从外部加载数据集(Loadingfromexternaldatasts)。Sklearn既能读取NumPy数组或SciPy稀疏矩阵,也能读取诸如pandas的DataFrame形式的数组内容。二十个新闻组织文本数据集(The20newsgroupsdataset),围绕20个主题,大约有18000个新闻组帖子。基于消息是在特定日期之前和之后发布这一原则,将数据集分为训练集和测试集:一个用于训练(或开发),另一个用于测试(或性能评估)。从数据仓库下载数据集,如下载MNIST数字识别数据集。2.5scikit-learn库函数scikit-learn提供了交叉验证(CrossValidation)、性能度量(PerformanceMeasure)等方法来评价一个估计器的性能或选择参数,也能有效地将计算分配到多核上去。交叉验证
一个模型中的不同参数,会不同程度地影响模型的准确率,如果模型架构配置不恰当,还会出现过度拟合或者欠拟合。
交叉验证就是对训练数据和测试数据进行多次分组,以测试模型的准确率,再计算平均值来衡量当前模型的优劣,scikit-learn提供了下面一些交叉验证方法:k-折交叉验证(k-folderCross-Validation)首先,将数据随机划分为k个互不相交的、大小一样的子集;然后利2.5.2模型选择与评价2.5scikit-learn库函数用k-1个子集数据训练模型,剩余的一个子集测试模型(一共有k种组合);对k种组合一次次地重复进行,计算每次的测试误差平均值。最后,将这个平均值作为泛化误差的估计。通常,使用k折交叉验证时,需要随机重复p次上述过程,最终的测试误差均值是这p次k-折交叉验证的测试误差均值。sklearn提供了KFold生成器类,实现k-折交叉切分,其原型如下:classsklearn.model_selection.KFold(n_splits=3,shuffle=False,random_state=None)
KFold默认将数据集划分成3组,也不打乱数据集的顺序。通过调用get_n_splits([X,y,groups])或split([X,y,groups])方法完成数据集的划分。留一法(least-one-outcross-validation)
留一法是k-折交叉验证的特例,训练集仅仅比初始数据集少一个样本(即留下一个样本),因此训练出来的样本与真实模型十分相近,结果比较准确。然而,当数据集比较大时,计算量太大。2.5scikit-learn库函数 sklearn提供了LeaveOneOut生成器类,实现留一法拆分数据集。其原型如下:classsklearn.model_selection.LeaveOneOut性能度量
性能度量是衡量模型泛化能力的评价标准,在对比不同模型的能力时,使用不同的性能度量往往会导致不同的评判结果。常见的性能度量指标有均方误差、查准率、查全率等等。cross_val_score:在指定数据集运行指定估计器时,通过K-折交叉验证获取的最佳性能。其函数原型为:sklearn.model_selection.cross_val_score(estimator,X,y=None,groups=None,scoring=None,cv=None,n_jobs=1,verbose=0,fit_params=None,pre_dispatch=‘2*n_jobs’)2.5scikit-learn库函数主要参数含义如下:estimator:指定的估计器,该估计器必须有.fit方法进行训练。scoring:字符串,或者可调用对象,或者为None。Scoring指定了评分函数,其原型函数为:score(estimator,X,y)。如为None,则默认采用estimator估计器的.score方法,否则,可以是下列字符串:“accuracy”、“average_precision”、f1系列、“log_loss”、“precision”、“recall”返回值:浮点数的数组,数组元素是估计器某次K-折交叉验证的数据集上预测性能的得分。示例:2.5scikit-learn库函数运行结果如下:cross_val_scoreis:[0.886486490.950819670.867403310.905555560.921787710.966480450.977653630.938202250.858757060.91477273]accuracy_score:用于评价分类问题的准确率。其函数原型为:sklearn.metrics.accuracy_score(y_true,y_pred,normalize=True,sample_weight=None)参数如下:y_true:样本集的真实标记集合;y_pred:分类器对样本集预测的预测值;normalize:默认值为True。如果为True,则返回分类正确的比例(准确率),否则返回分类正确的数量;sample_weight:样本权重,默认每个权重都相等(取值1)。2.5scikit-learn库函数precision_score:用于评价分类问题的查准率,其值为TP/(TP+FP),其中TP是真正的正例数目、FP是假阳性的数量。其函数原型为:sklearn.metrics.precision_score(y_true,y_pred,labels=None,pos_label=1,average=’binary’,sample_weight=None)前两个参数同accuracy_score函数中的说明,其他的参数如下:labels:当average!=’binary’时,则包括标签集。多标签目标时为列索引。默认情况下,y_true和y_pred的所有标签按顺序使用。这个属性是v0.17以后才引入的。pos_label:字符串或整数,默认值为1。指定哪个标记值为正类。average:字符串。多标签目标需要此参数。如果为None,则返回每个类的得分,否则,这将确定对数据执行的平均类型:binary、micro、macro、weighted、samples。返回值:浮点型,分类精度。2.5scikit-learn库函数recall_score:用于计算分类结果的召回率,其值为TP/(TP+FN),其中TP是真正的正例数目,FN是假阴性的数量。其函数原型为:sklearn.metrics.recall_score(y_true,y_pred,labels=None,pos_label=1,average=’binary’,sample_weight=None)其参数与sklearn.metrics.precision_score类似,此处不再赘述。classification_report:以文本的方式给出分类结果的主要预测性能指标。其函数原型为:sklearn.metrics.classification_report(y_true,y_pred,labels=None,target_names=None,sample_weight=None,digits=2)示例:2.5scikit-learn库函数
运行结果如下:precisionrecallf1-scoresupport
class00.501.000.671class10.000.000.001class21.000.670.803
avg/total0.700.600.6152.5scikit-learn库函数参数优化GridSearchCV:(网格搜索交叉验证)以穷举的方式遍历所有可能的参数组合。根据给定的模型自动进行交叉验证,通过调节每一个参数来跟踪评分结果。其原型为:classsklearn.model_selection.GridSearchCV(estimator,param_grid,scoring=None,fit_params=None,n_jobs=1,iid=True,refit=True,cv=None,verbose=0,pre_dispatch=‘2*n_jobs’,error_score=’raise’,return_train_score=’warn’)参数如下:estimator:学习估计器对象。估计器一定要有一个.score方法,用于性能评价,要么自己提供,要么传递过来;param_grid:字典或字典列表。每个字典项给出估计器的一个参数;scoring:字符串,可调函数,列表/元组,字典或空值(None),缺省值为None。如果是字符串,可以是”accuracy””average_precision””log_los”等。2.5scikit-learn库函数示例:2.5scikit-learn库函数示例:续上2.5scikit-learn库函数运行结果如下:Bestparameterssetfound:{'multi_class':'multinomial','solver':'lbfgs','C':0.01,'penalty':'l2'}Bestestimatorfound:LogisticRegression(C=0.01,class_weight=None,dual=False,fit_intercept=True,intercept_scaling=1,max_iter=100,multi_class='multinomial',n_jobs=1,penalty='l2',random_state=None,solver='lbfgs',tol=1e-06,verbose=0,warm_start=False)Bestscorefound:0.966592427617OptimizedScore:0.973333……(省略)
需要优化的参数有:penalty(正则化形式),C(正则化系数),solver(求解器形式),和multi_class(多分类问题的求解策略)。由于某些参数不能共存,所以提供了2个字典作为类别,传给GridSearchCV作为待学习的参数。使用准确率作为评价标准,10折交叉验证生成器,将原始数据分为训练集和测试集,其中训练集用于参数优化,测试集用于模型评价。2.5scikit-learn库函数RandomizeSearchCV:(随机采样交叉验证)在参数网格中随机搜索候选参数组,从而寻找最优的参数组合,是一种有别于GridSearchCV的参数寻优方式,其原型如下:classsklearn.model_selection.RandomizedSearchCV(estimator,param_distributions,n_iter=10,scoring=None,fit_params=None,n_jobs=1,iid=True,refit=True,cv=None,verbose=0,pre_dispatch='2*n_jobs',random_state=None,error_score='raise',return_train_score=True)RandomizedSearchCV从指定的分布中取样固定数量的参数设置。所尝试的参数设置的数目由n_iter提供。如果将所有参数显示为列表,执行不进行替换的取样。如果至少有一个参数作为分布,则使用替换的采样。强烈建议对连续参数使用连续分布。2.5scikit-learn库函数2.5scikit-learn库函数运行结果如下:Bestparameterssetfound:{'C':0.2752844759151486,'multi_class':'multinomial'}Bestestimatorfound:LogisticRegression(C=0.2752844759151486,class_weight=None,dual=False,fit_intercept=True,intercept_scaling=1,max_iter=100,multi_class='multinomial',n_jobs=1,penalty='l2',random_state=None,solver='lbfgs',tol=1e-06,verbose=0,warm_start=False)Bestscorefound:0.963622865627OptimizedScore:0.957778……(省略)
需要优化的参数有:C(正则化系数)和multi_class(多分类问题的求解策略)。在RandomizedSearchCV中使用准确率作为评价标准,10折交叉验证生成器,迭代100次,将原始数据分为训练集和测试集,其中训练集用于参数优化,测试集用于模型评价。2.5scikit-learn库函数2.5.3scikit-learn的机器学习scikit-learn提供了两类机器学习方法:监督学习和非监督学习。监督学习中,样本数据要包含数据集及其对应的标签(label)非监督学习仅仅只需给出数据集。一般来说,分类和回归是监督学习,聚类则是非监督学习。机器学习最困难的问题是如何找到一个合适的估计器(Estimator),因为每个估计器都有其最适合的数据类型和问题场景。scikit-learn提供了一个流程图,旨在为用户提供一个指南,指导初学者在自己的数据集上选择一个合适的估计器。2.5scikit-learn库函数2.5scikit-learn库函数机器学习步骤:样本数据的获取或生成。scikit-learn包含了一些典型的样本数据,用户可以直接加载或者生成实验数据,也可以使用实际数据。分类器训练或预测。首先将数据集分为训练数据集和测试数据集;然后选取一个合适的估计器(estimator)对象,通过.fit方法传入训练数据集来训练估计器;最后用.predict方法对测试数据集进行测试。持久化分类器。将一个训练好的估计器(estimator)持久化,便于以后直接使用。既可以利用python的pickle,也可以使用scikit-learn的joblib。交叉验证。使用cross_val_score对估计器进行交叉验证。2.5scikit-learn库函数示例:2.5scikit-learn库函数运行效果:
从实验结果可以看出,当n_neighbors=10,11或12时,模型的准确率均值为98%,但随着邻居距离的增加,聚类效果逐步下降。第03章决策树决策树ID3算法C4.5算法CART算法3.1引言
3.1引言决策树(DecisionTree)是一种用于监督学习的层次模型。1979年,J.R.Quinlan创立了ID3算法原型。分别于1983年和1986年对ID3进行了总结和改进,确定了决策树模型。决策树可以是二叉树也可以是多叉树,每个非叶结点表示一个特征属性上的测试,每个分支代表该特征属性在某个值域上的输出,而每个叶结点存放一个(分类)类别。使用决策树进行决策的过程就是从根结点开始,测试待分类项中相应的特征属性,并按照其值选择输出分支,直到到达叶子结点,将叶子结点存放的类别作为决策结果。决策树的决策过程非常直观,容易被人理解。目前,决策树已经成功运用于医学、制造产业、天文学、分支生物学以及商业等诸多领域。3.2决策树一个简单的互动游戏:20问题约定:长方形结点代表判断模块,椭圆形结点代表终止模块。那么一个简化的垃圾邮件分类系统。3.2.1决策树的基本思想程序设计中,最基本的语句条件分支结构就是if-then结构。而最早的决策树就是利用这类结构分隔数据的一种分类学习方法。3.2决策树3.2.2决策树的构造表3-1活跃用户调查表统计人数年龄收入是否学生性别是否购买付费游戏装备64青高不是男不买64青高不是女不买128中高不是男买60老中等不是男买64老低是男买64老低是女不买64中低是女买128青中等不是男不买64青低是男买132老中等是男买64青中等是女买32中中等不是女买32中高是男买64老中等不是女不买CLS(ConceptLearningSystem)算法的思想:首先,将决策树设计为三类结点,根结点、叶子结点和内部结点。3.2决策树3.2.2决策树的构造选年龄特征作为根结点,将所有的样本分为老、中、青三个集
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年云南省怒江州贡山三中高三毕业班教学质量检测试题物理试题含解析
- 杭州市萧山区2025届初三下学期第一次质量检查英语试题含答案
- 宁夏师范学院《篆刻临摹》2023-2024学年第二学期期末试卷
- 北京石景山2025届下学期期末初三教学质量检测试题物理试题含解析
- 广东省高州市大井中学2025届高三下学期第一次摸拟试化学试题含解析
- 西安交通大学《美容化学》2023-2024学年第二学期期末试卷
- 广东省广州市石楼镇第二中学2024-2025学年初三第三次质量检测试题英语试题含答案
- 2025年湖南省长沙市雨花区雅礼教育集团初三9月月考化学试题试卷含解析
- 单县2025届数学四下期末经典模拟试题含解析
- 浙江省宁波市慈溪市2025年初三下学期期末模拟英语试题含答案
- 机器人辅助腹腔镜腹膜外根治性膀胱全切除课件
- 七年级英语上册用所给词的适当形式填空
- ANSCO智能巡检机器人
- 室内设计服务内容及设计深度要求
- 全文解读2022年新制订《农村集体经济组织财务制度》PPT课件
- 物业公司组织架构
- 绘本《大大行我也行》PPT
- 设计输入和参考现有平台技术协议222m helideck proposal for gshi
- 小学生A4日记本打印版(田字格+拼音格)(共1页)
- 北京市教育委员会关于建立民办学校办学情况年度报告制度的通知
- 桥墩尺寸经验值
评论
0/150
提交评论