【4.0】基于概率论的分类方法:朴素贝叶斯
前言前面的算法我们要求分类器对于“该数据属于哪一个分类”这类问题做出明确回答。不过,分类器有时会产生错误结果,这时可以要求分类器给出一个最优的类别猜测结果,同时给出这个猜测的概率估计值。
概率论是许多机器学习算法的基础,所以深刻理解这一主题就显得十分重要。
基于贝叶斯决策理论的分类方法朴素贝叶斯
优点:在数据较少的情况下依然有效,可以处理多类别问题
缺点:对于输入数据的准备方式较为敏感
适用数据类型:标称型数据。
朴素贝叶斯是贝叶斯决策论的一部分,所以在讲述朴素贝叶斯之前有必要快速了解一下贝叶斯决策理论。
假设有人找到了描述图中两类数据的统计参数1。现在我们使用 $P_1(x,y)$ 表示数据。点 $(x,y)$ 属于类别 1 (图中用圆形表示的类别)的概率,用 $P_2(x,y)$ 表示数据点 $(x,y)$ 属于类别 2 (图中用菱形表示的类别)的概率。那么对于一个新的数据点 $(x,y)$ ,可以使用下面的规则来判断它的类别:
如果 $\large P_1(x,y) > P_2(x,y)$ ,那么类别为 1
如果 $\large P_2(x,y) > P_1 ...
【3.0】决策树
前言如果你以前没有接触过决策树,也不需要担心,它的概念非常简单。即使不知道它也可以通过简单的图形了解其中的工作原理,下图的流程图就是一个决策树,长方形代表判断模块(decision block),椭圆形代表终止模块(terminating block),表示这已经得出结论,可以终止运行。从判断模块引出的左右箭头称为分支(branch),它可以到达另一个判断模块或者终止模块。该流程图构造了一个假想的邮件分类系统,它首先检测发生邮件域名地址。如果地址为 myEmployer.com ,则将其放在分类 “无聊时需要阅读的邮件”,其他同理分类。
K-近邻算法已经可以完成很多分类任务,但是它最大的缺点就是无法给出数据的内在含义,决策树的主要优势就是在于数据形式非常容易理解。决策树可以使用不熟悉的数据集合,并从中提取出一系列规则,这些机器根据数据集创建规则的过程,就是机器学习的过程。
前排提醒:在接下来的代码示例中,有看不懂的函数,可以尝试在下面的 函数相关说明 处查看
决策树的构造决策树的优缺点
优点:计算复杂度不高,输出结果容易理解,对中间值的缺失并不敏感,可以处理不相关特征数据。
...
【2.0】K-近邻算法
前言众所周知,电影可以按照题材进行分类,然后题材分类本身是如何定义的?动作片中会存在接吻镜头,而爱情片中也会存在打斗场景,我们不能单单依靠是否存在打斗和亲吻来判断影片类型。但是爱情片中的接吻镜头会更多,动作片中的打斗场景会更加频繁,基于场景的出现次数我们就可以进行电影分类。
这部分将会使用K-近邻算法来自动划分电影的题材类型。
注:本实例使用的python版本为:v3.10,理论上你只要使用 v3.x 的任意版本即可运行。
K-近邻算法概述简单来说,K-近邻算法采用测量不同特征值之间的距离方法进行分类。
优点:精度高,对异常值不敏感,无数据输入假定
缺点:计算复杂度高,空间复杂度高
适用数据范围:数值型和标称型
K-近邻算法(KNN)的工作原理是:存在一个样本数据集合,也称作训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一个数据与所属分类的对应关系。输入没有标签的新数据后,将新数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本集中特征最相似数据(最近邻)的分类标签。一般来说,我们只选择样本数据集中前 k 个最相似的数据,这就是 k-近邻算法中 k 的 ...
【1.0】机器学习基础
前言我尝试从线性代数的部分写起,但是我发现这样太拖拉了,对于我的学习来说很不利,所以我打算就不写线性代数和高等数学的内容了,在学习机器学习之前请确保你已经对如下内容有一定的基础:
python语言:如果不会请参考我的一些 python 内容或者自行网络上学习
线性代数:考研数学即可
高等数学:考研数学即可
本系列内容参考自:Peter Harrington 的 《Machine Learning in Action》和《智能之门》以及哔哩哔哩,网络上相内容上结合本人实践编写。
什么是机器学习除了一些无关紧要的情况,人们很难直接从原始数据本身获取所需的信息。例如:对于垃圾邮件的检测,侦测一个单词是否存在没有太大的作用,然后当多个特定单词同时出现,再根据邮件的时间长度等其他因素,就可以快速的判断该邮件是否为垃圾邮件。简单的来说,机器学习就是把无序的数据转换为有用的信息。
机器学习用到了统计学知识,在大多数人看来,统计学不过是企业用以炫耀产品功能的一种统计而已。那么我们为什么还需要利用统计学呢?就工程实践来说,它是利用科学知识来解决具体的问题。在某些情况下,我们会面对很多需要确凿解法,或 ...
关于Python的一些工具
前言想了一阵,还是觉得这个标题有些不太对,或者说不太切题。关于这篇内容,我主要是想说明如果使用Anaconda来更加方便的管理python环境,对于机器学习相关方便更是大有帮助。另外来简单搭建使用PyQt来开发跨平台桌面软件。
大概如此,标题果然还是有些太大了。
Anaconda关于python的环境配置相关内容基础,我已经在之前的python文章中做了说明,对于繁杂的环境操作,我们可以使用Anaconda来更加方便的管理我们的python环境,对于做机器学习相关的伙伴来说更加方便,它包含了大量的机器学习相关的包,可以某种程度上避免国内网络问题导致某些包无法安装的问题。
安装 Anaconda你可以通过访问Anaconda官网来访问下载安装对应系统的Anaconda,此处省略下载安装。
安装完成后,运行Anaconda Navigator,它会做一些初始化工作,期间屏幕会闪出一些命令窗口是正常的,仅需要等待软件启动即可。
进入软件后,界面如下所示:
你可以在主页中,配置相关工具,例如如果你下载了PyCharm或者VS code都可以在这里配置,其中有一个jupyter这个工具, ...
【5.0】类
前言类是一种对象的抽象化描述,它是基于面向对象语言而产生的概念。类提供了一种组合数据和功能的方法。 创建一个新类意味着创建一个新的对象 类型,从而允许创建一个该类型的新 实例 。 每个类的实例可以拥有保存自己状态的属性。 一个类的实例也可以有改变自己状态的(定义在类中的)方法。
Python 的类提供了面向对象编程的所有标准特性:类继承机制允许多个基类,派生类可以覆盖它基类的任何方法,一个方法可以调用基类中相同名称的的方法。对象可以包含任意数量和类型的数据。和模块一样,类也拥有 Python 天然的动态特性:它们在运行时创建,可以在创建后修改。
初识类定义类类的定义语法格式类似于如下所示:
12class ClassName: #这是类的内容
当进入类定义时,将创建一个新的命名空间,并将其用作局部作用域 — 因此,所有对局部变量的赋值都是在这个新命名空间之内。 特别的,函数定义会绑定到这里的新函数名称。
类对象类对象支持两种操作:属性引用和实例化。
属性引用使用 Python 中所有属性引用所使用的标准语法: obj.name。 因此,如果类定义是这样的:
12345class ...
【6.0】虚拟环境和包
前言Python应用程序通常会使用不在标准库内的软件包和模块。应用程序有时需要特定版本的库,因为应用程序可能需要修复特定的错误,或者可以使用库的过时版本的接口编写应用程序。
这意味着一个Python安装可能无法满足每个应用程序的要求。如果应用程序A需要特定模块的1.0版本但应用程序B需要2.0版本,则需求存在冲突,安装版本1.0或2.0将导致某一个应用程序无法运行。
这个问题的解决方案是创建一个 virtual environment,一个目录树,其中安装有特定Python版本,以及许多其他包。
然后,不同的应用将可以使用不同的虚拟环境。 要解决先前需求相冲突的例子,应用程序 A 可以拥有自己的 安装了 1.0 版本的虚拟环境,而应用程序 B 则拥有安装了 2.0 版本的另一个虚拟环境。 如果应用程序 B 要求将某个库升级到 3.0 版本,也不会影响应用程序 A 的环境。
创建虚拟环境用于创建和管理虚拟环境的模块称为 venv。venv 通常会安装你可用的最新版本的 Python。如果您的系统上有多个版本的 Python,您可以通过在系统变量中设置然后通过自定义命令来选择特定的Pyth ...
【4.0】模块
前言因为Python是解释型的,这就意味着如果你运行后退出再次运行,之前定义的变量及其相关数据都会丢失。因此如果你希望编写一些长的程序,则需要使用文本编辑器来进行,并将编辑好的python代码作为输入运行。这种形式的文件被称为:脚本。
随着编写的内容越来越多,当你希望将其编写的内容拆分成几个不同类型的文件以方便维护;或者你希望经常使用自己的某个函数(方法),而不必要每次都编写一次代码内容。为了支持这些需求,python可以将定义放在一个文件里,并在脚本中交互的时候它们。这种文件被称为:模块。
在我们编写的脚本中,可以导入不同的模块,以实现各种我们所需要的功能。
模块本质仍是一个包含python语句的文件,其后缀为:.py。在模块内部,模块名称可以通过全局变量__name__的值获得。
例如,你可以在任意文件路径下,创建一个新的.py文件,其代码内容如下所示:
12def PutText(): print("test");
该.py文件中仅仅定义了一个名称为PutText的函数(方法),你可以通过如下代码在另一个.py文件中,调用你定义的这个方法,代码示例:
...
【3.0】数据结构
前言这部分会再前面涉及的数据结构的基础上拓展并且说明更多的数据结构,这些数据结构在编程方面就如图画家的画笔,是编程工具或者说小帮手。
✒️:现在需要说明一个事情,且后面不会再强调说明:如果方法签名中某些参数两边的方括号([])表示这个参数是可选的,而不是要你输入方括号。你会在 Python 参考库中经常看到这种表示方法。
列表的更多特性前面已经说明了列表的基本概述,其还有很多的方法,如下所示:
方法
说明
list.append(x)
在列表的末尾添加一个元素
list.extend(iterable)
使用可迭代对象中的所有元素来扩展列表
list.insert(i, x)
在给定的位置插入一个元素。第一个参数是要插入的元素的索引,第二个参数是要插入的元素
list.remove(x)
移除列表中第一个值为 x 的元素。如果没有这样的元素,则抛出 ValueError异常
list.pop([i])
删除列表中给定位置的元素并返回它。如果没有给定位置,a.pop() 将会删除并返回列表中的最后一个元素
list.clear()
移除列表中的所有元素
...
【2.0】流程控制工具
前言除了上一部分使用的的 while语句,Python 中也会使用其他语言中常见的流程控制语句,只是稍有变化。
流程控制语句while语句语句格式如下所示:
123# 这是基本语法格式while 条件: 执行过程
注:执行过程语句的缩进是必要的且要缩进一致
if 语句这是编程中最基本也是最常用的语句之一了,代码原型:
12345678910111213141516171819# 最基本的用法if 条件: 执行语句else 条件: 执行语句# 当然你也可以只使用 if 条件if 条件: 执行语句# 当然你也可以多条件使用if 条件: 执行语句elif 条件: 执行语句elif 条件: 执行语句else 条件: 执行语句
可以有零个或多个 elif1部分,以及一个可选的 else部分。
注:python 并不支持 else if 全称写法
for语句Python 的for语句和其他编程语言不太相同,Python 并不是设置步长,循环条件来完成for循环。反而是对任意序列进行迭代(例如列表或字符串),条目的迭代顺序与它们在序列中出 ...