ML(5):KNN算法

K近邻算法,即K-Nearest Neighbor algorithm,简称KNN算法,可以简单的理解为由那离自己最近的K个点来投票决定待分类数据归为哪一类。这个算法是机器学习里面一个比较经典的算法, 总体来说KNN算法是相对比较容易理解的算法。其中的K表示最接近自己的K个数据样本。KNN算法和K-Means算法不同的是,K-Means算法用来聚类,用来判断哪些东西是一个比较相近的类型,而KNN算法是用来做归类的,也就是说,有一个样本空间里的样本分成几个类型,然后,给定一个待分类的数据,通过计算接近自己最近的K个样本来判断这个待分类数据属于哪个分类。

目录:

  • 算法概述
  • 工作原理
  • K值的选择
  • 归一化处理
  • knn R示例
  • 推测车型代码

算法概述


  • 如上图所示,有两类不同的样本数据,分别用蓝色的小正方形和红色的小三角形表示,而图正中间的那个绿色的圆所标示的数据则是待分类的数据。也就是说,现在,我们不知道中间那个绿色的数据是从属于哪一类(蓝色小正方形or红色小三角形),我们就要解决这个问题:给这个绿色的圆分类
  • 从上图中,你还能看到:如果K=3,绿色圆点的最近的3个邻居是2个红色小三角形和1个蓝色小正方形,少数从属于多数,基于统计的方法,判定绿色的这个待分类点属于红色的三角形一类。
  • 如果K=5,绿色圆点的最近的5个邻居是2个红色三角形和3个蓝色的正方形,还是少数从属于多数,基于统计的方法,判定绿色的这个待分类点属于蓝色的正方形一类
  • 于此我们看到,当无法判定当前待分类点是从属于已知分类中的哪一类时,我们可以依据统计学的理论看它所处的位置特征,衡量它周围邻居的权重,而把它归为(或分配)到权重更大的那一类。这就是K近邻算法的核心思想

工作原理


  • 我们知道样本集中每一个数据与所属分类的对应关系,输入没有标签的新数据后,将新数据与训练集的数据对应特征进行比较,找出“距离”最近的k数据,选择这k个数据中出现最多的分类作为新数据的分类。
  • 算法描述
    1. 计算已知数据集中的点与当前点的距离
    2. 按距离递增次序排序
    3. 选取与当前数据点距离最近的K个点
    4. 确定前K个点所在类别出现的频率
    5. 返回频率最高的类别作为当前类别的预测
  • 距离计算方法有"euclidean"(欧氏距离),”minkowski”(明科夫斯基距离), "maximum"(切比雪夫距离), "manhattan"(绝对值距离),"canberra"(兰式距离), 或 "minkowski"(马氏距离)等
  • knn算法中判断两条记录的相似度的采用的是欧式距离
  • 算法缺点:
    1. k值需要预先设定,而不能自适应
    2. 样本不平衡时,如一个类的样本容量很大,而其他类样本容量很小时,有可能导致当输入一个新样本时,该样本的K个邻居中大容量类的样本占多数

K值的选择


  • 除了如何定义邻居的问题之外,还有一个选择多少个邻居,即K值定义为多大的问题。不要小看了这个K值选择问题,因为它对K近邻算法的结果会产生重大影响。
  • 如果选择较小的K值,就相当于用较小的领域中的训练实例进行预测,“学习”近似误差会减小,只有与输入实例较近或相似的训练实例才会对预测结果起作用,与此同时带来的问题是“学习”的估计误差会增大,换句话说,K值的减小就意味着整体模型变得复杂,容易发生过拟合;
  • 如果选择较大的K值,就相当于用较大领域中的训练实例进行预测,其优点是可以减少学习的估计误差,但缺点是学习的近似误差会增大。这时候,与输入实例较远(不相似的)训练实例也会对预测器作用,使预测发生错误,且K值的增大就意味着整体的模型变得简单。
  • 在实际应用中,K值一般取一个比较小的数值,例如采用交叉验证法(简单来说,就是一部分样本做训练集,一部分做测试集)来选择最优的K值。
  • 一般来说,k的取值最好是数据集的条数开方,并且最好取奇数,?下面示例中iris是150条数据,所以这里k值选13。

