模式识别之分类器knn---c语言实现带训练数据---反余弦匹配
邻近算法

KNN算法的决策过程
k-Nearest Neighbor algorithm
是K最邻近结点算法(k-Nearest Neighbor algorithm)的缩写形式,是电子信息分类器算法的一种
该算法的基本思路是:在给定新文本后,考虑在训练文本集中与该新文本距离最近(最相似)的 K 篇文本,根据这 K 篇文本所属的类别判定新文本所属的类别
左图中,绿色圆要被决定赋予哪个类,是红色三角形还是蓝色四方形?如果K=3,由于红色三角形所占比例为2/3,绿色圆将被赋予红色三角形那个类,如果K=5,由于蓝色四方形比例为3/5,因此绿色圆被赋予蓝色四方形类。
K最近邻(k-Nearest Neighbor,KNN)分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一。该方法的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。KNN算法中,所选择的邻居都是已经正确分类的对象。该方法在定类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。 KNN方法虽然从原理上也依赖于极限定理,但在类别决策时,只与极少量的相邻样本有关。由于KNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,KNN方法较其他方法更为适合。
KNN算法不仅可以用于分类,还可以用于回归。通过找出一个样本的k个最近邻居,将这些邻居的属性的平均值赋给该样本,就可以得到该样本的属性。更有用的方法是将不同距离的邻居对该样本产生的影响给予不同的权值(weight),如权值与距离成正比。
该算法在分类时有个主要的不足是,当样本不平衡时,如一个类的样本容量很大,而其他类样本容量很小时,有可能导致当输入一个新样本时,该样本的K个邻居中大容量类的样本占多数。因此可以采用权值的方法(和该样本距离小的邻居权值大)来改进。该方法的另一个不足之处是计算量较大,因为对每一个待分类的文本都要计算它到全体已知样本的距离,才能求得它的K个最近邻点。目前常用的解决方法是事先对已知样本点进行剪辑,事先去除对分类作用不大的样本。该算法比较适用于样本容量比较大的类域的自动分类,而那些样本容量较小的类域采用这种算法比较容易产生误分。
KNN-主要应用领域
·文本分类·聚类分析·数据挖掘·机器学习·预测分析·减少维度·模式识别·图像处理
我的kNN分类算法程序:

