KNN算法要消除的为主难点是K值选取,总体来说KNN算法是相持相比较不难驾驭的算法

第①先介绍一下knn的基本原理:

      K近邻算法,即K-Nearest Neighbor
algorithm,简称KNN算法,可以简简单单的敞亮为由那离本身近日的K个点来投票决定待分类数据归为哪种。这么些算法是机械学习在那之中贰个相比较经典的算法,
总体来说KNN算法是相持比较不难精晓的算法。个中的K表示最相仿自个儿的K个数据样本。KNN算法和K-Means算法分歧的是,K-Means算法用来聚类,用来判断什么东西是1个比较相近的体系,而KNN算法是用来做归类的,也正是说,有多个样本空间里的样书分成多少个门类,然后,给定三个待分类的数据,通过计算接近本人多年来的K个样本来判断那个待分类数据属于哪个分类。

KNN是透过总括分歧特征值之间的偏离举行归类。

目录:

总体的笔触是:假使一个样本在特点空间中的k个最相似(即特征空间中最贴近)的样书中的超越二分之一属于某2个种类,则该样本也属于这几个类型。

  • 算法概述
  • 办事规律
  • K值的挑三拣四
  • 归一化处理
  • knn R示例
  • 臆度车型代码

K平时是不超越20的整数。KNN算法中,所选拔的邻居都是已经正确分类的目的。该方式在定类决策上只依照最贴近的三个或许多少个样本的类型来决定待分样本所属的项目。

算法概述

KNN算法要缓解的焦点难题是K值选用,它会一向影响分类结果。


比方选取较大的K值,就一定于用较大领域中的磨练实例进行预测,其优点是能够减少学习的推断误差,但缺点是学习的接近误差会附加。

 

如若选拔较小的K值,就也等于用较小的小圈子中的磨炼实例进行前瞻,“学习”近似误差会减小,唯有与输入实例较近或貌似的教练实例才会对预测结果起成效,与此同时带来的题材是“学习”的揣度误差会附加,换句话说,K值的滑坡就代表整人体模型型变得复杂,容易生出过拟合;

  •   
    图片 1
  • 如上海教室所示,有两类不一致的样本数量,分别用浅豆沙色的小长方形和紫藤色的小三角形表示,而图正中间的百般普鲁士蓝的圆所标示的数据则是待分类的数量。也等于说,以后,大家不精通中间这个暗黑的数目是从属于哪个种类(铅色小星型or暗黄小三角形),大家将要化解这些难题:给这几个铁黄的圆分类
  • 从上图中,你仍可以够看到:如若K=3,海蓝圆点的近年的叁个街坊是三个紫水晶色小三角形和3个灰湖绿小星型,少数从属于多数,基于总计的方法,判定铁蓝的那个待分类点属于蓝灰的三角一类。

  • 假诺K=5,铅灰圆点的近年的七个邻居是1个深绿三角形和3个蓝绿的正方形,照旧少数从属于多数,基于计算的艺术,判定蓝绿的这些待分类点属于紫蓝的正方形一类

  • 于此大家看到,当不或者断定当前待分类点是从属于已知分类中的哪类时,大家能够依据计算学的答辩看它所处的岗位特征,测量它周围邻居的权重,而把它归为(或分配)到权重更大的那一类。那便是K近邻算法的核情绪想

上面是knn的TensorFlow落成进度,代码来源于GitHub,稍作修改:

行事原理

import numpy as np
import tensorflow as tf

#这里使用TensorFlow自带的数据集作为测试,以下是导入数据集代码 
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("/tmp/data/", one_hot=True)

Xtrain, Ytrain = mnist.train.next_batch(5000)  #从数据集中选取5000个样本作为训练集
Xtest, Ytest = mnist.test.next_batch(200)    #从数据集中选取200个样本作为测试集


# 输入占位符
xtr = tf.placeholder("float", [None, 784])
xte = tf.placeholder("float", [784])


# 计算L1距离
distance = tf.reduce_sum(tf.abs(tf.add(xtr, tf.negative(xte))), reduction_indices=1)
# 获取最小距离的索引
pred = tf.arg_min(distance, 0)

#分类精确度
accuracy = 0.

# 初始化变量
init = tf.global_variables_initializer()