归一化处理


  • 数据标准化(归一化)处理是数据挖掘的一项基础工作,不同评价指标往往具有不同的量纲和量纲单位,这样的情况会影响到数据分析的结果,为了消除指标之间的量纲影响,需要进行数据标准化处理,以解决数据指标之间的可比性。原始数据经过数据标准化处理后,各指标处于同一数量级,适合进行综合对比评价。以下是两种常用的归一化方法:
  • min-max标准化(Min-Max Normalization):也称为离差标准化,是对原始数据的线性变换,使结果值映射到[0 - 1]之间。转换函数如下:
    1. 其中max为样本数据的最大值,min为样本数据的最小值。这种方法有个缺陷就是当有新数据加入时,可能导致max和min的变化,需要重新定义。
  • Z-score标准化方法: 这种方法给予原始数据的均值(mean)和标准差(standard deviation)进行数据的标准化。经过处理的数据符合标准正态分布,即均值为0,标准差为1,转化函数为:
    1. 其中为所有样本数据的均值,为所有样本数据的标准差。

R示例


  • R实现时,可选择class包,也可选择kknn包进行计算
  • 以iris为例示例代码如下:

    #---------------------R:KNN算法--------------------------------
    head(iris)
    a<-iris[-5] #将标记种类的列去掉
    head(a)
    a<-scale(a) #z-score标准化
    str(a)
    head(a)
    
    train<-a[c(1:25,50:75,100:125),] #训练集
    head(train)
    test<-a[c(26:49,76:99,126:150),]  #测试集
    
    #接下来需要把训练集和测试集的种类标记保存下来
    train_lab <-iris[c(1:25,50:75,100:125),5]
    test_lab <-iris[c(26:49,76:99,126:150),5]
    
    #KNN分类例子中在R中使用到的包有“class包”,“gmodels包”
    #install.packages("class")
    library(class)
    #接下来就可以调用knn函数进行模型的建立了
    ## 数据框,K个近邻投票,欧氏距离
    pre_result<-knn(train=train,test=test,cl=train_lab,k=13)
    table(pre_result,test_lab)
    
    #---------------------R:KKNN 包--------------------------------
    
    #install.packages("kknn")
    library(kknn)
    data("iris")
    dim(iris)
    m <-(dim(iris))[1]
    ind <- sample(2, m, replace=TRUE, prob=c(0.7, 0.3))
    iris.train <- iris[ind==1,]
    iris.test <- iris[ind==2,]
    
    #调用kknn  之前首先定义公式
    #myformula :Species ~ Sepal.Length + Sepal.Width + Petal.Length + Petal.Width
    iris.kknn<-kknn(Species~.,iris.train,iris.test,distance=1,kernel="triangular")
    summary(iris.kknn)
    
    # 获取fitted.values
    fit <- fitted(iris.kknn)
    
    # 建立表格检验判类准确性
    table(fit,iris.test$Species)
    
    # 绘画散点图,k-nearest neighbor用红色高亮显示
    pcol <- as.character(as.numeric(iris.test$Species))
    
    pairs(iris.test[1:4], pch = pcol, col = c("green3", "red")[(iris.test$Species != fit)+1])
    

推测车型代码


  • 完整代码如下:

    setwd("E:\\RML")
    cars <- read.csv("bus01.csv",header=TRUE,stringsAsFactors=TRUE)
    
    #
    library(kknn)
    m <-(dim(cars))[1]
    ind <- sample(2, m, replace=TRUE, prob=c(0.7, 0.3))
    car.train <- cars[ind==1,]
    car.test <- cars[ind==2,]
    
    #调用kknn  之前首先定义公式
    myformula <- Type ~ V + A + SOC + MinV + MaxV + MaxT + MinT
    car.kknn<-kknn(myformula,car.train,car.test,distance=1,kernel="triangular")
    
    # 获取car.values
    fit <- fitted(car.kknn)
    
    # 建立表格检验判类准确性
    table(fit,car.test$Type,dnn = c("predict","actual"))
    
    # 绘画散点图,k-nearest neighbor用红色高亮显示
    pcol <- as.character(as.numeric(car.test$Type))
    pairs(car.test[-8], pch = pcol, col = c("green3", "red")[(car.test$Type != fit)+1])
  • 结果如下:
  • 图形分布
时间: 2024-08-07 21:20:03

ML(5):KNN算法的相关文章

【machine learning】KNN算法

适逢学习机器学习基础知识,就将书中内容读读记记,本博文代码参考书本Machine Learning in Action(<机器学习实战>). 一.概述 kNN算法又称为k近邻分类(k-nearest neighbor classification)算法. kNN算法则是从训练集中找到和新数据最接近的k条记录,然后根据他们的主要分类来决定新数据的类别.该算法涉及3个主要因素:训练集.距离或相似的衡量.k的大小. 二.算法要点 1.指导思想 kNN算法的指导思想是"近朱者赤,近墨者黑&q

学习OpenCV——KNN算法

