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. shell中${ } 的一些特异功能

    假设我们定义了一个变量为: file=/dir1/dir2/dir3/my.file.txt 我们可以用 ${ } 分别替换获得不同的值: ${file#*/}:拿掉第一条 / 及其左边的字符串:di ...

  2. compass reset和layout [Sass和compass学习笔记]

    reset 可以重置浏览器的的html的默认样式,因为各个浏览器对有些元素解析差别很大 通过重置样式可以让样式的浏览器兼容 更简单 使用方法简单 @import "compass/reset ...

  3. Salesforce注册开发者账号

    在对Salesforce进行了简单的了解之后,我们现在来注册Salesforce的开发者账号,开始Salesforce的学习 一.注册前的准备 首先点击网址:https://developer.sal ...

  4. mysql单列去重复group by分组取每组前几条记录加order by排序

    mysql分组取每组前几条记录(排名) 附group by与order by的研究,需要的朋友可以参考下 --按某一字段分组取最大(小)值所在行的数据 复制代码代码如下: /* 数据如下: name ...

  5. Android APK瘦身之Android Studio Lint (代码审查)

    ******** ******** 第一部分: 瘦身内容介绍 ******** ******** 项目新版本的迭代接近尾声, 因为历史累积问题, 导致有很多无效的资源让已经臃肿的APK变得更肿, 因此 ...

  6. *HDU 1115 计算几何

    Lifting the Stone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  7. android之volley学习

    Volley是android的平台通信库,一个新的网络通信框架.Volley 的特点:适合数据量小,通信频繁的网络操作. 获取Volley git 工具使用:git clone https://and ...

  8. CentOS6.4安装JDK1.7

    安装说明 1.安装环境: CentOS6.4 64位系统 2.安装方式:rpm安装 3.软 件 包:jdk-7u71-linux-x64.rpm 4.下载地址:http://www.oracle.co ...

  9. advstringgrid笔记

    一下操作是在advstringgrid7.4.6.3版本下有效,advstringgrid控件名设置为 zy 一.属性设置 1.修改单元格内的值:zy.cells[col,row]='value'; ...

  10. JAVA的continue用法

    JAVA的continue用法: public class test{ public static void main(String [] args){  for(int i=0;i<=10;i ...