k近邻算法_机器学习之K近邻分类算法的实现

K近邻算法(k-nearest neighbors, KNN)是最基本的机器学习算法之一。所谓的K,就是距离最近的K个邻居的意思。其实,KNN在我们平常的生活中也会不自主的应用,比如,俗语说的“人以类聚、物以群分”。KNN方法既可以做分类,也可以做回归,在这里我们重点关注分类算法。 a88543260a2662880de8e944e804e2fa.png01  KNN算法的核心思想 63f13751d2636b132b2d9c20e5619fd0.gif KNN算法的核心思想是,选取某未知样本周围距离最短的K个已知样本,根据一定的决策原则判断未知样本的类别(如少数服从多数)。举个例子,如图1所示,蓝方和红三角都是已知的类别,绿圆表示未知的样本。那么按照KNN算法的思想和少数服从多数的原则,当取最近邻点(即K=1)时,绿圆应为蓝方;当K=5时,绿圆应为红三角。

由上述可知,KNN由三个基本要素决定:距离度量、K值选择和决策原则。决策原则通常用的多数表决法,所以真正关注的是距离度量和K值选择。这种计算方法没有涉及归纳和演绎过程,无需参数估计,因此又被称之为“懒惰算法”。

14fbad3015f80bb6cffcd4932cf349da.png

图1 KNN分类算法示意图

02  距离度量 63f13751d2636b132b2d9c20e5619fd0.gif 在计算样本之间的距离时,最常用的是闵可夫斯基距离,其公式表达如下:

6cb323f9be4c346b0913e1168c1cd7d8.png

其中,p是一个可变参数,当p=1时,即为曼哈顿距离(如图2红、蓝、黄线所示);当p=2时,即为欧式距离(如图2绿线所示)。欧式距离表达2个样本的直线距离,更是经常作为衡量距离的指标。

6e7a3a53ff3415011588f452e698b9b2.png

图2 曼哈顿距离和欧式距离

03 K值的选择 63f13751d2636b132b2d9c20e5619fd0.gif 对于k值的选择,没有一个固定的经验,一般根据样本的分布进行初步确定(取训练样本数的平方根),再通过交叉验证选择一个合适的k值。K值选取过小,相当于用较小邻域中的训练实例进行预测,噪音数据或异常值会过度影响测试数据的分类,极端情况是K=1;K值选取过大,相当于用较大邻域中的训练实例进行预测,与输入实例较远的训练实例也会对预测起作用,极端情况是K=n。 04 案例分析 63f13751d2636b132b2d9c20e5619fd0.gif 62200d0a8c7f0493c2bb60b0c704be9d.png

(1)收集数据

本文以KNN算法筛检脊椎病变患者为案例。脊椎病变相关的数据来源于机器学习知识库(UC Irvine Machine Learning Repository),该数据集为真实公开的非人造数据。该数据集记录了病人的骨盆和形状位置特征,均为连续型变量。因变量为分类变量,用于甄别病人正常与不正常(Normal &Abnormal)。数据集说明如表1所示。 表1 数据集变量名解释

特征/标签名

说明

pelvic incidence

骨盆投射角

pelvic tilt

骨盆倾斜

lumbar lordosis angle

腰椎前凸角度

sacral slope

骶骨倾斜

pelvic radius

骨盆半径

grade of spondylolisthesis

品位滑脱

class

分类标签,分为正常与不正常

(Normal   &Abnormal)

62200d0a8c7f0493c2bb60b0c704be9d.png

(2)探索和准备数据

A.查看数据结构和分类情况。代码和初步结果如下:

f4864bf71e0572e8ea928ea0be1c2736.png

B. 将数据打散,进行随机排序,并查看特征详细情况。可以发现,不同特征之间测量尺度不同,可能会潜在地导致分类出错。因此,需要将特征数据进行标准化处理。代码和初步结果如下:

6470a67c1b47b4614fffcb4cef48a180.png

C.数据标准化处理。数据标准化处理的方法有很多种,在这里我们使用“最大-最小标化法”,使标化后的数据落在0-1之间。代码和初步结果如下:

961e51f940dca6c9b9151e4b018fa274.png

2d1c27220a35649d7878969406d7d0bf.png

D. 创建训练数据和测试数据。将数据划分为训练数据集和测试数据集,通常的比例为7:3。在B步骤,我们已经将数据随机打散,因此我们将前210个作为训练集,后100个作为测试集。代码如下:

2449fbce6f534ed9d2566b152d194aad.png

62200d0a8c7f0493c2bb60b0c704be9d.png

(3)基于训练集数据集训练模型

R语言中实现KNN算法的函数包有很多,在这里我们使用class包中的knn函数,其介绍如图3所示。训练集的样本数为210,我们取15作为初始K值(≈210的平方根)。

2a51b7e4a985147c6d4432c5bbea7a61.png

图3 class包knn函数介绍

7ffdff7ca70fec4a4c2102ef5adf5b34.png

62200d0a8c7f0493c2bb60b0c704be9d.png (4)评价模型性能 评价模型性能是评估测试数据中预测的分类与实际分类的匹配程度。这个过程可以通过gmodels::CrossTable函数实现。

e443e8289a5c0a2eb49a221a5382e613.png

a7a6b31a5b6ff627a02de6f48024ce20.png

我们发现,经训练建立的KNN算法,可正确预测测试集(100个样本)中的81个样本,准确率为81%。 62200d0a8c7f0493c2bb60b0c704be9d.png

(5)算法优化和提升

我们可以通过改变K值,根据准确率选择合适的K值。由表2可知,当k=20时,该算法识别的准确率最高。

表2 不同K值下的脊椎病变患者筛检准确率

K值

真阳性数量

真阴性数量

准确率

1

61

24

85%

5

58

20

78%

10

56

20

76%

12

61

21

82%

15

60

21

81%

17

62

22

84%

20

63

23

86%

25

63

19

82%

30

62

19

81%

05

总结

63f13751d2636b132b2d9c20e5619fd0.gif

KNN算法作为一种最简单的机器学习算法,具有思路简单、易于理解、易于实现、无需估计参数、无需训练、对数据分布没有要求等优点,适用于类域的交叉或重叠较多的待分样本。当然,不可避免的也存在缺点,如计算量大、内存要求高等,最大的问题在于当已知样本分类极度不平衡时,出现差错的可能性较大,需要采用权值加以改进。

数据库链接:

http://archive.ics.uci.edu/ml/datasets/Vertebral+Column

制作:胡建雄、周燕

初审:何冠豪

审核:肖建鹏、刘涛

指导:马文军

1d31008ee1dadc5b694e865ce684bf58.gif

关于我们

《数据分析和应用》致力于为全国各地公共卫生与医学工作者(机构)提供专业可靠的统计咨询、研究设计、数据分析、高通量测序数据和序列分析、调研报告等服务(详细可见公众号菜单栏),欢迎有需要的人员和机构与我们联系。 622fd55e9b884bf9f85a61d097edcf86.gif 0f5b63bae74fdb2d6e1dfc80a3acc3fd.png

邮箱:statisic@gdiph.org.cn         

微信号:gdiph-stat

-欢迎扫码关注-
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值