转自:http://blog.csdn.net/lyflower/article/details/1728642 文本分类中KNN算法,该方法的思路非常简单直观:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别.该方法在定类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别. KNN方法虽然从原理上也依赖于极限定理,但在类别决策时,只与极少量的相邻样本有关.因此,采用这种方法可以较好地避免样本的不平衡问题.另外,由于

KNN算法的Python实现

# KNN算法思路: #-----------------------------------------------------# #step1:读入数据,存储为链表 #step2:数据预处理,包括缺失值处理.归一化等 #step3:设置K值 #step4:计算待测样本与所有样本的距离(二值.序数.连续) #step5:投票决定待测样本的类别 #step6:利用测试集测试正确率 #-----------------------------------------------------# 注:

py4CV例子1猫狗大战和Knn算法

1.什么是猫狗大战: 数据集来源于Kaggle(一个为开发商和数据科学家提供举办机器学习竞赛.托管数据库.编写和分享代码的平台),原数据集有12500只猫和12500只狗,分为训练.测试两个部分. 2.什么是Knn算法: K最近邻(k-Nearest Neighbor,KNN)基本思想:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别. 如果用比较平实的话来说,就是"我们已经存在了一个带标签的数据库,现在输入没有标签的新数据后,将新

基于K-Nearest Neighbors[K-NN]算法的鸢尾花分类问题解决方案(For Python)

看了原理,总觉得需要用具体问题实现一下机器学习算法的模型,才算学习深刻.而写此博文的目的是,网上关于K-NN解决此问题的博文很多,但大都是调用Python高级库实现,尤其不利于初级学习者本人对模型的理解和工程实践能力的提升,也不利于Python初学者实现该模型. 本博文的特点: 一 全面性地总结K-NN模型的特征.用途 二  基于Python的内置模块,不调用任何第三方库实现 博文主要分为三部分: 基本模型(便于理清概念.回顾模型) 对待解决问题的重述 模型(算法)和评价(一来,以便了解模型特点

Machine Learning In Action 第二章学习笔记: kNN算法

本文主要记录<Machine Learning In Action>中第二章的内容.书中以两个具体实例来介绍kNN(k nearest neighbors),分别是: 约会对象预测 手写数字识别 通过“约会对象”功能,基本能够了解到kNN算法的工作原理.“手写数字识别”与“约会对象预测”使用完全一样的算法代码,仅仅是数据集有变化. 约会对象预测 1 约会对象预测功能需求 主人公“张三”喜欢结交新朋友.“系统A”上面注册了很多类似于“张三”的用户,大家都想结交心朋友.“张三”最开始通过自己筛选的

KNN算法--物以类聚,人以群分

KNN(K Nearest Neighbors,K近邻 )算法是机器学习所有算法中理论最简单,最好理解的.KNN是一种基于实例的学习,通过计算新数据与训练数据特征值之间的距离,然后选取K(K>=1)个距离最近的邻居进行分类判断(投票法)或者回归.如果K=1,那么新数据被简单分配给其近邻的类.KNN算法算是监督学习还是无监督学习呢?首先来看一下监督学习和无监督学习的定义.对于监督学习,数据都有明确的label(分类针对离散分布,回归针对连续分布),根据机器学习产生的模型可以将新数据分到一个明确的类

Python KNN算法

机器学习新手,接触的是<机器学习实战>这本书,感觉书中描述简单易懂,但对于python语言不熟悉的我,也有很大的空间.今天学习的是k-近邻算法. 1. 简述机器学习 在日常生活中,人们很难直接从原始数据本身获得所需信息.而机器学习就是把生活中无序的数据转换成有用的信息.例如,对于垃圾邮件的检测,侦测一个单词是否存在并没有多大的作用,然而当某几个特定单词同时出现时,再辅以考虑邮件的长度及其他因素,人们就可以更准确地判定该邮件是否为垃圾邮件. 机器学习分为监督学习和无监督学习,其中: (1)监督学

Opencv学习之路—Opencv下基于HOG特征的KNN算法分类训练

在计算机视觉研究当中,HOG算法和LBP算法算是基础算法,但是却十分重要.后期很多图像特征提取的算法都是基于HOG和LBP,所以了解和掌握HOG,是学习计算机视觉的前提和基础. HOG算法的原理很多资料都可以查到,简单来说,就是将图像分成一个cell,通过对每个cell的像素进行梯度处理,进而根据梯度方向和梯度幅度来得到cell的图像特征.随后,将每个cell的图像特征连接起来,得到一个BLock的特征,进而得到一张图片的特征.Opencv当中自带HOG算法,可以直接调用,进行图像的特征提取.但