1.算法讲解

KNN算法是一个最基本、最简单的有监督算法,基本思路就是给定一个样本,先通过距离计算,得到这个样本最近的topK个样本,然后根据这topK个样本的标签,投票决定给定样本的标签;

训练过程:只需要加载训练数据;

测试过程:通过之前加载的训练数据,计算测试数据集中各个样本的标签,从而完成测试数据集的标注;

2.代码

具体代码如下:

  1. #!/usr/bin/env/ python
  2. # -*- coding: utf-8 -*-
  3. import csv
  4. import random
  5. from matplotlib import pyplot as plt
  6. import numpy as np
  7. from sklearn.decomposition import PCA
  8. class KNN(object):
  9. def __init__(self):
  10. self._trainData = None
  11. self._trainDataLabel = None
  12. # 计算距离
  13. def _computerDist(self,testData):
  14. m = testData.shape[0]
  15. n = self._trainData.shape[0]
  16. dist = np.zeros((m,n))
  17. for i in range(m):
  18. for j in range(n):
  19. dist[i][j] = np.sum( (testData[i,:] - self._trainData[j,:])**2 )
  20. return dist
  21. # 模型训练,knn只需要加载训练数据集
  22. def train(self,dataset):
  23. self._trainData = dataset[:,0:-1]
  24. self._trainDataLabel = np.array(dataset[:,-1],dtype = np.int)
  25. # 预测测试数据集
  26. def predict(self,testData,topK = 3):
  27. dist = self._computerDist(testData)
  28. num_test = testData.shape[0]
  29. predLable = np.zeros(num_test)
  30. for i in range(num_test):
  31. labelList = []
  32. # 得到前topK样本的索引
  33. idxList = np.argsort(dist[i,:])[:topK].tolist()
  34. # 根据这些索引,得到对应的标签
  35. labelList = self._trainDataLabel[idxList]
  36. # 统计各个标签数目
  37. counts = np.bincount(labelList)
  38. # 将标签数目最大的标签值作为样本的标签
  39. predLable[i] = np.argmax(counts)
  40. return predLable
  41. # 测试准确率
  42. def test(self,testData,testLabel,topK = 3):
  43. predLabel = self.predict(testData,topK)
  44. predLabel = np.array(predLabel,dtype = int)
  45. num_correct = np.sum(predLabel == testLabel)
  46. num_test = testLabel.shape[0]
  47. accuracy = float(num_correct) / num_test
  48. print "testLabel:" + str(testLabel)
  49. print "predLabel:" + str(predLabel)
  50. print "get: %d / % d => accuracy: %f" %(num_correct,num_test,accuracy)
  51. return predLabel
  52. # 画出结果图
  53. def plotResult(self,testData,predLable):
  54. X = self._trainData
  55. y = self._trainDataLabel
  56. pca = PCA(n_components=2)
  57. X_r = pca.fit(X).transform(X)
  58. test_r = pca.fit(testData).transform(testData)
  59. plt.figure()
  60. for c, i in zip("rgb", [0, 1, 2]):
  61. plt.scatter(X_r[y == i, 0], X_r[y == i, 1], c=c)
  62. plt.scatter(test_r[predLable == i,0],test_r[predLable == i,1],s= 30,c = c,marker = 'D')
  63. plt.legend()
  64. plt.title('KNN of IRIS dataset')
  65. plt.show()
  66. # 加载数据集
  67. def loadDataSet(self,fileName,splitRatio = 0.9):
  68. lines = csv.reader(open(fileName,"rb") )
  69. dataset = list(lines)
  70. for i in range(len(dataset)):
  71. dataset[i] = [float(x) for x in dataset[i]]
  72. trainSize = int(len(dataset) * splitRatio)
  73. random.shuffle(dataset)
  74. trainData = np.array(dataset[:trainSize])
  75. testData = np.array(dataset[trainSize:])
  76. return trainData,testData
  77. if __name__ == "__main__":
  78. fileName = 'iris.csv'
  79. KNNobj = KNN()
  80. trainData,testData = KNNobj.loadDataSet(fileName,0.8)
  81. # 抽取出测试数据
  82. testdata = testData[:,0:-1]
  83. # 抽取出测试标签数据
  84. testdataLabel = np.array(testData[:,-1],dtype = int)
  85. # 训练模型
  86. KNNobj.train(trainData)
  87. # 测试模型
  88. predLabel = KNNobj.test(testdata,testdataLabel,3)
  89. # 画出结果分布
  90. KNNobj.plotResult(testdata,predLabel)

3.结果分析

本实例中,训练数据样本量为120个,测试数据样本量为30个,topK=3;

运行结果如下:

  1. get: 29 / 30 => accuracy: 0.966667

结果分布图如下所示:

其中圆心点为训练数据,菱形点为测试数据;不同颜色代表不同的类;

4.参考链接