------------------- Code written by Stephen Liu -----------------------
#include
#include
#define MAX 1000
using namespace std;
int m, i, j;
int types;
class str
{
public:
float x;
float y;
float distance;
int type;
};
str data;//输入的已知类别的数据
str point;//需要根据kNN判断类别的未知数据
str temp;
void input_data()
{
cout << "请输入已知点的个数:";
cin >> m;
for ( i = 1; i <= m; i++)
{
cout <<"请输入点 " << i <<" 的坐标x , y 和所属类别:" ;
cin >> data.x >> data.y >> data.type;
}
}
void Distance()//计算未知类别点与所有已知类别点的距离
{
for ( i = 1; i <= m; i++ )
data.distance = sqrt ( (data.x - point.x) * (data.x - point.x) + (data.y - point.y) * (data.y - point.y) );
}
void sort()//对距离进行从小到大排序
{
for( i = 1; i <= m; i++)
for(j = m; j > i; j--)
{
if(data.distance < data.distance)
{
temp=data;
data=data;
data=temp;
}
}
}
int kNN( )
{
int the_type,num = 0, k;
cout <<"请输入kNN的k值:";
cin >> k;
for ( i = 1; i <= 99; i++)
types = 0;
for ( i = 1; i <= k; i++)//对已排序的前k位距离类别进行统计
types.type ] ++;
for ( i = 1; i <= 99; i++)//找出未知类别点属于的类别
{
if (types > num )
{
num = types;
the_type = i;
}
}
return ( the_type);
}
int main()
{
input_data();
cout <<"请输入未知类别点的坐标x,y(输入0 0退出):";
cin >> point.x >> point.y;
do
{
Distance();
sort();
cout <<"点( " << point.x << " , " << point.y <<" )属于类"<< kNN() << endl;
cout <<"请输入未知类别点的坐标x,y(输入0 0退出):";
cin >> point.x >> point.y;
}
while ( point.x != 0 && point.y != 0);
cout <<"======= kNN分类算法 Stephen Liu E-mail:stephenliu1989@163.com 2010.8 ======= ";
system("pause");
return 0;
}
------------------------- Code end ---------------------------------
我的评价:
这是kNN分类算法的最简单的一种情况,当k取不同值时分类可能会出现不同。样本过大时,由于要比较的次数增多,效率降低。
http://emuch.net/html/201009/2366638.html 原理
http://download.csdn.net/download/wang123sf/1770715 代码
模式识别之分类器knn---c语言实现带训练数据---反余弦匹配的更多相关文章
- C语言自带的快速排序(qsort)函数使用方法
感觉打快排太慢了,找到了c语言自带的函数.这函数用起来没c++的方便,不过也够了. 函数名称:qsort,在头文件:<stdlib.h>中 不多说,上代码: #include <st ...
- python最近邻分类器KNN算法
1. KNN算法 邻近算法,或者说K最近邻(kNN,k-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一.所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最 ...
- iOS—网络实用技术OC篇&网络爬虫-使用java语言抓取网络数据
网络爬虫-使用java语言抓取网络数据 前提:熟悉java语法(能看懂就行) 准备阶段:从网页中获取html代码 实战阶段:将对应的html代码使用java语言解析出来,最后保存到plist文件 上一 ...
- TCP带外数据
传输层协议使用带外数据(out-of-band,OOB)来发送一些重要的数据,如果通信一方有重要的数据需要通知对方时,协议能够将这些数据快速地发送到对方.为了发送这些数据,协议一般不使用与普通数据相同 ...
- iOS开发——网络实用技术OC篇&网络爬虫-使用java语言抓取网络数据
网络爬虫-使用java语言抓取网络数据 前提:熟悉java语法(能看懂就行) 准备阶段:从网页中获取html代码 实战阶段:将对应的html代码使用java语言解析出来,最后保存到plist文件 上一 ...
- CSharpGL(38)带初始数据创建Vertex Buffer Object的情形汇总
CSharpGL(38)带初始数据创建Vertex Buffer Object的情形汇总 开始 总的来说,OpenGL应用开发者会遇到为如下三种数据创建Vertex Buffer Object的情形: ...
- 网络IPC:套接字之带外数据
带外数据(Out-of-band data)是一些通信协议所支持的可选特征,允许更高优先级的数据比普通数据优先传输.即使传输队列已经有数据,带外数据先行传输.TCP支持带外数据,但是UDP不支持.套接 ...
- UNIX网络编程——带外数据小结
TCP没有真正的带外数据,不过提供紧急模式和紧急指针.一旦发送端进入紧急模式,紧急指针就出现在发送到对端的分节中的TCP首部中.连接的对端收取该指针是在告知接收进程发送端已经进入紧急模式,而且该指针指 ...
- UNIX网络编程——TCP带外数据小结
带外数据概念实际上时向接收端传送三个不同的信息:(1)发送端进入紧急模式这个事实.接收进程得以通知这个事实的手段不外乎SIGURG信号或select调用.本通知在发送进程发送带外字节后由发送端TCP立 ...
随机推荐
- samba安装和配置
windows和windows系统之间要实现文件共享是通过网络邻居实现linux和windows之间通过什么来实现文件共享呢?一.通过文件挂载(首先要制作ISO镜像文件,然后在用挂载命令)二.通过sa ...
- poj 3109
...
- comet realization with ajax&php
1.prepare front-end code, meta content-type cannot be ignored! as to the xhr, status should be 3 < ...
- C#:判断当前线程所处状态&委托
1.线程状态ThreadState 在C#中,线程对象Thread使用ThreadState属性指示线程状态,它是带Flags特性的枚举类型对象. ThreadState 为线程定义了一组所有可能的执 ...
- 升级 GCC 支持C++11 或 configure: error: *** A compiler with support for C++11 language features is required.
configure: error: *** A compiler with support for C++11 language features is required. 参考链接: (1)升级 G ...
- git 撤回上一次commit中某一个不想添加的文件
1. 假设我们修改了文件a,同时修改了IDE的配置文件b 2.此时我们只想添加文件a到commit中,却不小心将b也添加进去了 3.那么怎么撤回呢? 4.第一种方法 :重新提交commit 5. 第二 ...
- vue框架及其
Vue常用UI框架 PC端: 1. ElementUI:http://element-cn.eleme.io/#/zh-CN 2. iView:https://www.iviewui.com/ 3. ...
- 初学ElasticSeacher
这周,刚接手了同事那边的工作,项目里需要用到ElasticSeacher.但是,之前从未接触过,因此,看了ES的文档,开始慢慢的知道了一些ES的知识. 一.ES简介: Elasticsearch是一个 ...
- 如果当前地图文档中有独立的Table,通过Engine如何获取该Table?
将IMap转为ITableCollection,通过ITableCollection.get_Table(int index);来获取该Table
- Android 震动 和 停止 代码
<span style="font-size:18px;">MainActivity.java</span> package com.Utils.vibra ...