版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第1章机器学习基础1.1认识机器学习1.3人工智能、机器学习、深度学习之间的关系1.2机器学习简史1.4机器学习的相关概念1.5机器学习的任务11.6机器学习的一般步骤1.7机器学习Python基础1.8评估方法与数据集1.1认识机器学习学习基础信息素养高1948年,计算机科学家阿兰•图灵(AlanTuring)在《Mind》上发表的论文“ComputingMachineryandIntelligence”中提出了著名的“图灵测试”。1956年,塞缪尔(ArthurSamuel)设计了一个具有自学习能力的跳棋程序,可以在不断人机对弈的过程中提升自己的棋艺。1959年,他提出了“机器学习”的概念,此研究领域是计算机在不被明确编程的情况下,赋予它学习能力。010203信息素养高2016年3月谷歌的AlphaGo年度围棋挑战赛,AlphaGo以4:1的绝对优势战胜围棋世界冠军李世石九段。041.1.1机器学习的定义机器学习的研究方向主要分为两类:第一类是传统机器学习方法的研究,主要研究学习机制,注重探索模拟人的学习机制;第二类是针对大数据,研究如何有效利用信息,注重从海量数据中获取隐藏的、有效的、可理解的知识。前者侧重于算法理论的研究,后者侧重于数据的处理。机器学习通过数据驱动的模型解决实际问题,其应用几乎渗透到社会的各个领域,涵盖计算机视觉、自然语言处理、推荐系统、自动驾驶、金融科技等。人脸识别011.1.2机器学习的应用手写数字识别垃圾邮件分类020304自动驾驶个性化推荐05房价预测061.2机器学习简史1
萌芽期1943年,心理学家麦W•Mcculloch和数理逻辑学家W•Pitts在发表的论文中提出了MP模型。MP模型是模仿神经元的结构和工作原理,MP模型作为人工神经网络的起源,开创了人工神经网络的新时代。1958年,美国科学家P.Rosenblatt提出了由两层神经元组成的神经网络──Perceptron,即感知机,可解决输入的数据线性二分类问题,从而激发科学家对人工神经网络研究的兴趣,对神经网络的发展起到了里程碑的意义。1.2机器学习简史2发展期1963年,层次聚类算法被提出,这是一种非常符合人的直观思维的算法。1967年,J.B.MacQueen在1967年提出的k均值聚类算法。1983年,著名物理学家J.J.Hopfield提出了神经网络模型,它可模拟人类的记忆,并利用该算法求解“流动推销员问题”这个NP难题。但由于该算法存在容易陷入局部最小值的缺陷,因此并未在当时引起很大的轰动。1983年,TerrenceSejnowski和Hinton等人发明了玻尔兹曼机(BoltzmannMachines),它本质是一种无监督模型,首次提出的多层网络的学习算法,用于对输入数据进行重构以提取数据特征做预测分析。1.2机器学习简史2发展期1986年,人工智能专家J.RossQuinlan提出著名的ID3算法,通过减少树的深度加快算法的运行速度。同年,D.E.Rumelhart等人提出了BP算法,BP算法一直是被应用得最广泛的机器学习算法之一。这期间,决策树的3种典型算法ID3、CART、C4.5陆续被提出。1995年,支持向量机(SVM算法)和AdaBoost算法被提出,SVM以统计学为基础,解决了非线性问题的分类问题。AdaBoost通过将一些简单的弱分类器集成起来使用,构建强分类器,使精度获得很大提升。代表了集成学习算法的胜利。1.2机器学习简史3蓬勃期2006年,GeoffreyHinton团队在《科学》杂志上发表了一篇关于“梯度消失”问题解决方案的论文,提出了深度学习概念,产生了巨大影响。GeoffreyHinton也因此被称为深度学习之父。2016年,由Google基于深度学习开发的AlphaGo以4:1击败世界围棋冠军李世石,随后,该程序与中日韩数十位围棋高手进行快棋对决,连续60局无一败绩。2017年,基于强化学习算法的AlphaGo升级版AlphaGoZero横空出世,无一败绩地轻松击败了之前的AlphaGo。1.3机器学习、人工智能与深度学习的关系1人工智能是一门科学与工程,它是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学,研究内容涵盖语音识别、图像识别、自然语言处理、智能搜索和专家系统等。2机器学习是人工智能的一个分支,是实现人工智能的方法之一。机器学习是对人类生活中学习过程的一个模拟,而在这整个过程中,最关键的是数据。kNN、K-means、DecisionTrees、SVM、朴素贝叶斯、感知机、EM算法、逻辑回归及ANN(ArtificialNeuralNetworks,人工神经网络)都是常见的机器学习算法。1.3机器学习、人工智能与深度学习的关系3深度学习是一种机器学习方法,发展于人工智能的联结主义学派,其概念源于人工神经网络,它通过组合低层特征形成更加抽象的高层特征,其动机在于建立、模拟人脑进行分析学习。在2010年之后,各种深度学习框架的发布及在各领域的突出表现,更进一步促进了深度学习算法的发展。1.4机器学习相关概念1数据集(DataSet):数据的集合,每一条单独的数据被称为样本(Sample)。对于每个样本,它通常具有一些属性(Attribute)或者特征(Feature),特征所具体取得值被称为特征值(FeatureValue)。训练集(TrainingSet)和测试集(TestingSet):在建立机器学习模型过程中,通常将数据集分为两部分:训练集和测试集,其中,训练集用于对模型参数进行训练,另一部分用于对训练好的模型进行测试,验证模型的性能好坏,包括准确率、泛化能力。23验证集(ValidationSet):用于在训练过程中检验模型的性能,以调整参超参数。1.4机器学习相关概念4评估:在训练出算法模型后,为了验证算法模型的好坏,需要对该算法在数据集上根据评价指标进行测试,这个测试过程就是算法的评估。模型(Model):模型是一种算法的表达,模型用于在海量数据中查找模式或进行预测。从数据中使用算法得到模型的过程称为学习(Learning)或训练(Training)。过拟合(Overfitting)和欠拟合(Underfitting):过拟合是指模型在训练集上表现很好,但在测试集上却表现很差。欠拟合是模型在训练集上就表现很差,不能获得足够低的误差,无法学到数据背后的规律。561.5机器学习的任务1监督学习。监督学习是从给定的训练数据集中学习出一个模型参数,然后根据这个模型对未知样本进行预测。在监督学习中,样本同时包含特征(输入)和标签(输出)。根据预测结果输出的类别,可分为分类和回归。1.5机器学习的任务2无监督学习。无监督学习也称为非监督学习,输入的样本只包含特征,而不包含标签。学习模型是数据内在结构的推断,并不知道分类结果是否正确。常见的无监督学习算法有k均值聚类、层次聚类、GMM聚类。利用层次聚类算法对西瓜数据集进行聚类的散点图如图所示。1.5机器学习的任务3半监督学习。半监督学习(Semi-supervisedLearning)是一种介于监督和无监督学习之间的学习方式,通过使用带标签数据及大量不带标签的数据进行模型学习。在监督学习中,样本的类别标签是已知的,对于无监督学习,样本是无标签的。4强化学习(ReinforcementLearning,RL)是一种比较复杂的机器学习方法,强调系统与外界不断的交互反馈,通过不断与环境交互、试错,最终完成特定目的或使整体行动的收益最大化。强化学习不需要训练数据的标签,但需要每一步行动需要环境给予反馈,基于反馈不断调整训练对象的行为。AlghaGo、无人驾驶汽车就是强化学习的的训练对象。1.6机器学习的一般步骤机器学习专注于让机器从大量的数据中模拟人类思考和归纳总结的过程,获得计算模型并自动判断和推测相应的输出结果。机器学习的处理流程如图所示。1.7机器学习Python基础学习基础学习认知能力信息素养高Spyder是一款强大的交互式Python语言开发工具,提供高级的代码编辑、交互测试、调试等特性,它主要用于数据科学领域,具有高级编辑、分析、数据可视化和调试等功能,开发界面设计类似于MATLAB。Spyder开发环境如图所示。PyCharm、Anaconda是Python常见的开发环境,其中Anaconda包含了Python常用的库,自带有JupyterNoteBook、Spyder开发工具,且具有强大的版本管理功能,对不同版本的工具包的安装有很好的支持。1.7.1Python开发环境JupyterNotebook以网页的形式呈现,可在网页页面中直接编写代码和运行代码,支持使用LaTeX编写数学性说明。JupterNoteBook开发环境如图所示。PyCharm是由著名的软件开发公司JetBrains专门为Python开发人员打造的一款功能强大的Python集成开发环境,它包含智能提示、语法高亮、程序调试、Project管理、代码跳转、版本控制等功能。Python是一种面向对象的程序设计语言,拥有int、float、byte、bool等基本数据类型,以及list(列表)、tuple(元组)、dict(字典)等功能强大、使用灵活的序列类型。#计算前n个数的和sum=0foriinrange(11):sum+=iprint("sum=",sum)sum=551.7.2Python基本语法(1)range()函数的作用是返回一个迭代对象,其语法格式如下:range(start,stop[,step])(2)in是成员测试运算符,用于测试一个对象是否是另一个对象中的元素。#成员测试flag=5in[1,2,3,4,5]print(flag)foriin(10,11,12,13,14):print(i,end='')True1011121314(3)map()函数根据提供的函数对指定序列进行映射,其语法格式如下:map(function,iterable,...)其中,参数function表示函数,参数iterable表示序列,可以为多个序列。#计算每个数的平方x=[1,2,3,4,5]res=map(lambdai:i**2,x)print(list(res))[1,4,9,16,25]defdiv2(x):#函数定义,将x除以2returnx/2defsum(x,y):#函数定义,求两个数的和returnx+yprint(list(map(div2,[10,20,30,40,50])))#将列表中各元素除以2print(list(map(sum,[1,2,3,4,5],[6,7,8,9,10])))#计算两个列表中对应元素之和[5.0,10.0,15.0,20.0,25.0][7,9,11,13,15]1.列表列表是一种可变序列,用于存储若干元素,其地址空间是连续的,类似于Java、C++中的数组。x=[1,2,'a',"b","abc",23.56,(10,20,30),[60,70,80]]foriinx:print(i)程序运行结果如下:2ababc23.56(10,20,30)[60,70,80]x=[1,2,'a',"b","abc",23.56]foriinrange(len(x)):print(x[i],end='')程序运行结果如下:12ababc23.56x=[1,2,3]x=x+[5]print(x)x.append(10)print(x)x.extend([10,20,30])print(x)x.insert(5,100)print(x)x.remove(20)print(x)print(x.pop())print(x)[1,2,3,5][1,2,3,5,10][1,2,3,5,10,10,20,30][1,2,3,5,10,100,10,20,30][1,2,3,5,10,100,10,30]30[1,2,3,5,10,100,10]Python与Java、C++语言最大的区别就是序列的切片操作,列表、元组、字符串、range对象都支持切片操作。切片由两个冒号分隔的3个数字组成,其语法格式为:[start:stop:step]start表示切片的开始位置,stop表示切片的结束位置,但不包含该结束位置,step表示步长(默认为1),当步长省略时,最后一个冒号也可以省略。例如:m=[10,20,30,40,50,60]print(m[2:len(m)])print(m[::])print(m[::-1])[30,40,50,60][10,20,30,40,50,60][60,50,40,30,20,10]在数据处理过程中,经常会遇到嵌套列表,如果要取嵌套列表中的某一行元素或某一列元素,则需要列表推导式。例如:a=[[1,2,3],[4,5,6]]print(a[0])#取一行#print(a[:,0])#这样写会产生错误TypeError:listindicesmustbeintegersorslices,nottupleb=[x[0]forxina]#取嵌套列表中的第1列元素print(b)程序运行结果如下:[1,2,3][1,4]元组与列表类似,其区别在于元组是不可变的序列。列表支持元素引用,但不支持修改、增加与删除操作。a=(1,2,3,4,5)#创建元组aprint(a)foriina:print(i,end='')程序运行结果如下:(1,2,3,4,5)12345zip()函数可将多个可迭代对象按照相应位置上的元素组合为元组,然后返回由这些元组组成的zip对象。如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同。a=('name','age','grade','tel')b=('张三',25,'大三'fori,jinzip(a,b):print(i,j,end=';')c=(i*2foriinrange(10))print(tuple(c))name张三;age25;grade大三;te(0,2,4,6,8,10,12,14,16,18)字典是由若干“键-值”对构成的无序序列,字典中每个元素由两部分组成:键和值。其中,键的取值可以是任意不变的数据类型,如整数、浮点数、字符串、元组等,但不能是列表、字典、集合等可变的数据类型。key=['101','102','103','104','105']value=[10,9,8,7,6]dic=dict(zip(key,value))print(dic)print(dic['102'])dic['106']=10dic['101']=5fori,jindic.items():print(i,j,sep=':'){'101':10,'102':9,'103':8,'104':7,'105':6}9101:5102:9103:8104:7105:6106:10集合也是一个无序的可变序列,同一个集合中的对象不能重复出现,这与数学中的集合具有同样的性质。集合运算包括并集、交集、差集和子集等。例如:x=set(range(10))y={-1,-2,-3,5,6}z=x|y#并集print("x=",x)print("y=",y)print("并集操作:",z)z=x&y#交集print("交集操作:",z)z=x-y#差集print("差集操作:",z)z.pop()print(z)z.remove(3)print(z)x={0,1,2,3,4,5,6,7,8,9}y={5,6,-2,-3,-1}并集操作:{0,1,2,3,4,5,6,7,8,9,-1,-3,-2}交集操作:{5,6}差集操作:{0,1,2,3,4,7,8,9}{1,2,3,4,7,8,9}{1,2,4,7,8,9}1.函数Python中的函数定义是以def关键词开头,后面是函数名称和圆括号,圆括号后面要加一个冒号,表示函数声明结束。圆括号内是传递的参数列表。函数体中的语句以缩进格式书写,函数是否有返回值是根据函数体内部是否有return语句决定的,如果有return语句,则表示该函数有返回值,否则表示没有返回值。Accuracy:96.66666666666667%defmax_min_value(mylist):#定义函数
returnmylist.index(max(mylist)),mylist.index(min(mylist))#调用函数mylist=[36,16,33,52,68,100,70,85,6,75]max_min=max_min_value(mylist)print('最大值元素下标和最小值元素下标:',max_min)最大值元素下标和最小值元素下标:(5,8)deffind(table,e):foriinrange(len(table)):iftable[i]==e:returnTrue,ielse:returnFalse,Nonemylist=[36,16,33,52,68,100,70,85,6,75]flag,value=find(mylist,85)print(flag,value)程序运行结果如下:True72.1机器学习Python基础与开发环境2.类Python是一门面向对象程序设计语言,在一个模块功能较多且考虑到系统的可维护性和可复用性,选择类来管理更为合适。#定义一个矩形类classRectangle:def__init__(self,width,height):self.width=widthself.height=heightdefarea(self):returnself.width*self.height创建矩形类对象并调用成员方法area()的方法如下:#创建一个矩形对象并调用它的area()方法rectangle=Rectangle(6,9)print("矩形的面积为:",rectangle.area())运行程序会输出结果:矩形的面积为:54在矩形类定义的基础上,还可以对矩形类进行继承,假如定义一个立方体类,立方体是在矩形类的基础上,增加一个高构成的,类的定义如下:#定义一个立方体类,继承自矩形类classCube(Rectangle):def__init__(self,high):self.high=high#实现立方体类的volume()方法
defvolume(self,rect):returnself.high*rect.area()这样就构造了一个简单的立方体类Cube,其中类名Cube后面括号中的Rectangle就是要继承的类名,作为当前类Cube的父类。#创建一个立方体对象并调用它的volume()方法cube=Cube(10)print("立方体的体积为:",cube.volume(rectangle))程序运行结果如下:立方体的体积为:540同一个列表可存放不同类型的数据,而同一个array数组中存放的数据类型必须全部相同。对于使用列表和array数组存储的矩阵,如果想要取出同一列的元素,对于列表,需要使用列表推导式才能完成;对于array,直接使用切片即可。例如:importnumpyasnpa=np.array([[5,6,7],[8,9,10]])print(a[:,0])如果要获取二维数组中某一行的均值或某一列的均值,可使用means()函数实现,其语法格式如下:numpy.mean(a,axis=None,dtype=None,out=None,keepdims=<novalue>)2.1机器学习Python基础与开发环境a=np.array([[1,2,3],[4,5,6]])print(a)m=np.mean(a)print(m)m=np.mean(a,axis=0)#axis=0,计算每一列的平均值print(m)m=np.mean(a,axis=1)#axis=1,计算每一行的平均值print(m)[[123][456]]3.5[2.53.54.5][2.5.]a=np.array([[1,2,3],[4,5,6],[7,8,9]])b=np.mat(a)print(b)print(np.mean(b)) #对所有元素求平均值print(np.mean(b,0)) #对各列求平均值print(np.mean(b,1)) #对各行求平均值
[[123][456][789]]5.0[[4.5.6.]][[2.][5.][8.]]#矩阵转换为数组mat=np.mat([[1,2,3,4]])print(mat,type(mat))mat_arr=mat.Aprint(mat_arr,type(mat_arr))程序运行结果如下:[[1234]]<class'numpy.matrix'>[[1234]]<class'numpy.ndarray'>DataFrame是由多种类型的列构成的二维标签数据结构,类似于Excel、SQL表、Series对象构成的字典。DataFrame是最常用的Pandas对象,DataFrame支持ndarray、列表、字典、Series字典、DataFrame等多种数据类型的输入。DataFrame还可为数据自动增加index(行标签)和columns(列标签)参数,这样就使生成的DataFrame数据包含行和列索引。利用字典生成DataFrame数据,代码如下:importpandasaspdstu_dict={'姓名':['张晓','许东燕'],'性别':['男','女'],'分数':[86,95]}print(stu_dict)stu_df=pd.DataFrame(stu_dict)print(stu_df)程序运行结果如下:{'姓名':['张晓','许东燕'],'性别':['男','女'],'分数':[86,95]}
姓名性别分数0张晓男861许东燕女95利用Series字典生成DataFrame数据,代码如下:d={'姓名':pd.Series(['吴小倩','刘娜','许友林','李小婷'],index=['A','B','C','D']),'分数':pd.Series([87,90,93],index=['A','B','D'])}df=pd.DataFrame(d)print(df)姓名分数A吴小倩87.0B刘娜90.0C许友林NaND李小婷93.0利用numpy多维数组生成DataFrame数据,代码如下:data=np.zeros((3,),dtype=[('A','i8'),('B','f8'),('C','S8')])df=pd.DataFrame(data)print(df)程序运行结果如下:
ABC000.0b''100.0b''200.0b''创建一个3行4列的随机整数构成的二维数组,然后将其转换为DataFrame格式,代码如下:data=np.random.randint(1,50,size=(3,4))df=pd.DataFrame(data,columns=['A','B','C','D'])print(df)输出结果如下:
ABCD0461335413410722235334若想要在第3列插入一组元素,则代码如下:df.insert(2,'E',[10,20,30])#插入一列print(df)输出结果如下:
ABECD0461310354134102072223530334假设data.xlsx文件中有两个工作表:Sheet1和Sheet2,其内容如图所示。读取data.xlsx文件中的数据代码如下:importpandasaspdx=pd.read_excel('data.xlsx')输出结果如下:序号姓名性别年龄职业01刘艳女26会计12刘娜女27会计23张旭刚男36工程师34吴甜甜女40教师45王刚男32医生假设data.xlsx文件中有两个工作表:Sheet1和Sheet2,其内容如图所示。读取Excel文件时,可以指定要读取的工作表和列号,代码如下:x=pd.read_excel(r'data.xlsx',sheet_name=1,usecols="B,E")print(x)输出结果如下:姓名职称0李闯工程师1赵刚高级工程师2王鹏飞教授级高级工程师importpandasaspdimportnumpyasnp#创建写入器对象writer=pd.ExcelWriter('data.xlsx')start_row=0#指定从第几行开始写入data=np.random.randint(1,50,size=(3,4))data=pd.DataFrame(data,columns=['C1','C2','C3','C4'])data.to_excel(writer,sheet_name='Sheet1',startrow=start_row, header=True,index=False)#丢弃DataFrame对象的行标签#保存数据,关闭文件writer.save()writer.close()1.散点图importmatplotlib.pyplotaspltimportnumpyasnpx=np.linspace(-5,5,50,endpoint=True)y=x**2plt.scatter(x,y,s=20,alpha=1,linewidths=0.1)plt.xlabel('X轴')plt.ylabel('Y轴')plt.title('散点图')plt.rcParams['font.sans-serif']=['SimHei'] #显示中文字体plt.rcParams['axes.unicode_minus']=False #显示负号plt.show()1.散点图#生成数据1,具有两维特征x_Attr1和x_Attr2num=500#数量x_Mean1=4x_Var1=0.5x_Attr1=np.zeros((num,1))x_Attr1=x_Mean1+np.sqrt(x_Var1)*np.random.randn(num,1)x_Mean2=2x_Var2=1x_Attr2=np.zeros((num,1))x_Attr2=x_Mean2+np.sqrt(x_Var2)*np.random.randn(num,1)x=np.c_[x_Attr1,x_Attr2]折线图可以显示随时间而变化的连续数据,适用于显示在相等时间间隔下数据的趋势。x=[1,2,3,4,5,6,7,8]y=[0.62,0.68,0.76,0.81,0.815,0.814,0.816,0.815]plt.plot(x,y)plt.xlim(0,9)plt.ylim(0.6,0.85)plt.title('折线图')plt.xlabel('X')plt.ylabel('Y')plt.rcParams['font.sans-serif']=['SimHei']#如果要显示中文字体,则在此处设为SimHeiplt.rcParams['axes.unicode_minus']=Falseplt.show()通过直方图可绘制连续性的数据,展示一组或多组数据的分布状况x=np.random.standard_normal(100)bins=20n,bins,patches=plt.hist(x,bins,color='#0a6caa',alpha=0.7,rwidth=0.85)plt.grid(axis='y',alpha=0.75)plt.xlabel('区间')plt.ylabel('频率')plt.title('直方图')maxfreq=n.max()plt.ylim(ymax=np.ceil(maxfreq/10)*10ifmaxfreq%10elsemaxfreq+10)plt.show()饼图反映某个部分占整体的比重。labels=['第1季度','第2季度','第2季度','第2季度']#各部分标签percent=[20,45,20,15]#各部分比例color=['red','yellow','green','blue']#各部分颜色plode=[0,0.05,0,0]#各部分突出值plt.pie(percent,explode=plode,colors=color,labels=labels,labeldistance=1.1,autopct="%1.1f%%",shadow=False)plt.axis("equal")#设置横轴和纵轴大小相等,这样饼才是圆的plt.legend()plt.rcParams['font.sans-serif']=['SimHei']#如果要显示中文字体,则在此处设为:SimHeiplt.rcParams['axes.unicode_minus']=False#显示负号plt.show()scikit-learn,也称为sklearn,是针对Python编程语言的免费软件机器学习库,于2007年由Google开发,是目前使用最为广泛的机器学习库。scikit-learn库提供的6个模块介绍如下:分类(classification):目前Scikit-learn已包含的算法:支持向量机(SVM)、最近邻、逻辑回归、随机森林、决策树以及多层感知器(MLP)神经网络等。回归(regression):通过分析相关属性特征与目标之间的关系,给出一组连续的预测值。目前Scikit-learn已包含的算法:支持向量回归(SVR)、Lasso回归、贝叶斯回归、随机森林回归等。聚类(clustering):自动识别具有相似属性的对象,并划分为一类,属于无监督学习范畴,一般可用于辅助决策。目前Scikit-Learn包含的算法:k-均值聚类、谱聚类、均值偏移、层次聚类、DBSCAN聚类等。数据降维(dimensionalityreduction):主成分分析(PCA)、非矩阵分解(NMF)、奇异值分解(SVD)等。模型选择(modelselection):对给定参数和模型的比较、验证和选择,调整模型和参数以提升精度。目前Scikit-learn包括的算法:网格搜索、交叉验证和各种评估函数。数据预处理(preprocessing):数据的离散化、特征提取、归一化、二值化。importseabornassnscolors=sns.color_palette("colorblind")plt.figure()foriinrange(len(y_pred)):ify_pred[i]==0:s1=plt.scatter(X_test[i,1],X_test[i,2],marker='o',color=colors[0])elify_pred[i]==1:s2=plt.scatter(X_test[i,1],X_test[i,2],marker='s',color=colors[1])else:s3=plt.scatter(X_test[i,1],X_test[i,2],marker='*',color=colors[2])plt.xlabel("X")plt.ylabel("Y")plt.title("贝叶斯分类器")plt.rcParams['font.family']=['sans-serif']plt.rcParams['font.sans-serif']=['SimHei']plt.legend((s1,s2,s3),('0','1','2'),loc='best')plt.show()张量(Tensor)就是多维数组(MultidimensionalArray),是深度学习的基础。其作用是为了表达更高维度的矩阵、向量。张量可分为标量、向量、矩阵、3D张量及更高维的张量。importnumpyasnpx=np.array(5)print('x:',x,'x的维度:',x.ndim)x=np.array([1,2,3,4,5,6])print('x:',x,'x的维度:',x.ndim)x=np.array([[1,2,3,4,5],[6,7,8,9,10],[11,12,13,14,15],[16,17,18,19,20]])print('x:',x,'x的维度:',x.ndim)x=np.array([[[1,2,3,4,5],[6,7,8,9,10]],[[11,12,13,14,15],[16,17,18,19,20]]])print('x:',x,'x的维度:',x.ndim)x:5x的维度:0x:[123456]x的维度:1x:[[12345][678910][1112131415][1617181920]]x的维度:2x:[[[12345][678910]][[1112131415][1617181920]]]x的维度:3不同的领域有不同的评估方法,这里注意介绍一些常见的机器学习评估方法:召回率(recall/查全率)、精确率(Precission)、F1-score。混淆矩阵(ConfusionMatrix)。对于二分类来说,其混淆矩阵为二行二列的,如表2-1所示。(1)TP,即TruePostive,为真正例,样本的真实类别是正例,且模型预测的结果也是正例。(2)FP,即FalsePositive,为假正例,样本的真实类别是负例,但模型预测的结果为正例。(3)FN,即FalseNegative,为假负例,样本的真实类别是正例,但模型预测的结果为负例。(4)TN,即TrueNegative,为真负例,样本的真实类别是负例,且模型预测的结果也是负例。1.8评估方法与数据集精确率是指分类正确的正样本占预测为正的样本个数的比例,在信息检索领域称为查准率。计算方法为:召回率是指分类正确的正样本占真正的正样本个数的比例,在信息检索领域称为查全率。计算方法为:准确率是指分类正确的样本占总样本个数的比例。计算方法为:F1-score是综合考虑精确率和召回率的一个评价指标。计算方法为::可得精确率
召回率
准确率。真实值 预测值
0 01 95 20 1 2数据集是在学习机器学习中非常宝贵的资源,没有数据,即使设计出来的模型再好也无法得到训练和验证。例如,用于图像处理的mnist手写数字、鸢尾花数据集,推荐系统中的Douban电影数据集、MovieLens数据集,trec06c邮件数据集、imdb电影评论数据集。TREC06是一个公开的垃圾邮件语料库。该语料库由国际文本检索会议提供,分为英文数据集(trec06p)和中文数据集(trec06c)。文件内容和标签以目录形式存放,data文件夹中是邮件内容,full文件夹下是邮件分类结果,即标签。MNIST数据集共有70000张图像,其中训练集60000张,测试集10000张。所有图像都是28×28的灰度图像,每张图像包含一个手写数字。每张图像均有标注,共10个类别,每个类别代表0~9之间的一个数字,每张图像只有一个类别。Iris(鸢尾花)数据集是常用的分类实验数据集,是机器学习和统计学中的一个经典数据集,数据包含每朵鸢尾花花瓣的长度(PetalLength)和宽度(PetalWidth)、花萼的长度(SepalLength)和宽度(SepalWidth)四个属性,以及每朵花对应的种类(target),还有对数据的一些说明(DESCR)、种类名(target_names)、特征名(feature_names)。MovieLens数据集是推荐系统领域最经典的数据集之一。MovieLens数据集合包含了多个电影评分数据集:MovieLens1M、MovieLens100K、MovieLens25M、MovieLens20M、MovieLens10M、MovieLens1B。每个数据集的格式、大小、用途均有所差异。MovieLens1M数据集包含4个文件:movies.dat、ratings.dat、user.dat、README。ratings是6040位用户对3900部电影的评分数据,包含UserID、MovieID、Rating、Timestamp(时间戳),users.dat文件存放的是用户的相关信息,包括性别、年龄、职业,movies包含了电影id、电影标题、电影类型。1.9本章小结本章主要介绍了机器学习的基本知识,涵盖相关概念、发展简史、机器学习的任务、机器学习的一般步骤。机器学习算法可分为监督学习、无监督学习和半监督学习,根据处理任务的性质,可分为分类、回归两大类。要想学好机器学习,首先应该熟练掌握Python语言开发工具和相关的各种工具库。其次,理解各种算法思想和推导过程,能使用Python内置语法实现该算法。机器学习作为人工智能的一个重要实现工具和分支,已被成功应用于各个领域,其技术仍在快速发展,并在很多方面取得了很大成就。第2章贝叶斯分类器2.1贝叶斯分类器理论基础2.3
朴素贝叶斯分类算法实现──鲈鱼和三文鱼的分类系统2.2朴素贝叶斯分类器原理与设计2.4正态贝叶斯分类器2.5本章小结682.1贝叶斯分类器理论基础学习基础学习认知能力信息素养高先验概率(PriorProbability):在没有训练样本数据前,根据以往经验和分析得到的概率,初始时假设样本h的初始概率,用P(h)表示。条件概率(ConditionalProbability):事件B发生的条件下,事件A在发生的概率,表示为P(A|B),即事件A发生是由于B导致的概率。后验概率(PosteriorProbability):后验概率也是一种条件概率,它是根据事件结果求事件发生原因的概率。例如,上课迟到了,这是事件的结果,而造成这个结果的原因可能是早上起床晚了,或感冒发烧需要先去看病,P(起床晚了|上课迟到)和P(感冒发烧|上课迟到)就是后验概率。0102032.1贝叶斯分类器理论基础学习基础信息素养高类条件概率(ClassConditionalProbability):当下事件由果及因发生的概率。样本x相对于类标签c的概率,也称为似然,记作P(x|c)。注意区分几个概念:(1)先验概率是不依赖观测数据的概率分布,在朴素贝叶斯中,类别的概率就是先验概率,记为p(c)。(2)事情已经发生,计算这件事情发生的原因是由某个因素引起的可能性的大小,是后验概率。后验概率的计算要以先验概率为基础。(3)“似然”描述的是在给定了特定观测值的条件下,模型参数的合理性。通常用于建模过程中,选取合适的参数使模型更好地拟合数据。042.1贝叶斯分类器理论基础如果A和B是样本空间Ω的两个事件,在给定A条件下B的概率为:推广到一般形式,设A是样本空间Ω上的事件,B是样本空间Ω上的一个划分,2.1贝叶斯分类器理论基础【例2-1】某地区Y病毒的感染率为0.05,在实际检查过程中,可能会由于技术及操作等原因使病毒携带者未必能检查出阳性反应,同样不带病毒也可能会检查出阳性。假设P(阳性|携带病毒)=0.98,P(阳性|不携带病毒)=0.04,假设某人检查出阳性,他带病毒的概率是多少?由于P(阳性|携带病毒)=0.98,P(阳性|不携带病毒)=0.04,则P(阴性|携带病毒)=0.02,P(阴性|不携带病毒)=0.96。根据贝叶斯公式和全概率公式,有2.1贝叶斯分类器理论基础2.1贝叶斯决策理论基础
极大似然估计为了估计类条件概率,可以先假设其服从某种确定的概率分布,再利用训练样本对概率分布的参数进行估计。这就是极大似然估计(MaximumLikelihoodEstimation,MLE)的算法思想,极大似然估计提供了一种给定观察数据来评估模型参数的方法,即:模型已定,参数未知。通过若干次实验,观察其结果,利用实验结果得到某个参数值能够使样本出现的概率为最大,则称为极大似然估计。假设Tc表示训练集T中第c类样本集合,且这些样本是独立同分布的,则参数对于数据集Tc的似然为:2.1贝叶斯决策理论基础找出参数空间中能使取最大参数值的,其实就是求解:假设样本服从均值为、方差为的正态分布,对其求对数:2.1贝叶斯决策理论基础求最大似然估计量的一般步骤如下:(1)写出似然函数(2)对似然函数取对数,并整理(3)对的相应参数求偏导(4)解似然方程,得到参数的值。2.1贝叶斯定理相关概念一个单变量正态分布密度函数为:其正态分布的概率密度函数如图所示。与μ越近的值,其概率越大,反之,其概率值越小。σ描述数据分布的离散程度,σ越大,数据分布越分散,曲线越扁平;σ越小,数据分布越集中,曲线越瘦高。2.1贝叶斯决策理论基础对于多变量的正态分布,假设特征向量是服从均值向量为、协方差矩阵为的n维正态分布,其中,类条件概率密度函数为:2.1.4梯度下降法梯度下降(GradientDescent)作为机器学习中的常用算法,是一种寻找目标函数最小化的方法,它利用梯度信息,通过不断迭代调整参数来寻找合适的目标值。这就像你在山势连绵起伏的山上,最快下山的方法就是每次从当前位置沿着最陡峭的方向走一步,直到走到山脚。这里的下山最陡的方向就是梯度的负方向。如图所示。所谓梯度,是一个矢量,表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向(梯度的方向)变化最快,变化率最大。2.1.4梯度下降法梯度下降可用数学公式去表述,如果是凸函数,表示山的形状,那么梯度下降公式可以表示为假设优化目标为:2.2朴素贝叶斯分类器原理与设计西瓜数据集如表2-1所示。2.2朴素贝叶斯分类器原理与设计假设我们要判断第12条西瓜数据是否为好瓜,即:根据表2-1的西瓜数据集,有好瓜和坏瓜的先验概率:假设各特征是相互独立的,则有2.2朴素贝叶斯分类器原理与设计dataTrain=np.array(dataTrain)y=dataTrain[:,-1]good=np.sum(y=='好瓜') #好瓜的数量bad=np.sum(y=='坏瓜') #坏瓜的数量#好瓜和坏瓜的先验概率prior_good=good/len(y)prior_bad=bad/len(y)2.2朴素贝叶斯分类器原理与设计2.2朴素贝叶斯分类器原理与设计颜色概率0.3750.333敲声概率0.750.444纹路概率0.8750.222颜色概率0.50.222敲声概率0.250.333纹路概率0.8750.222颜色概率0.50.222敲声概率0.750.444纹路概率0.8750.222准确率88.24%2.2朴素贝叶斯分类器原理与设计为了解决零概率的问题,法国数学家拉普拉斯最早提出用加1的方法估计没有出现过的现象的概率,因此这种平滑(Smoothing)方法也称为拉普拉斯平滑(LaplacianSmoothing)。引入拉普拉斯平滑技术后,修正后的类先验概率和类条件概率可表示为:朴素贝叶斯分类器的优点:(1)对小规模数据表现很好,能处理多分类任务;(2)算法比较简单,常用于文本分类;(3)有稳定的分类效率,对缺失数据不太敏感;(4)适合增量式训练,当数据量超出内存时,可一批一批读取数据进行增量训练。2.3朴素贝叶斯分类器算法实现从fish.xlsx文件中读取鲈鱼和三文鱼的长度、亮度数据,其中,前n/2条数据为鲈鱼,后n/2为三文鱼,分别从鲈鱼和三文鱼数据中随机取出50%作为训练集,其余的50%作为测试集。12.3朴素贝叶斯分类器算法实现2生成三文鱼和鲈鱼的概率密度。根据生成长度和亮度数据,利用均值和方差公式直接计算长度和亮度特征的均值和方差。2.3朴素贝叶斯分类器算法实现3计算三文鱼和鲈鱼的后验概率。根据得到三文鱼和鲈鱼的长度、亮度特征类条件概率,利用朴素贝叶斯公式计算出它们的后验概率。2.3朴素贝叶斯分类器算法实现计算分类正确率。#假设长度和亮度是互相完全独立的,根据朴素贝叶斯公式和联合概率密度公式计算出鲈鱼和三文鱼的类条件概率,计算分类的正确率和错误率count1=0count2=0foriinrange(n//4):#长度特征post_length_pred1=stats.norm(perch_Mean_Length,perch_Variance_Length).pdf(perch_test[i,0])#将鲈鱼分为鲈鱼post_length_pred2=stats.norm(salmon_Mean_Length,salmon_Variance_Length).pdf(perch_test[i,0])#将鲈鱼分为三文鱼
precision_salmon:1.0precision_perch:0.834precision_bayes:0.91742.4正态贝叶斯分类器假设样本的特征向量服从正态分布,则这样的贝叶斯分类器就称为正态贝叶斯分类器或高斯贝叶斯分类器。更一般地,样本的特征并不是相互独立的。根据分类判决规则,在预测时需要寻找具有最大条件概率值的那个类,即最大化后验概率,等价于求每个类中最大的那个。对取对数,公式为:2.5贝叶斯网络贝叶斯网络(BayesianNetwork),又称信念网络(BeliefNetwork),是一种概率图模型(ProbabilisticGraphicalModel,PGD),它是一种模拟人类推理过程中因果关系的不确定性处理模型,可通过有向无环图(DirectedAcyclicGraph,DAG)来表示。2.5贝叶斯网络假设:随机变量w(weather):天气随机变量m(mood):心情随机变量p(play):打羽毛球随机变量r(restaurant):下餐馆吃饭随机变量f(film):看电影变量S对变量L和变量E有因果影响,而变量C对变量E也有因果影响。2.5贝叶斯网络
#验证模型:检查网络结构和CPD,并验证CPD是否正确定义和总和为1model.check_model()#获取结点“w(天气情况)”的概率表:
print(model.get_cpds("w"))#获取整个贝叶斯网络的局部依赖:print(model.local_independencies(['p','r','f']))#推测“f(是否看电影)”的节点概率,在pgmpy中我们只需要省略额外参数即可计算出条件分布概率
infer=VariableElimination(model)print(infer.query(['f'],evidence={'p':1,'p':0}))#变量消除法是精确推断的一种方法
asia_infer=VariableElimination(model)q=asia_infer.query(variables=['r'],evidence={'p':0})print(q)q=asia_infer.query(variables=['r'],evidence={'m':0})print(q)2.6本章小结贝叶斯分类是以贝叶斯定理为基础的分类方法。朴素贝叶斯分类是贝叶斯分类中最简单、最常见的一种分类方法,它假设样本特征之间是相互独立的。理论上,朴素贝叶斯分类与其他分类方法相比具有最小的误差率,但在实际应用中样本特征个数比较多或者特征之间相关性较大时,分类效果表现不好。为了避免零概率情况,在构造朴素贝叶斯分类器时,还需要利用数据平滑方法进行处理。第3章K近邻算法与参数估计3.1KNN算法原理3.3KNN算法的优缺点3.2KNN算法的应用3.4非参数估计3.5非参数估计算法的实现963.1KNN算法原理K近邻算法就是生活里“随大流”的逻辑——“看身边最熟的几个人是啥样,你就大概是啥样”。97/48小明刚转到一所新的学校,想知道班里一个没有说过话的同学A是“学霸组”还是“玩机组”。他不好意思直接去问,就观察:先看这位同学A课间总跟谁待着(离得最近的人);他观察了与同学A走的最近的3(K=3)个同学,这3个人里有2个总在刷题(只有学霸符合这个特征),1个总在打游戏(玩家);于是基本能断定:这个新同学A大概率也是学霸组的。对未标记样本的类别,由距离其最近的K个邻居投票来决定属于哪个类别。假设有一个已标记好的数据集,此时有一个未标记的数据样本,我们的任务是预测出这个数据样本所属的类别。KNN的原理是:计算待标记样本和数据集中每个样本的距离,取距离最近的k个样本。待标记的样本所属类别就由这K个距离最近的样本投票产生。98/48第1步,“认亲”——先找到谁是“近邻”。第2步,“挑人”——选几个最亲的(确定K值)。第3步,“随大流”——多数说了算。99/48KNN算法步骤假设X_test为待标记的样本,X_train为已标记的数据集,算法原理描述如下:(1)遍历X_train中的所有样本,计算每个样本与X_test的距离,并把距离保存在数组D[]中。(2)对数组D[]进行排序,取距离最近的k个点,记为X_knn。(3)在X_knn中统计每个类别的个数,即class0在X_knn中有几个样本;class1在X_knn中有几个样本等。待标记样本的类别,就是在X_knn中样本个数最多的那个类别。例如,在图4-1中,有两类不同的样本数据,分别用三角形和正方形表示,而中间的圆形表示的是待分类的数据,还不知道属于哪一类,我们用“?”标记。下面我们根据K近邻的思想为该圆形表示的样本进行分类。如果K=5,在圆形最近的样本点中,有4个正方形和1个三角形,根据少数从属于多数的原则,判定圆形这个待分类样本属于正方形表示的样本一类。如果K=11,在离圆形最近的样本中,有6个三角形和5个正方形,还是少数从属于多数的原则,判定圆形这个待分类样本属于三角形一类。100/481.闵可夫斯基距离101/48
两个样本点之间的距离度量常用的距离度量方法有:闵可夫斯基距离、马氏距离、汉明距离、夹角余弦等。闵可夫斯基距离(MinkowskiDistance)将样本看作高维空间中的点进行距离度量。对于n维空间中任意两个样本点和,P和Q的闵可夫斯基距离定义为:其中,p≥1,为的p范数。当p=1时,有:102/48此时,的取值就是两个点的绝对值之和,称为曼哈顿距离(ManhattanDistance)。几何意义就是沿水平方向从P到Q的距离。当p=2时,P和Q的距离为:
就表示二维空间中两个点P和Q之间的直线距离,称为欧几里得距离或欧氏距离(EuclideanDistance)。defeuclidean_distance(p,q):"""
计算两个n维点p和q的欧氏距离:paramp:点1的坐标,如列表/元组[x1,x2,...,xn]:paramq:点2的坐标,如列表/元组[y1,y2,...,yn]:return:欧氏距离数值"""#确保两个点维度一致iflen(p)!=len(q):raiseValueError("两个点的维度必须相同!")
sum_squared=0#初始化平方和forxi,yiinzip(p,q):sum_squared+=(xi-yi)**2#累加各维度差的平方returnsum_squared**0.5#开平方得到距离103/48104/482.马氏距离与欧氏距离、曼哈顿距离一样,马氏距离(MahalanobisDistance)常被用于评定数据之间的相似度指标,它可以看作是欧氏距离的修正,修正了欧氏距离中各维度尺度不一致且相关的问题。单个数据点的马氏距离定义为:数据点P和Q之间的马氏距离定义为:其中,是多维随机变量的协方差矩阵,为样本均值。当样本的各个特征向量相互独立,协方差是单位向量,马氏距离就成了欧氏距离。这里的的作用是用于衡量两个变量之间的关联性。1.修正“特征尺度差异”——让不同单位的特征“公平比较”比如有两个特征:•身高(单位cm):数值范围150-200(跨度大)•年龄(单位岁):数值范围10-80(跨度小)如果用欧氏距离,身高的“1cm差异”和年龄的“1岁差异”会被直接相加,但显然“身高差10cm”和“年龄差10岁”的实际意义完全不同。欧氏距离会被大尺度特征(身高)主导,小尺度特征(年龄)的影响被“碾压”。105/48协方差矩阵里的方差项(对角线元素),能反映每个特征的“波动幅度”。马氏距离用协方差矩阵的逆,相当于给大尺度特征“缩小权重”、小尺度特征“放大权重”,让它们的差异能被公平比较。比如身高方差大(波动大),协方差矩阵逆的对应元素小,这样身高差异在计算中被“削弱”;年龄方差小(波动小),逆矩阵对应元素大,这样年龄差异就会被“强化”。106/483.汉明距离汉明距离(HammingDistance)需要将处理的样本数据转换为0和1表示的二进制串,样本中各分量的取值只能是0或1,例如字符串“1110”与“1001”之间的汉明距离为3。对于任意样本特征和,有,其汉明距离为:汉明距离常应用在信息论、编码理论、密码学等领域。107/484.夹角余弦夹角余弦(Cosine)度量将样本看成是高维空间中的向量进行度量,度量方法就是计算两个向量的余弦夹角。对于任意两个n维样本和,其夹角余弦为:当n=2时,夹角余弦计算的就是二维空间中两条直线的夹角余弦值。夹角余弦的取值范围为[-1,1]。夹角余弦值越大,表示两个向量的夹角越小;夹角余弦越小,表示两向量的夹角越大。当两个向量的方向重合时,夹角余弦取最大值1;当两个向量的方向完全相反时,夹角余弦取最小值-1。defcosine_similarity(p,q):"""
计算余弦相似性参数:
p(list/tuple):向量1,如[x1,x2,...,xn]q(list/tuple):向量2,如[y1,y2,...,yn]
返回:余弦相似性值(float,范围[-1,1])
"""#1.检查向量维度是否一致
iflen(p)!=len(q):raiseValueError("两个向量的维度必须相同!")#2.计算点积:Σ(x_i*y_i)dot_product=sum(a*bfora,binzip(p,q))#3.计算向量模长:√(Σx_i²)和√(Σy_i²)norm_p=(sum(a**2forainp))**0.5norm_q=(sum(b**2forbinq))**0.5#4.避免除以0(若模长为0,视为相似性0)
ifnorm_p==0ornorm_q==0:return0.0#5.余弦相似性=点积/模长的乘积
returndot_product/(norm_p*norm_q)108/483.2k近邻算法应用学习基础学习认知能力信息素养高Iris
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2026学年两课时说课稿
- 2025-2026学年厨师创意美术说课稿
- 2025-2026学年《蝈蝈》说课稿
- 2025-2026学年多媒体教学活动说课稿
- 2026年浙江省兰溪市高二生物下册期末考试模拟试卷及参考答案(综合卷)
- 2026年广东省台山市高二生物下册期末考试模拟卷附答案【综合题】
- 2025-2026学年大班语言落叶说课稿
- 2025-2026学年化学实验室之旅说课稿
- 2025-2026学年匆匆说课稿结尾
- 2025-2026学年大班社会我的祖国说课稿
- 《礼赞伟大祖国 争做时代少年-小学四年级国庆主题班会》
- 《医疗器械临床使用管理办法》培训考试测试题含答案
- 综合管理竞聘测试题及答案
- 湖北武汉市2026-2027学年高三年级上学期9月调研考试英语试卷
- 2026年部编版新教材道德与法治五年级上册全套教学设计(共4个单元有教学计划)
- 人教版初中英语八年级上册第一单元完整教案
- 高考英语谓语与非谓语组合练100题(含答案)
- 国药数科2026届春季校园招聘建设笔试备考试题及答案解析
- 内分泌科护理服务质量管理标准
- 雨课堂在线学堂《大数据机器学习》作业单元考核答案
- (正式版)DB65∕T 3442-2013 《金丝玉》
评论
0/150
提交评论