KNN算法很简单,大致的工作原理是:给定训练数据样本和标签,对于某测试的一个样本数据,选择距离其最近的k个训练样本,这k个训练样本中所属类别最多的类即为该测试样本的预测标签。简称kNN。通常k是不大于20的整数,这里的距离一般是欧式距离。

对于上边的问题,①计算测试样本与训练样本的距离,②选择与其最近的k个样本,③排序,选择k个样本所属类别最多作为预测标签

KNN问题的python实现代码

  1. import numpy as np
  2. import operator
  3. import matplotlib.pyplot as plt
  4.  
  5. def createDataSet():
  6. group = np.array([[1.0, 0.9], [1.0, 1.0], [0.1, 0.2], [0.0, 0.1]])
  7. lables=['A','A','B','B']
  8. return group,lables
  9.  
  10. def classify1(inX,dataSet,labels,k):
  11. #距离计算
  12. dataSetSize =dataSet.shape[0]#得到数组的行数。即知道有几个训练数据
  13. diffMat=np.tile(inX,(dataSetSize,1))-dataSet #tile:numpy中的函数。tile将原来的一个数组,扩充成了4个一样的数组。diffMat得到了目标与训练数值之间的差值。
  14. sqDiffMat=diffMat**2 #各个元素分别平方
  15. sqlDistances=sqDiffMat.sum(axis=1) #对应列相乘,即得到了每一个距离的平方
  16. distances=sqlDistances**0.5 #开方,得到距离。 #[ 1.3453624 1.41421356 0.2236068 0.1 ]
  17. sortedDistIndicies=distances.argsort() #升序排列 y=array([])将x中的元素从小到大排列,提取其对应的index(索引),然后输出到y [3 2 0 1]
  18. #选择距离最小的k个点
  19. classCount={}
  20. for i in range(k):
  21. voteIlabel=labels[sortedDistIndicies[i]]
  22. classCount[voteIlabel]=classCount.get(voteIlabel,0)+1 #get():该方法是访问字典项的方法,即访问下标键为numOflabel的项,如果没有这一项,那么初始值为0。然后把这一项的值加1。#{'B': 2, 'A': 1}
  23. #排序
  24. sortedClassCount=sorted(classCount.items(),key=operator.itemgetter(1),reverse=True) #operator模块提供的itemgetter函数用于获取对象的哪些维的数据 #[('B', 2), ('A', 1)]
  25. """
  26. operator模块提供的itemgetter函数用于获取对象的哪些维的数据,参数为一些序号(即需要获取的数据在对象中的序号),下面看例子。
  27. a = [1,2,3]
  28. >>> b=operator.itemgetter(1) //定义函数b,获取对象的第1个域的值
  29. >>> b(a)
  30. 2
  31. >>> b=operator.itemgetter(1,0) //定义函数b,获取对象的第1个域和第0个的值
  32. >>> b(a)
  33. (2, 1)
  34. 要注意,operator.itemgetter函数获取的不是值,而是定义了一个函数,通过该函数作用到对象上才能获取值。
  35. """
  36. return sortedClassCount[0][0]

对于上边方法的测试:

  1. >>> group,lables=createDataSet()
  2. >>> classify1([0,0],group,lables,3)

通过上边的结果得到了结果:B

上边全部过程是使用KNN算法的最基本的也是最核心的部分。

下边用来解决实际问题。

问题描述:


如果想要使用KNN算法,首先需要处理海伦收集到的数据,把收集到的数据转化为分类器可以接受的形式:

  1. def file2matrix(filename):
  2. fr = open(filename)
  3. numberOfLines = len(fr.readlines()) #get the number of lines in the file
  4. returnMat = np.zeros((numberOfLines,3)) #prepare matrix to return
  5. classLabelVector = [] #prepare labels return
  6. fr = open(filename)
  7. index = 0
  8. for line in fr.readlines():
  9. line = line.strip()
  10. listFromLine = line.split('\t')
  11. returnMat[index,:] = listFromLine[0:3]
  12. classLabelVector.append(int(listFromLine[-1]))
  13. index += 1
  14. return returnMat,classLabelVector

通过上边的过程已经把数据格式化为KNN分类器需要的形式,但是,自己查看数据,以一行数据为例,数据的内容是:

