KNN算法要缓解之核心问题是K值选择。通过测算接近自己近年来之K个样本来判断是需要分类数据属于哪个分类。

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

      K近邻算法,即K-Nearest Neighbor
algorithm,简称KNN算法,可以简单的理解吧由那去自己近来的K个点来投票决定待分类数据由为哪一样近似。这个算法是机上其中一个较经典的算法,
总体来说KNN算法是相对比好了解的算法。其中的K表示最接近自己的K个数据样本。KNN算法和K-Means算法不同之是,K-Means算法用来聚类,用来判断什么东西是一个比较像样之项目,而KNN算法是用来举行归类的,也就是说,有一个样本空间里的样书分成几单种类,然后,给得一个内需分类的数目,通过计算接近自己近年来底K个样本来判断是得分类数据属于哪个分类。

KNN是通过测算不同特征值之间的离开进行归类。

目录:

完整的笔触是:如果一个样本在特点空间受到的k个最相似(即特征空间中极度贴近)的样本中之绝大多数属有一个门类,则该样本也属是路。

  • 算法概述
  • 做事规律
  • K值的挑
  • 由一化处理
  • knn R示例
  • 测算车型代码

K通常是不超出20底平头。KNN算法中,所选取的邻居还是曾经不错分类的靶子。该方式在定类决策及就因最靠近的一个或几独样本的品种来控制用分样本所属的色。

算法概述

KNN算法要缓解的骨干问题是K值选择,它会一直影响分类结果。


假设选择比较充分的K值,就一定给用比较充分领域受到的教练实例进行预测,其长是好抽学习的估价误差,但缺点是习之好像误差会附加。

 

要选择比较小的K值,就一定给用比较小的领域中的训练实例进行展望,“学习”近似误差会减多少,只有与输入实例较近或相似之训实例才见面对预测结果于作用,与此同时带来的题材是“学习”的量误差会叠加,换句话说,K值的抽就代表整体模型变得复杂,容易发生了拟合;

  •   
    图片 1
  • 假如齐图所示,有有限类似不同的样书数量,分别就此蓝色之略微刚好方形和红的小三角形表示,而贪图正中间的慌绿色的圆所标示的数量虽然是得分类的数。也就是说,现在,我们不知底中间深绿色的数码是于属于哪一样类(蓝色小正方形or红色小三角形),我们且解决者问题:给此绿色的完美分类
  • 打上图被,你还能收看:如果K=3,绿色圆点的近期底3个街坊是2单革命小三角形和1单蓝色小正方形,少数自属于多数,基于统计的法,判定绿色的斯得分类点属于红色的三角形一近似。

  • 假若K=5,绿色圆点的近期之5个街坊是2单红三角形和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个数据被出现极端多之分类作为新数据的归类。
  • 算法描述

    1. 计算都知道多少汇总之触发以及时触及的离开
    2. 以离递增次序排序
    3. 选择和当前数据点距离最近之K个点
    4. 确定前K个点所在类别出现的频率
    5. 返回频率最高的色作为当前种的展望
  • 去计算方式来”euclidean”(欧氏距离),”minkowski”(明科夫斯基距离),
    “maximum”(切比雪夫距离),
    “manhattan”(绝对值距离),”canberra”(兰式距离), 或
    “minkowski”(马氏距离)等

  • knn算法中判断两修记下之相似度的运用的是欧式距离
  • 算法缺点:

    1. k值需要事先设定,而不克起适应
    2. 样本不抵时,如一个近似的样本容量很特别,而另外类样本容量很小时,有或致当输入一个新样本时,该样本之K个邻居吃生容量类的范本占大部分

题外话:
tensorflow的完整过程是先行筹计算图,然后运行会话,执行计算图的历程,整个经过的数可见性比较不同。
如上精确度的计量和实际标签以及预测标签的较结实其实用numpy和python的变量。
重组TensorFlow的助益和Python的特征才能够再好的呢现实解决问题服务。

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示例


  • 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

 

相关文章