热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

KNN(一)--简单KNN原理及实现

原文:http:blog.csdn.netdamotianshengarticledetails406284171.Knn算法介绍:百度百科:http:baike.b

原文:

http://blog.csdn.net/damotiansheng/article/details/40628417

1. Knn算法介绍:

        百度百科:http://baike.baidu.com/view/1485833.htm?from_id=3479559&type=syn&fromtitle=knn&fr=aladdin,其内容如下:

邻近算法,或者说K最近邻(kNN,k-NearestNeighbor)分类算法可以说是整个数据挖掘分类技术中最简单的方法了。所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用她最接近的k个邻居来代表。 kNN算法的核心思想是如果一个样本在特征空间中的k个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性。该方法在确定分类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。  右图中,绿色圆要被决定赋予哪个类,是红色三角形还是蓝色四方形?如果K=3,由于红色三角形所占比例为2/3,绿色圆将被赋予红色三角形那个类,如果K=5,由于蓝色四方形比例为3/5,因此绿色圆被赋予蓝色四方形类。

KNN算法的决策过程

K最近邻(k-Nearest Neighbor,KNN)分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一。该方法的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。KNN算法中,所选择的邻居都是已经正确分类的对象。该方法在定类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。 KNN方法虽然从原理上也依赖于极限定理,但在类别决策时,只与极少量的相邻样本有关。由于KNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,KNN方法较其他方法更为适合。KNN算法不仅可以用于分类,还可以用于回归。通过找出一个样本的k个最近邻居,将这些邻居的属性的平均值赋给该样本,就可以得到该样本的属性。更有用的方法是将不同距离的邻居对该样本产生的影响给予不同的权值(weight),如权值与距离成反比。
#include "ml.h"
#include "highgui.h"

int main(int argc, char** argv)

{
const int K = 10;

int i, j, k, accuracy;

float response;

int train_sample_count = 100;

CvRNG rng_state = cvRNG(-1);

CvMat* trainData = cvCreateMat(train_sample_count, 2, CV_32FC1);

CvMat* trainClasses = cvCreateMat(train_sample_count, 1, CV_32FC1);

IplImage* img = cvCreateImage(cvSize(500, 500), 8, 3);

float _sample[2];

CvMat sample = cvMat(1, 2, CV_32FC1, _sample);

cvZero(img);


CvMat trainData1, trainData2, trainClasses1, trainClasses2;



// form the training samples

cvGetRows(trainData, &trainData1, 0, train_sample_count / 2);

cvRandArr(&rng_state, &trainData1, CV_RAND_NORMAL, cvScalar(200, 200), cvScalar(50, 50));


cvGetRows(trainData, &trainData2, train_sample_count / 2, train_sample_count);

cvRandArr(&rng_state, &trainData2, CV_RAND_NORMAL, cvScalar(300, 300), cvScalar(50, 50));


cvGetRows(trainClasses, &trainClasses1, 0, train_sample_count / 2);

cvSet(&trainClasses1, cvScalar(1));


cvGetRows(trainClasses, &trainClasses2, train_sample_count / 2, train_sample_count);

cvSet(&trainClasses2, cvScalar(2));



// learn classifier
CvKNearest knn(trainData, trainClasses, 0, false, K);

CvMat* nearests = cvCreateMat(1, K, CV_32FC1);

for (i = 0; i height; i++)

{

for (j = 0; j width; j++)

{

sample.data.fl[0] = (float)j;

sample.data.fl[1] = (float)i;



// estimates the response and get the neighbors' labels

respOnse= knn.find_nearest(&sample, K, 0, 0, nearests, 0);



// compute the number of neighbors representing the majority

for (k = 0, accuracy = 0; k
{

if (nearests->data.fl[k] == response)

accuracy++;

}

// highlight the pixel depending on the accuracy (or confidence)

cvSet2D(img, i, j, respOnse== 1 ?

(accuracy > 5 ? CV_RGB(180, 0, 0) : CV_RGB(180, 120, 0)) :

(accuracy > 5 ? CV_RGB(0, 180, 0) : CV_RGB(120, 120, 0)));

}

}



// display the original training samples

for (i = 0; i
{

CvPoint pt;

pt.x = cvRound(trainData1.data.fl[i * 2]);

pt.y = cvRound(trainData1.data.fl[i * 2 + 1]);

cvCircle(img, pt, 2, CV_RGB(255, 0, 0), CV_FILLED);

pt.x = cvRound(trainData2.data.fl[i * 2]);

pt.y = cvRound(trainData2.data.fl[i * 2 + 1]);

cvCircle(img, pt, 2, CV_RGB(0, 255, 0), CV_FILLED);

}



cvNamedWindow("classifier result", 1);

cvShowImage("classifier result", img);

cvWaitKey(0);



cvReleaseMat(&trainClasses);

cvReleaseMat(&trainData);

return 0;

}


推荐阅读
  • 深入解析Android自定义View面试题
    本文探讨了Android Launcher开发中自定义View的重要性,并通过一道经典的面试题,帮助开发者更好地理解自定义View的实现细节。文章不仅涵盖了基础知识,还提供了实际操作建议。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • Android 渐变圆环加载控件实现
    本文介绍了如何在 Android 中创建一个自定义的渐变圆环加载控件,该控件已在多个知名应用中使用。我们将详细探讨其工作原理和实现方法。 ... [详细]
  • 本教程涵盖OpenGL基础操作及直线光栅化技术,包括点的绘制、简单图形绘制、直线绘制以及DDA和中点画线算法。通过逐步实践,帮助读者掌握OpenGL的基本使用方法。 ... [详细]
  • 本文介绍如何在 Android 中通过代码模拟用户的点击和滑动操作,包括参数说明、事件生成及处理逻辑。详细解析了视图(View)对象、坐标偏移量以及不同类型的滑动方式。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • Explore how Matterverse is redefining the metaverse experience, creating immersive and meaningful virtual environments that foster genuine connections and economic opportunities. ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 在金融和会计领域,准确无误地填写票据和结算凭证至关重要。这些文件不仅是支付结算和现金收付的重要依据,还直接关系到交易的安全性和准确性。本文介绍了一种使用C语言实现小写金额转换为大写金额的方法,确保数据的标准化和规范化。 ... [详细]
  • 本文探讨了如何在给定整数N的情况下,找到两个不同的整数a和b,使得它们的和最大,并且满足特定的数学条件。 ... [详细]
  • 机器学习中的相似度度量与模型优化
    本文探讨了机器学习中常见的相似度度量方法,包括余弦相似度、欧氏距离和马氏距离,并详细介绍了如何通过选择合适的模型复杂度和正则化来提高模型的泛化能力。此外,文章还涵盖了模型评估的各种方法和指标,以及不同分类器的工作原理和应用场景。 ... [详细]
  • Google最新推出的嵌入AI技术的便携式相机Clips现已上架,旨在通过人工智能技术自动捕捉用户生活中值得纪念的时刻,帮助人们减少照片数量过多的问题。 ... [详细]
author-avatar
可爱的伊比2324767445hMkK
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有