通过观察,可以得到,不同特征值的数据的数量级是不一样的,如果这个时候直接使用KNN中的计算距离的方法,则容易造成数据倾斜,因此增加了一个归一化的过程,归一化的公式为:

min,max分别是某一个特征的最大数值和最小数值,通过上边的过程,数据被归一化为一个0-1之间的数值,归一化的pyhton实现源码是:

  1. #[ 1.44880000e+04 7.15346900e+00 1.67390400e+00]数据的中有的特别大有的特别小,在之后的计算数据的时候大的数据会影响很大,因此需要归一化
  2. def autoNorm(dataSet):
  3. minVals = dataSet.min(0) #min() 方法返回给定参数的最小值,参数可以为序列,即在这个题目中返回每列数据的最小值
  4. maxVals = dataSet.max(0)
  5. ranges = maxVals - minVals #差值
  6. normDataSet = np.zeros(np.shape(dataSet))
  7. m = dataSet.shape[0]
  8. normDataSet = dataSet - np.tile(minVals, (m,1))
  9. normDataSet = normDataSet/np.tile(ranges, (m,1)) #element wise divide
  10. return normDataSet, ranges, minVals

至此,数据处理阶段已经全部完成,而接下来的工作就是使用KNN算法进行预测,并估计算法的准确度

  1. def datingClassTest():
  2. hoRatio = 0.10 #hold out 10%
  3. datingDataMat,datingLabels = file2matrix('datingTestSet2.txt') #load data setfrom file
  4. normMat, ranges, minVals = autoNorm(datingDataMat)
  5. m = normMat.shape[0]#得到数组的行数。即知道有几个训练数据
  6. numTestVecs = int(m*hoRatio) #哪些用来当测试集哪些用来当训练集
  7. errorCount = 0.0
  8. for i in range(numTestVecs):
  9. classifierResult = classify1(normMat[i,:],normMat[numTestVecs:m,:],datingLabels[numTestVecs:m],3) #第一个参数树测试集,第二个参数是训练集,第三个参数是类标签,第四个参数是k
  10. print("the classifier came back with: %d, the real answer is: %d" % (classifierResult, datingLabels[i]))
  11. if (classifierResult != datingLabels[i]): errorCount += 1.0
  12. print("the total error rate is: %f" % (errorCount/float(numTestVecs)))
  13. print(errorCount)

在上边的过程中,把数据集分为训练集和测试集,验证测试集中的每一条数据的测试结果和真实结果的差别。并验证测试数据的准确度。

输入某人的信息,预测出对方的喜欢程度

  1. #输入某人的信息,便得出对对方喜欢程度的预测值
  2. def classifyPerson():
  3. resultList = ['not at all', 'in small doses', 'in large doses']
  4. percentTats = float(np.raw_input("percentage of time spent playing video games?"))
  5. ffMiles = float(np.raw_input("frequent flier miles earned per year?"))
  6. iceCream = float(np.raw_input("liters of ice cream consumed per year?"))
  7. datingDataMat, datingLabels = file2matrix('datingTestSet2.txt')
  8. normMat, ranges, minVals = autoNorm(datingDataMat)
  9. inArr = np.array([ffMiles, percentTats, iceCream])
  10. classifierResult = classify1((inArr - minVals)/ranges, normMat, datingLabels,3)
  11. print('You will probably like this person: ', resultList[classifierResult - 1])

