分类问题

在统计和机器学习里,分类问题的目标是:取一个新的观测向量x\mathbf{x},将它分到 KK 个离散的类 Ck\mathcal{C}_k (k=1,2,…,Kk=1, 2, \dots, K) 之一。一般来说,类之间是互不相容的,因此,每一个观测只能被分到一个类中。举一个分类问题的例子:

例子:垃圾邮件的过滤

人们在日常email的处理中,总能不可避免地收到垃圾邮件。怎样从一批邮件中区别哪些是正常邮件,哪些是无用的垃圾邮件呢?这就是一个两类的分类问题,即,对收到的一个邮件,将它分到正常邮件类或者垃圾邮件类。那么,按照什么原则分类呢?可以考虑邮件的内容、文本模式、寄件人地址等,这些称为特征。根据这些特征来对邮件是否为垃圾邮件进行分类,分类的结果可能是这样的:

在机器学习里,分类( classification )是一种有监督学习(supervised learning )的方法。通常,将数据分成训练集(Training set)、验证集(Validation set)和检验集(Test set)三部分。在训练集上建立统计模型,估计未知参数;在验证集上优化模型,包括调整参数;最后,在检验集上检验该方法的优劣性及执行效率。所谓有监督学习,在分类问题里,指的是训练集的观测对象的类别标签(class labels)是已知的,即,已知对象的所属类别。

频率学派与贝叶斯学派的“分类”

早期的分类问题由频率学派的代表人物,著名统计学家 Fisher 提出,并应用于两类的分类问题。Fisher 假设每个类对应特定的正态总体,并提出了线性判别函数( Fisher’s linear discriminant function )作为观测对象的分类准则。

与频率学派的分类思想不同,贝叶斯( Bayesian )学派的分类,既考虑了不同类的总体,同时,也考虑不同总体出现的先验概率和错分类造成的损失,提出用损失函数 ( Loss of function ) 度量损失。

线性分类器

设输入向量为 x\mathbf{x},权向量 w\mathbf{w},令f(x)=wTxf(\mathbf{x}) = \mathbf{w}^{T} \mathbf{x},根据函数 f(x)f(\mathbf{x}) 的值决定 x\mathbf{x} 的分类结果,称f(x)f(\mathbf{x}) 为线性分类器 ( Linear classifier )。其中,权向量w\mathbf{w} 通过对已知类标签的训练样本学习得到。最简单的线性分类器应用于两类的分类问题。给定一个输入向量x\mathbf{x},若 f(x)≥0f(\mathbf{x})\ge 0,则将 x\mathbf{x} 分类 C1\mathcal{C}_1,否则,分到类 C2\mathcal{C}_2。

分类算法

常见的分类算法有:

  • 基于实例的方法

    • k-近邻
  • 基于概率的方法

    • Naive Bayes 分类器

    • Logistic 回归

  • 线性模型

    • 支持向量机
  • 决策模型

    • 决策树
    • 随机森林

K -近邻

K-近邻( k-nearest neighbors / knn )是一类基于实例 ( instance-based ) 的非参数学习算法。在这里,输入是由数据集里的 k 个最近的训练实例组成,输出是一个类成员。一个新对象的分类原则是,它被分到离它最近的 k 个邻居中的多数所在的那个类中。特别地,k = 1 时,该对象被分到离它最近的邻居所在的类中。通常,可以赋邻居权值表示邻居对分类的贡献。例如,可以取对象到每个邻居的距离的倒数作为它的权值。knn 算法的缺点是,它对数据的局部结构敏感,容易过度拟合数据。

K-近邻分类器

设一个分类问题,类集 V={C1,C2,…,Cs}V = \{\mathcal{C}_1, \mathcal{C}_2, \dots, \mathcal{C}_s\}。 待分类的观测点(x,y)(x,y),x∈Rdx\in\mathcal{R}^d,yy 是观测 xx 的类标签,y∈Vy\in V 未知。设已知类标签的训练样本 {(xi,yi)∈Rd×V,i=1,2,…,n}\{ (x_i, y_i)\in\mathcal{R}^d\times V,i=1,2,\dots,n\}。定义 Rd\mathcal{R}^d 上的距离测度:

对于连续变量,一般采用欧氏距离。对于离散变量,例如,文本分类问题,可以采用重叠度量( overlap metric );在基因表达微阵列数据分析中,也可以用 PearsonSpearman 相关系数。

计算训练样本与 xx 的距离,按距离的升序排序训练样本为 (x(i),y(i)),i=1,2,…,n(x_{(i)}, y_{(i)}), \,i=1,2,\dots,n,此时,||x(1)−x||≤⋯≤||x(n)−x||||x_{(1)}-x||\le \dots \le ||x_{(n)}-x||. 那么,xx的类标签

