K-近邻法(K-NN)
2016-06-01 12:53
302 查看
K-近邻算法的基本思路
已知N个已知类别的样本X;输入未知类别的样本x;
计算x到xi∈X,(i=1,2,⋅⋅⋅,N)的距离di(x);
找到x的k个最近邻元xk=xi,i=1,2,⋅⋅⋅,k;
看xk中属于哪一类的样本最多;
最终判断未知样本属于那一类x。
Matlab代码实现
clear all; close all; clc; %X为标记好的样本集,样本为将1至40的数分为2类 %1-20里的10个随机数为一类,21-40里的10个随机数为一类 X = [8,9,17,14,18,12,2,10,16,20,24,34,25,40,31,38,22,21,27,26]; [r,c] = size(X); %标记好的两类 w1 = [8,9,17,14,18,12,2,10,16,20]; w2 = [24,34,25,40,31,38,22,21,27,26]; %x为要被分类的样本 T = 1:40;%选取类的范围里的随机序列,共40个数 R = randperm(40);%将1至40随机数打乱 x = T(R(1)); disp('随机数x为:'); disp(num2str(x)); %k为邻居数目(k-个近邻) k = 7; %计算距离 d = zeros(r,c); for i = 1:c d(i) = abs(X(i)-x); end %找出k个最小距离 xk = zeros(1,k);%存储最近邻元 for i = 1:k [di ,n] = min(d);%找到最短距离di,以及算在的位置 xk(i) = X(n); d(n) = 40;%为了获得其他的最小值将查询到的最小值赋值为最大值 end %判断属于的类别 k1 = 0;%属于w1的样本个数 for i = 1:k for j = 1:10 if xk(i) == w1(j) k1 = k1+1; end end end k2 = k - k1;%%属于w2的样本个数 if k2<k1 disp( '随机数x属于w1类:'); disp( num2str(w1)); break; else disp( '随机数x属于w2类:'); disp( num2str(w2)); break; end
结果图
相关文章推荐
- 书评:《算法之美( Algorithms to Live By )》
- 动易2006序列号破解算法公布
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法
- 基于C++实现的各种内部排序算法汇总
- C++线性时间的排序算法分析
- C++实现汉诺塔算法经典实例
- PHP实现克鲁斯卡尔算法实例解析