KNN 实战的更多相关文章

  1. 机器学习实战__KNN1

    KNN的算法工作原理: 存在一个训练样本集合,样本集中每个数据都有确定的标签(分类),即我们知道样本集中每一数据与所属分类的对应关系.输人没有标签的新数据后,将新数据的每个特征与样本集中数据对应的特征 ...

  2. 机器学习实战_KNN(一)

    [是什么] KNN 即 k_近邻算法(k- nearest neighbor) ,就是寻找K个邻居作为该样本的特征,近朱者赤,近墨者黑,你的邻居是什么特征,那么就认为你也具备该特征:核心公式为: 数据 ...

  3. 深入浅出KNN算法

    概述 K最近邻(kNN,k-NearestNeighbor)分类算法 所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表. kNN算法的核心思想是如果一个样本在特征 ...

  4. 【机器学*】k-*邻算法(kNN) 学*笔记

    [机器学*]k-*邻算法(kNN) 学*笔记 标签(空格分隔): 机器学* kNN简介 kNN算法是做分类问题的.思想如下: KNN算法的思想总结一下:就是在训练集中数据和标签已知的情况下,输入测试数 ...

  5. 机器学习【一】K最近邻算法

    K最近邻算法 KNN 基本原理 离哪个类近,就属于该类   [例如:与下方新元素距离最近的三个点中,2个深色,所以新元素分类为深色] K的含义就是最近邻的个数.在sklearn中,KNN的K值是通过n ...

  6. 机器学习实战笔记(Python实现)-01-K近邻算法(KNN)

    --------------------------------------------------------------------------------------- 本系列文章为<机器 ...

  7. 算法代码[置顶] 机器学习实战之KNN算法详解

    改章节笔者在深圳喝咖啡的时候突然想到的...之前就有想写几篇关于算法代码的文章,所以回家到以后就奋笔疾书的写出来发表了 前一段时间介绍了Kmeans聚类,而KNN这个算法刚好是聚类以后经常使用的匹配技 ...

  8. 机器学习实战 之 KNN算法

    现在 机器学习 这么火,小编也忍不住想学习一把.注意,小编是零基础哦. 所以,第一步,推荐买一本机器学习的书,我选的是Peter harrigton 的<机器学习实战>.这本书是基于pyt ...

  9. 基于kNN的手写字体识别——《机器学习实战》笔记

    看完一节<机器学习实战>,算是踏入ML的大门了吧!这里就详细讲一下一个demo:使用kNN算法实现手写字体的简单识别 kNN 先简单介绍一下kNN,就是所谓的K-近邻算法: [作用原理]: ...

随机推荐

  1. Vue 学习笔记之 —— 组件(踩了个坑)

    最近在学习vue,学习组件时,遇到了一个问题,困扰了半个多小时.. <!DOCTYPE html> <html lang="en"> <head> ...

  2. 【node】---token的原理及使用---【alley】

    一.登陆的验证流程 当用户请求登录的时候,如果没有问题,我们在服务端生成一条记录,这个记录里可以说明一下登录的用户是谁,然后把这条记录的 ID 号发送给客户端,客户端收到以后把这个 ID 号存储在 C ...

  3. sip会话流程以及sip介绍(3)

    1.mtk_ims_mo_sip报文交互流程 log: 步骤1:ATD触发MO呼叫尝试步骤2:VDM选择ADS到IMS.步骤3:触发VoLTE UA来设置MO调用.步骤4:SIP信息到P-CSCF进行 ...

  4. RMQ 模板题 poj 3264

    题目:点这里 题意:给一个长度n的数列,然后又Q个询问,问L   到R   中最大值与最小值的差. 分析:RMQ 的模板题. 代码: #include<stdio.h> #include& ...

  5. WAMP中的mysql设置密码(默认密码为空)及phpmyadmin的配置

    来自:  http://wenku.baidu.com/link?url=J4K28e1kt-_ykJLsOtS1b5T6hKj5IzL5hXSKIiB133AvPCUXLlxGKScsBsxi0mA ...

  6. Nginx负载均衡与转发

    1.6种负载均衡策略 1.轮询 :默认方式 2.weight : 权重方式 3.ip_hash :依据ip分配方式 4.least_conn :最少连接方式 5.fair(第三方) :响应时间方式 6 ...

  7. 目录文件的操作函数 mkdir ,opendir,readdir,closedir

    1.  int mkdir(const char *pathname, mode_t mode);   头文件 :<sys/stat.h>  <sys/types.h> 功能: ...

  8. mongo 分片集群的搭建

    MongoDB版本当前使用的MongoDB版本为4.2.0,下载地址.https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.2. ...

  9. springmvc Cacheable

    直接上代码: <cache:annotation-driven /> <bean id="cacheManager" class="org.spring ...

  10. quartz的使用(二.基本过程)

    1.关于各个要素的创建,SchedulerFactoryBean,CronTriggerFactoryBean及JobDetailFactoryBean全部实现spring中的FactoryBean& ...