y=argmaxv∈V∑i=1kδ(v,y(i))

y = \mathop{\arg\max}_{v\in V} \sum\limits_{i=1}^k \delta (v, y_{(i)})
这里,函数δ(a,b)=1\delta(a, b) = 1,当 a=ba=b 时;否则,δ(a,b)=0\delta(a, b) = 0. 此即,将 xx 分到离它最近的 k 个邻居里的大多数所在的类中。

下面举一个 k-NN 分类的简单例子,如图3所示。待分类的样本(绿圈)
要被分到蓝色方块类或红色三角类。如果 k=3k=3,绿圈将被分到蓝色方块类,因为离它最近的3个邻居里,有两个在方块类;如果 k=5k=5,同样的道理,绿圈将被分到三角类。

k-NN 是依据服从“大多数”的分类原则,这样容易引起过度拟合数据的问题。克服过度拟合的常见方法是,根据 k 个近邻与观测点的距离,赋给更近的邻居以更大的权值,彰显它们对分类的贡献。通常,权值取距离的倒数,ωi=1/d2(x,x(i)),i=1,2,…,k\omega_i = 1 / d^2 (x, x_{(i)}),\,i=1,2,\dots,k, 然后再归一化。此时,分类为

y=argmaxv∈V∑i=1kωiδ(v,y(i))

y = \mathop{\arg\max}_{v\in V} \sum\limits_{i=1}^k \omega_i \delta (v, y_{(i)})

参数 k 的选择

k 的选择依赖于数据。通常,选择较大的k,能够减少分类的噪声水平,但使分类的边界更模糊,这样会影响处于边界的样本的分类准确性。为了选择最优的k,可以使用验证数据的办法。首先,将数据分成独立的训练集和验证集两部分。然后,在训练集上,用不同的k值训练 k-NN 分类器;在验证集上,检验不同的 k 的分类效果,选择最佳的k

k-NN 对于输入特征的值域比较敏感,如果引入无关的特征甚至会大大降低分类准确性。可行的校正办法是,将数据归一化到[0, 1]或[-1, 1]的区间内;或者,标准化数据 x←x−μ^σ^x \leftarrow \dfrac{x-\hat{\mu}}{\hat{\sigma}},其中,μ^,σ^\hat{\mu},\,\hat{\sigma} 分别是样本均值和样本标准差。

对于两类的分类问题,最好取k 为奇数,因为如果k 为偶数,可能 k 个近邻里处于两类的邻居数都是 k/2 ,这种相等的情况称为“结”(tie )。这种情况下,可以采用 bootstrap 重抽样的办法选择经验最优的 k

数据试验

我们在著名的鸢尾花 ( Iris flower )数据集( 也称 Fisher’s Iris 数据集,或 Anderson’s Iris 数据集 )作 knn 分类。该数据集测量了鸢尾花的三个品种,Iris setosa, versicolor, and virginica,每个品种的萼片(sepals )长度和宽度、花瓣(petals )的长度和宽度 (单位:厘米) ,这些数据量化三个鸢尾花品种在形态上的差异。

鸢尾花数据集包括三个品种各50个样本,共150个样本;5个特征,即,Sepal length, Sepal width, Petal legth, Petal width and Species 的测量值。在 Rdatasets 包中分别以数据框 iris 和数组iris3 表示。下面显示数据框 iris 的前6行。

head(iris)

现在,将数组 iris3 每个品种的前25个样本组成训练集,后25个样本组成检验集,在训练集上构建 k-NN 分类器,在检验集上检验分类效果。这是一个有监督学习,使用 Rclass 的函数 knn 完成。

# 加载包class
library(class)
# 去掉变量Species
iris_data <- iris[, -5]
# 标准化变量(列)
iris_data <- scale(iris_data)
# 提取三个品种的前25个样本组成训练集
train <- iris_data[c(1:25, 51:75, 101:125),]
train_labels <- iris[c(1:25, 51:75, 101:125), 5]
# 提取三个品种的后25个样本组成检验集
test <- iris_data[c(26:50, 76:100, 126:150),]
test_labels <-iris[c(26:50, 76:100, 126:150), 5]
# 在训练集上建立knn分类器,在检验集上预测分类结果
pre_result <- knn(train, test, train_labels, k = 3, prob=TRUE)

最后,将预测结果和检验标签作比较。

table(pre_result, test_labels)