# 运行会话,训练模型
with tf.Session() as sess:

    # 运行初始化
    sess.run(init)

    # 遍历测试数据
    for i in range(len(Xtest)):
        # 获取当前样本的最近邻索引
        nn_index = sess.run(pred, feed_dict={xtr: Xtrain, xte: Xtest[i, :]})   #向占位符传入训练数据
        # 最近邻分类标签与真实标签比较
        print("Test", i, "Prediction:", np.argmax(Ytr[nn_index]), \
            "True Class:", np.argmax(Ytest[i]))
        # 计算精确度
        if np.argmax(Ytrain[nn_index]) == np.argmax(Ytest[i]):
            accuracy += 1./len(Xtest)

    print("Done!")
    print("Accuracy:", accuracy)

如上正是行使TensorFlow完结knn的过程。

  • 我们清楚样本集中每二个数量与所属分类的相应关系,输入没有标签的新数据后,将新数据与磨练集的数据对应特征实行相比,找出“距离”最近的k数据,选取这k个数据中冒出最多的归类作为新数据的分类。
  • 算法描述

题外话:
tensorflow的完全进度是先规划总计图,然后运营会话,执行总括图的经过,整个经过的数码可知性比较差。
如上精确度的一个钱打二15个结以及实际标签和展望标签的可比结实其实使用numpy和python的变量。
组成TensorFlow的优点和Python的特色才能更好的为实际解决难题服务。

    1. 测算已知多少集中的点与当下点的偏离
    2. 按距离递增次序排序
    3. 慎选与当下数据点距离方今的K个点
    4. 鲜明前K个点所在种类出现的成效
    5. 回来频率最高的类型作为当前项目标预测
  • 相距计算格局有”euclidean”(欧氏距离),”minkowski”(明科夫斯基距离),
    “maximum”(切比雪夫距离),
    “manhattan”(相对值距离),”canberra”(兰式距离), 或
    “minkowski”(马氏距离)等
  • knn算法中判断两条记下的相似度的选取的是欧式距离
  • 算法缺点:
    1. k值须求事先设定,而无法自适应
    2. 样本不平衡时,如2个类的样本体量十分大,而别的类样本容积很时辰,有大概引致当输入1个新样本时,该样本的K个邻居中山大学容量类的样本占多数

K值的采取


  • 除开如何定义邻居的题材之外,还有三个取舍多少个街坊,即K值定义为多大的标题。不要小看了这么些K值选用难题,因为它对K近邻算法的结果会爆发首要影响。
  • 假设选取较小的K值,就也便是用较小的天地中的演习实例举办展望,“学习”近似误差会减小,只有与输入实例较近或相似的教练实例才会对预测结果起功效,与此同时带来的标题是“学习”的猜想误差会增大,换句话说,K值的收缩就表示整人体模型型变得复杂,不难发生过拟合;
  • 倘使选拔较大的K值,就一定于用较大领域中的演习实例举行前瞻,其优点是足以减去学习的估摸误差,但缺点是读书的接近误差会增大。那时候,与输入实例较远(不一般的)操练实例也会对预测器成效,使预测爆发错误,且K值的叠加就象征全体的模型变得简单。
  • 在其实使用中,K值一般取贰个相比小的数值,例如利用接力验证法(简单的话,正是一有的样本做磨练集,一部分做测试集)来选用最优的K值。
  • 诚如的话,k的取值最好是数据集的条数开药方,并且最好取奇数,​上边示例中iris是150条数据,所以那边k值选13。

归一化处理


  • 多少标准(归一化)处理是数额挖掘的一项基础工作,分裂评价指标往往拥有不一致的量纲和量纲单位,那样的图景会影响到多少解析的结果,为了祛除目标之内的量纲影响,要求拓展数量标准处理,以消除数量指标之内的可比性。原始数据透过多少标准处理后,各目的处于同一数量级,适合举行总结相比评价。以下是二种常用的归一化方法:
  • min-max标准化(Min-Max
    Normalization):
    也称为离差标准化,是对本来数据的线性别变化换,使结果值映射到[0 –
    1]里面。转换函数如下:
    1. 图片 2
    2. 在那之中max为模本数量的最大值,min为样本数量的细微值。那种艺术有个毛病正是当有新数据出席时,恐怕造成max和min的更动,要求再度定义。
  • Z-score标准化方法:
    那种方法予以原始数据的均值(mean)和标准差(standard
    deviation)进行数量的口径。经过处理的多少符合标准正态分布,即均值为0,标准差为1,转化函数为:
    1. 图片 3
    2. 其中图片 4为具备样本数量的均值,图片 5为有着样本数量的标准差。

R示例


  • 凯雷德完毕时,可挑选class包,也可选择kknn包举行测算
  • 以iris为例示例代码如下:
    图片 6图片 7

    #---------------------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])
    
View Code

因此可知车型代码


  • 完全代码如下:

    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])

  • 结果如下:
  • 图片 8
  • 图形分布
  • 图片 9