热门标签 | 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;

}


推荐阅读
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 毕业设计:基于机器学习与深度学习的垃圾邮件(短信)分类算法实现
    本文详细介绍了如何使用机器学习和深度学习技术对垃圾邮件和短信进行分类。内容涵盖从数据集介绍、预处理、特征提取到模型训练与评估的完整流程,并提供了具体的代码示例和实验结果。 ... [详细]
  • Coursera ML 机器学习
    2019独角兽企业重金招聘Python工程师标准线性回归算法计算过程CostFunction梯度下降算法多变量回归![选择特征](https:static.oschina.n ... [详细]
  • 深入解析Android自定义View面试题
    本文探讨了Android Launcher开发中自定义View的重要性,并通过一道经典的面试题,帮助开发者更好地理解自定义View的实现细节。文章不仅涵盖了基础知识,还提供了实际操作建议。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 在金融和会计领域,准确无误地填写票据和结算凭证至关重要。这些文件不仅是支付结算和现金收付的重要依据,还直接关系到交易的安全性和准确性。本文介绍了一种使用C语言实现小写金额转换为大写金额的方法,确保数据的标准化和规范化。 ... [详细]
  • 机器学习中的相似度度量与模型优化
    本文探讨了机器学习中常见的相似度度量方法,包括余弦相似度、欧氏距离和马氏距离,并详细介绍了如何通过选择合适的模型复杂度和正则化来提高模型的泛化能力。此外,文章还涵盖了模型评估的各种方法和指标,以及不同分类器的工作原理和应用场景。 ... [详细]
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • 本教程涵盖OpenGL基础操作及直线光栅化技术,包括点的绘制、简单图形绘制、直线绘制以及DDA和中点画线算法。通过逐步实践,帮助读者掌握OpenGL的基本使用方法。 ... [详细]
  • 本文详细介绍了中央电视台电影频道的节目预告,并通过专业工具分析了其加载方式,确保用户能够获取最准确的电视节目信息。 ... [详细]
  • 本文深入探讨了C++对象模型中的一些细节问题,特别是虚拟继承和析构函数的处理。通过具体代码示例和详细分析,揭示了书中某些观点的不足之处,并提供了更合理的解释。 ... [详细]
  • 本文详细探讨了KMP算法中next数组的构建及其应用,重点分析了未改良和改良后的next数组在字符串匹配中的作用。通过具体实例和代码实现,帮助读者更好地理解KMP算法的核心原理。 ... [详细]
  • 本文详细探讨了Java中的24种设计模式及其应用,并介绍了七大面向对象设计原则。通过创建型、结构型和行为型模式的分类,帮助开发者更好地理解和应用这些模式,提升代码质量和可维护性。 ... [详细]
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社区 版权所有