机器学习分类算法之k-近邻算法

来源:互联网 发布:aes加密java代码 编辑:程序博客网 时间:2024/06/11 18:35

最近碰到一个用户场景:公安局每天会接受一堆的案件资料,其中包括电话报案、到局中录下的口供等等,这些资料数据会根据其属于治安类的妨碍公共秩序,还是抢劫等被分配到不同的警务工作人员手中。再有,就是过往案情可能被存放在一个盘里,每次翻看时都需要全盘搜索。如果这些数据一来或者已经处理到不同类型的治安类事件里,那么又会省下一大把的时间和人力了。

办案人员基于经验和知识会判定出案情描述的是归属于哪一类,那么对于机器,它是怎样区分盗窃罪、故意伤害罪等不同类型的罪行的呢?我们从一个比较直观简单的角度去思考,盗窃罪一般描述中会出现偷盗类的字眼,而故意伤害罪描述中一般会出现伤害、打、伤之类的词。那么这些词就可以作为不同案情描述的特征(或属性),当然,每种类型的案情的特征不止这些触发词。

以上带来的问题是机器学习中的经典算法问题——分类。分类的算法有很多,可能能解决同样的问题,基于以上,本文以K-近邻算法构造程序,自动划分案情到不同的罪行下。

k-近邻算法

K最近邻(k-Nearest Neighbor,KNN)分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一。它既可以处理分类问题,也可以处理回归问题,而且它的执行效果非常好。

k-近邻算法特点是完全跟着数据走,没有数学模型可言。

它的工作原理:存在一个样本数据集合,也称作训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据与所属分类的对应关系。输入没有标签的新数据后,将新数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本集中特征最相似数据(最近邻)的分类标签。一般来说,我们只选择样本数据集中前K个最相似的数据,这就是k-近邻算法中k的出处,通常k是不大于20的整数。最后,选择k个最相似数据中出现次数最大的分类,最为新数据的分类。

【百度百科】k-近邻算法原理:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。


在k近邻算法中,当训练集、最近邻值k、距离度量、决策规则等确定下来时,整个算法实际上是利用训练集把特征空间划分成一个个子空间,训练集中的每个样本占据一部分空间。对最近邻而言,当测试样本落在某个训练样本的领域内,就把测试样本标记为这一类。 

通过一个简单的例子说明一下:如下图,绿色圆要被决定赋予哪个类,是红色三角形还是蓝色四方形?如果K=3,由于红色三角形所占比例为2/3,绿色圆将被赋予红色三角形那个类,如果K=5,由于蓝色四方形比例为3/5,因此绿色圆被赋予蓝色四方形类。

由此也说明了KNN算法的结果很大程度取决于K的选择。


下面我们给出KNN算法的原理

在训练样本集中,每个样本都是一个具有n个特征属性的向量,即x = (x1,x2,…,xn),因此可以认为每个样本在n维特征空间,或度量空间内分布。每个样本还有一个唯一属于它的标签y,机器学习的目的就是找到这样的一个函数f,使y=f(x),这样当有一个新的样本u时,我们就可以通过该目标函数确定它的标签。

既然样本可以被认为是在度量空间内分布,那么我们就可以用距离测度来衡量它们的相似程度。常用的距离测度包括欧氏距离和曼哈顿距离,以及更一般的明氏距离,以下3个式子分别给出了测试样本u和训练样本x的这三种距离公式:

上述三个距离测度只适用于特征属性是连续变量的情况,当特征属性是离散变量时,如对文本进行分类,我们就需要用汉明距离:

KNN的任务就是在训练样本集中,依据距离测度找到与测试样本u最相似的那K个训练样本x。对于分类问题,我们采用“多数表决”的方式来确定u的最终分类,即这K个训练样本中,哪个分类的样本数多,u就属于哪个分类。而对于回归问题,u的预测值v为:

对于KNN来说,有一个最重要的参数需要事先确定,那就是K值。选择不同的K值,最终的预测结果可能会不同。K值选取的过小,会引入误差,而K值过大,虽然更准确,但会使在特征空间内明确的边界变得模糊。因此K值既要足够的大,以保证预测结果的正确性,又要足够的小,以使K个训练样本与测试样本具有一定的相似性。目前选择K值比较常用的方法是交叉验证方法(cross-validation)。

另一个需要讨论的问题是,在前面的计算中,我们认为这K个与测试样本距离最相似的训练样本对测试样本具有相同的影响,也就是我们并没有考虑训练样本与测试样本之间距离大小的影响。对于这个问题,我们可以使用距离权值来解决,即让距离更小的样本具有更大的权值。K个最邻近样本中第i个样本xi与测试样本u的权值可以定义为:

式中,D(xi,u)表示式1~式4中的任一距离。对于回归问题,最终的预测结果v为:

而对于分类问题,最终的分类结果为权值最大的那个类。

k-近邻算法的一般流程

1、收集数据:可以使用任何方法;

2、准备数据:距离计算所需要的数值,最好是结构化的数据格式。

3、分析数据:可以使用任何方法。

4、训练算法:此步骤不适用于k-近邻算法。

5、测试算法:计算错误率。

6、使用算法:首先需要输入样本数据和结构化的输出结果,然后运行k-近邻算法判定输入数据分别属于哪个分类,最后应用对计算出分类执行后续的处理。


优点

精度高,对异常值不敏感,无数据输入假定;

缺点

计算复杂度高、空间复杂度高;


使用数据范围:数值型和标称型。

适用情景:需要一个特别容易解释的模型的时候。

遇到问题就解决问题,寻找出口,远比停在原地跺脚更管用。

谢谢您的关注和支持,欢迎转发分享


原创粉丝点击