应用机器学习(二):k-NN 分类器相关推荐

  1. python分类器分5类_Python机器学习之K近邻分类器

    KNN 现在,如果我们有一个分类任务.需要用到scikit-learn库的分类器对象. 分类器要完成的任务是,给定一种鸢尾花卉的测量数据,为这种花卉分类.最简单的分类器是近邻分类器.近邻算法搜索训练集 ...

  2. 机器学习 —— 基础整理(三)生成式模型的非参数方法: Parzen窗估计、k近邻估计;k近邻分类器...

    本文简述了以下内容: (一)生成式模型的非参数方法 (二)Parzen窗估计 (三)k近邻估计 (四)k近邻分类器(k-nearest neighbor,kNN) (一)非参数方法(Non-param ...

  3. 【火炉炼AI】机器学习008-简单线性分类器解决二分类问题

    [火炉炼AI]机器学习008-简单线性分类器解决二分类问题 (本文所使用的Python库和版本号: Python 3.5, Numpy 1.14, scikit-learn 0.19, matplot ...

  4. 图片分类-K近邻分类器

    你可以注意到当我们做预测的时候,如果仅仅用最近的图片的是远远不够的.其实,我们更常用的是k近邻分类器.这个思想非常简单.代替寻找训练集中最近的图片,我们会寻找k个最相近的图片,并且让他们再测试图片上投 ...

  5. 机器学习之k近邻算法

    本文的代码基于书本<机器学习实战> 概念 k-近邻算法采用测量不同特征值之间距离的方法进行分类.工作原理是:存在一个样本数据集合,称作训练样本集,样本中每个数据都存在标签.输入没有标签的新 ...

  6. 机器学习:k邻近算法(KNN)

    title: 机器学习:k邻近算法(KNN) date: 2019-11-16 20:20:41 mathjax: true categories: 机器学习 tags: 机器学习 什么是K邻近算法? ...

  7. # cs231n (二)线性分类器

    cs231n (二)线性分类器 标签(空格分隔): 神经网络 文章目录 cs231n (二)线性分类器 0.回顾 1.线性分类 从图像到标签分值的参数化映射 理解线性分类器 损失函数 2.支持向量机( ...

  8. 3、k - 最近邻分类器及使用验证集取得超参数

    3.k - 最近邻分类器 注意到了吗,前面我们做一个预测时,只使用最近的图像的标签.事实上,通过使用所谓的k-最近邻分类器可以做得更好.这个想法很简单:在训练集中,不是找到最接近的一个图像,而是找到最 ...

  9. K近邻分类器(李飞飞CS231n学习笔记---lecture2:K最近邻算法)

    在讲解K近邻分类器之前,我们先来看一下最近邻分类器(Nearest Neighbor Classifier),它也是K = 1时的K近邻分类器. 目录 最近邻分类器 定义 存在问题 K近邻分类器(KN ...

  10. 百面机器学习—7.K均值算法、EM算法与高斯混合模型要点总结

    文章目录 一.总结K均值算法步骤 二.如何合理选择K值? 三.K均值算法的优缺点是什么? 四.如何对K均值算法进行调优? 五.EM算法解决什么问题? 六.EM算法流程是什么? 六.EM算法能保证收敛嘛 ...

最新文章

  1. ethereumjs/ethereumjs-util
  2. Spark Streaming实时计算框架介绍
  3. boost asio 应用方法学(二)——深入框架
  4. padding和卷积的区别_池化、池化与卷积异同、zero-padding
  5. python编辑器背景设置为黑色_GitHub 热榜:21 岁理工男开源的这个编辑器火了!...
  6. CSDN粉丝解答:六月份第二期精选——简单bug处理、资料索取、编程系统设计等
  7. git的使用1[转]
  8. python123读取文本文件并排序输出_Python按字段对文本文件排序
  9. hdoj 1247 Hat’s Words(字典树)
  10. ES与传统数据库的比较
  11. mysql select in 排序_MySQL数据库之Mysql select in 按id排序实现方法
  12. smart210 资源
  13. vscode更换字体
  14. 史上最全网易云音乐的API接口
  15. Alpha通道及合成运算
  16. 两台计算机如何连接一个网络打印机共享,打印机怎么连接2台电脑?两台或多台电脑连接共享打印机操作方法...
  17. python制作猜拳游戏代码_用python制作猜拳小游戏
  18. 【BZOJ2037】Sue的小球(动态规划)
  19. ios 静态库合成_手把手教你制作.a静态库(iOS开发)
  20. 艰酸的试用期转正申请报告

热门文章

  1. 个人.NET ORM全攻略,提供最新版本下载
  2. 面试官是如何看程序员的简历
  3. 基础网络函数介绍及其Cpp实例(C++)
  4. C语言关于一个作用域内的局部变量反复申请同一个栈区内存空间的事儿
  5. HDOJ--2087--剪花布条(BF算法和KMP算法都能使用)
  6. 公众号笔记: 2018年12月
  7. Ubuntu16.04下 编译安装 Tensorflow
  8. 猫头鹰的深夜翻译:JAVA中异常处理的最佳实践
  9. Android N代码暗示隐藏的“多窗口”模式
  10. 或许是 Nginx 上配置 HTTP2 最实在的教程了