K-近邻(K-Nearest Neighbors, KNN)是一种很好理解的分类算法,简单说来就是从训练样本中找出K个与其最相近的样本,然后看这K个样本中哪个类别的样本多,则待判定的值(或说抽样)就属于这个类别。

KNN算法的步骤

  • 计算已知类别数据集中每个点与当前点的距离;
  • 选取与当前点距离最小的K个点;
  • 统计前K个点中每个类别的样本出现的频率;
  • 返回前K个点出现频率最高的类别作为当前点的预测分类。

OpenCV中使用CvKNearest

OpenCV中实现CvKNearest类可以实现简单的KNN训练和预测。
[cpp] view plaincopy
  1. int main()
  2. {
  3. float labels[10] = {0,0,0,0,0,1,1,1,1,1};
  4. Mat labelsMat(10, 1, CV_32FC1, labels);
  5. cout<<labelsMat<<endl;
  6. float trainingData[10][2];
  7. srand(time(0));
  8. for(int i=0;i<5;i++){
  9. trainingData[i][0] = rand()%255+1;
  10. trainingData[i][1] = rand()%255+1;
  11. trainingData[i+5][0] = rand()%255+255;
  12. trainingData[i+5][1] = rand()%255+255;
  13. }
  14. Mat trainingDataMat(10, 2, CV_32FC1, trainingData);
  15. cout<<trainingDataMat<<endl;
  16. CvKNearest knn;
  17. knn.train(trainingDataMat,labelsMat,Mat(), false, 2 );
  18. // Data for visual representation
  19. int width = 512, height = 512;
  20. Mat image = Mat::zeros(height, width, CV_8UC3);
  21. Vec3b green(0,255,0), blue (255,0,0);
  22. for (int i = 0; i < image.rows; ++i){
  23. for (int j = 0; j < image.cols; ++j){
  24. const Mat sampleMat = (Mat_<float>(1,2) << i,j);
  25. Mat response;
  26. float result = knn.find_nearest(sampleMat,1);
  27. if (result !=0){
  28. image.at<Vec3b>(j, i)  = green;
  29. }
  30. else
  31. image.at<Vec3b>(j, i)  = blue;
  32. }
  33. }
  34. // Show the training data
  35. for(int i=0;i<5;i++){
  36. circle( image, Point(trainingData[i][0],  trainingData[i][1]),
  37. 5, Scalar(  0,   0,   0), -1, 8);
  38. circle( image, Point(trainingData[i+5][0],  trainingData[i+5][1]),
  39. 5, Scalar(255, 255, 255), -1, 8);
  40. }
  41. imshow("KNN Simple Example", image); // show it to the user
  42. waitKey(10000);
  43. }

使用的是之前BP神经网络中的例子,分类结果如下:

预测函数find_nearest()除了输入sample参数外还有些其他的参数:
[cpp] view plaincopy
  1. float CvKNearest::find_nearest(const Mat& samples, int k, Mat* results=0,
  2. const float** neighbors=0, Mat* neighborResponses=0, Mat* dist=0 )

即,samples为样本数*特征数的浮点矩阵;K为寻找最近点的个数;results与预测结果;neibhbors为k*样本数的指针数组(输入为const,实在不知为何如此设计);neighborResponse为样本数*k的每个样本K个近邻的输出值;dist为样本数*k的每个样本K个近邻的距离。