Comparison of LDA and PCA 2D projection of Iris dataset

KNN算法的更多相关文章

  1. 【Machine Learning】KNN算法虹膜图片识别

    K-近邻算法虹膜图片识别实战 作者:白宁超 2017年1月3日18:26:33 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现的深入理解.本系列文章是作者结 ...

  2. kNN算法python实现和简单数字识别

    kNN算法 算法优缺点: 优点:精度高.对异常值不敏感.无输入数据假定 缺点:时间复杂度和空间复杂度都很高 适用数据范围:数值型和标称型 算法的思路: KNN算法(全称K最近邻算法),算法的思想很简单 ...

  3. 什么是 kNN 算法?

    学习 machine learning 的最低要求是什么?  我发觉要求可以很低,甚至初中程度已经可以.  首先要学习一点 Python 编程,譬如这两本小孩子用的书:[1][2]便可.   数学方面 ...

  4. 数据挖掘之KNN算法(C#实现)

    在十大经典数据挖掘算法中,KNN算法算得上是最为简单的一种.该算法是一种惰性学习法(lazy learner),与决策树.朴素贝叶斯这些急切学习法(eager learner)有所区别.惰性学习法仅仅 ...

  5. 机器学习笔记--KNN算法2-实战部分

    本文申明:本系列的所有实验数据都是来自[美]Peter Harrington 写的<Machine Learning in Action>这本书,侵删. 一案例导入:玛利亚小姐最近寂寞了, ...

  6. 机器学习笔记--KNN算法1

    前言 Hello ,everyone. 我是小花.大四毕业,留在学校有点事情,就在这里和大家吹吹我们的狐朋狗友算法---KNN算法,为什么叫狐朋狗友算法呢,在这里我先卖个关子,且听我慢慢道来. 一 K ...

  7. 学习OpenCV——KNN算法

    转自:http://blog.csdn.net/lyflower/article/details/1728642 文本分类中KNN算法,该方法的思路非常简单直观:如果一个样本在特征空间中的k个最相似( ...

  8. KNN算法与Kd树

    最近邻法和k-近邻法 下面图片中只有三种豆,有三个豆是未知的种类,如何判定他们的种类? 提供一种思路,即:未知的豆离哪种豆最近就认为未知豆和该豆是同一种类.由此,我们引出最近邻算法的定义:为了判定未知 ...

  9. Python 手写数字识别-knn算法应用

    在上一篇博文中,我们对KNN算法思想及流程有了初步的了解,KNN是采用测量不同特征值之间的距离方法进行分类,也就是说对于每个样本数据,需要和训练集中的所有数据进行欧氏距离计算.这里简述KNN算法的特点 ...

随机推荐

  1. Android 照相 滤镜

    android-image-filter 19种相片滤镜,使用也简单,all filters in file BitmapFilter.java : Bitmap newBitmap = Bitmap ...

  2. 51Nod 1010 只包含因子2 3 5的数 Label:None

    K的因子中只包含2 3 5.满足条件的前10个数是:2,3,4,5,6,8,9,10,12,15. 所有这样的K组成了一个序列S,现在给出一个数n,求S中 >= 给定数的最小的数. 例如:n = ...

  3. cookie的基本用法案例

    注:cookie必须在服务器环境下有效. 步骤讲解: 1,引入cookie文件: 2,设置过期时间: var date = new Date(); date.setTime(date.getTime( ...

  4. Selenium_等待页面加载完毕

    隐式等待 WebDriver driver = new FirefoxDriver(); driver.get("www.baidu.com"); driver.manage(). ...

  5. Ubuntu install codeblocks by ppa

    sudo add-apt-repository ppa:damien-moore/codeblocks-stable sudo apt-get update sudo apt-get install ...

  6. 关于textarea中换行、回车、空格的识别与处理

    需求:在textarea中输入文字,提交给后台后,后台输出在另一个页面,文字按原格式显示.   问题:如何还原输入框中的换行和空格? 兼容性:IE9以上.FF.chrome在换行处匹配/\n/     ...

  7. LINUX下编译安装PHP各种报错大集合

    本文为大家整理汇总了一些linux下编译安装php各种报错大集合 ,感兴趣的同学参考下. nginx1.6.2-mysql5.5.32二进制,php安装报错解决: 123456 [root@clien ...

  8. ubuntu14.04 安装 hadoop2.4.0

    转载:ubuntu搭建hadoop-Ver2.6.0完全分布式环境笔记 自己在搭建hadoop平台时,碰到一些困难,按照该博文解决了问题,转载一下,作为记录. 2 先决条件 确保在你集群中的每个节点上 ...

  9. centos6字符

    [root@back_zabbix_100 ~]# echo $LANGen_US.UTF-8[root@back_zabbix_100 ~]# cat /etc/sysconfig/i18n LAN ...

  10. tab+tab

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...