K-近邻分类算法KNN相关推荐

  1. 机器学习——K近邻分类算法及python代码实现

    <机器学习:公式推导与代码实践>鲁伟著读书笔记. K近邻(K-nearest neighbor,K-NN)算法是一种经典的监督学习的分类方法.K近邻算法是依据新样本与k个与其相邻最近的样本 ...

  2. 机器学习100天(三十):030 K近邻分类算法-K值的选择

    机器学习100天,今天讲的是:K近邻分类算法-K值的选择. <机器学习100天>完整目录:目录 上一节我们讲了 K 折交叉验证的理论,下面我们将 K 折交叉验证算法应用到 K 近邻分类算法 ...

  3. K近邻分类算法实战教程

    K近邻(K-Nearest Neighbor ,简称KNN ) 是有监督非线性.非参数分类算法,非参数表示对数据集及其分布没有任何假设.它是最简单.最常用的分类算法之一,广泛应用于金融.医疗等领域. ...

  4. knn算法python代码_K-最近邻分类算法(KNN)及python实现

    一.引入 问题:确定绿色圆是属于红色三角形.还是蓝色正方形? KNN的思想: 从上图中我们可以看到,图中的数据集是良好的数据,即都打好了label,一类是蓝色的正方形,一类是红色的三角形,那个绿色的圆 ...

  5. Python KNN K近邻分类

    Python KNN K近邻分类 1 声明 本文的数据来自网络,部分代码也有所参照,这里做了注释和延伸,旨在技术交流,如有冒犯之处请联系博主及时处理. 2 KNN简介 相关概念见下: 对于给定的观测来 ...

  6. K近邻模型、KNN算法1-构建预测模型

    K近邻模型.KNN算法1-构建预测模型 案例 假设你已经清洗好了一份同类型的商品信息和价格数据,如果给一个同品类全新的商品,你如何给它定价或预测它的价格? 比如,这个商品是红酒.你已经获取到了一批红酒 ...

  7. python 机器学习——K 近邻分类理论及鸢尾( Iris )数据集实例操作

    K 近邻分类理论及鸢尾( Iris )数据集实例操作 一.K 近邻分类理论 二.K 近邻分类实例操作 (1)导入数据 划分训练集测试集 (3)数据标准化 (4)用 K 近邻法建立模型 (5)性能评估 ...

  8. 分类算法matlab实例,数据挖掘之分类算法---knn算法(有matlab例子)

    knn算法(k-Nearest Neighbor algorithm).是一种经典的分类算法.注意,不是聚类算法.所以这种分类算法 必然包括了训练过程. 然而和一般性的分类算法不同,knn算法是一种懒 ...

  9. 机器学习理论梳理2 : KNN K近邻分类模型

    本文主要梳理KNN,K近邻模型的基本原理. 从机器学习的大分类来看,K近邻模型属于监督学习中的一种判别式模型,常用于分类问题.初始的数据集中,包含了已经分类标签好的数据.一句话来说,K近邻模型就是通过 ...

  10. K近邻法算法(KNN)及其R实现

    1. K近邻算法 输入:训练数据集 T={(x1,y1),(x2,y2),⋯,(xN,yN)} T=\{(x_1,y_1),(x_2,y_2),\cdots,(x_N,y_N)\} 其中, xi∈χ⊆ ...

最新文章

  1. SMS系列之六:利用SMS实现操作系统的补丁分发
  2. 共享可写节包含重定位_艾瑞咨询:2020年数说双11电商购物节报告
  3. asp.net甘特图控件exG2antt介绍及免费下载
  4. 知识图谱常用指标:MRR、Hits@1、Hits@10、MR
  5. 8万行的insert数据,Ctrl+c、Ctrl+v后心态崩了(如何在Linux下对MySQL数据库执行sql文件)...
  6. 数据结构笔记(九)-- 单链队列
  7. python之os.path.join
  8. 运动目标跟踪(十六)--OAB,SemiT,BSBT跟踪
  9. MongoDB是我想要的存储么?
  10. java socket 读不到数据_Java Socket通信以及可能出现的问题解决
  11. vb.net 教程 11-1 打印组件 5 PrintPreviewDialog
  12. Fatal error: Class 'GearmanClient' not found解决方法
  13. centos 安装 libiconv
  14. java使用163邮箱完成发送邮件完成注册
  15. echarts中使用饼状图显示百分比
  16. 2021年MEMS传感器产业链变化与趋势
  17. iOS 上传ipa包成功找不到ITMS-90338: Non-public API usage
  18. phantompdf 下载_英雄联盟手游详细下载方法,附中文翻译!
  19. 在zabbix中使用使用pg_monz模板日常监控postgresql发生sh: psql: command not found错误
  20. 【科普】关于操作系统(桌面操作系统/服务器操作系统/嵌入式/移动设备操作系统)基础概念

热门文章

  1. Android FrameWork学习(二)Android系统源码调试
  2. 给技术人上的管理课:平衡和集中
  3. POJ 1321 棋盘问题 题解
  4. 利用深度学习的点云语义分割(一)
  5. Asp.net MVC中Html.Partial, RenderPartial, Action,RenderAction 区别和用法【转发】
  6. 获取RadioButton选中的值
  7. 加强路由器的安全访问控制
  8. 使用brew安装Logstash(Mac)
  9. 脑动力:C语言函数速查效率手册(附DVD光盘1张) [平
  10. Windows下Git上传项目代码记录