在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
K最邻近密度估计技术是一种分类方法,不是聚类方法。 不是最优方法,实践中比较流行。 通俗但不一定易懂的规则是: 1.计算待分类数据和不同类中每一个数据的距离(欧氏或马氏)。 2.选出最小的前K数据个距离,这里用到选择排序法。 3.对比这前K个距离,找出K个数据中包含最多的是那个类的数据,即为待分类数据所在的类。 不通俗但严谨的规则是: 给定一个位置特征向量x和一种距离测量方法,于是有: 1.在N个训练向量外,不考虑类的标签来确定k邻近。在两类的情况下,k选为奇数,一般不是类M的倍数。 2.在K个样本之外,确定属于wi,i=1,2,...M类的向量的个数ki,显然sum(ki)=k。 3.x属于样本最大值ki的那一类wi。 如下图,看那个绿色的值,是算三角类呢还是算矩类形呢,这要看是用几NN了,要是3NN就属于三角,要是5NN就属于矩形。 至于K到底取几,不同情况都要区别对待的。
下面是相关matlab代码: 1 clear all;
2 close all;
3 clc;
4
5 %%第一个类数据和标号
6 mu1=[0 0]; %均值
7 S1=[0.3 0;0 0.35]; %协方差
8 data1=mvnrnd(mu1,S1,100); %产生高斯分布数据
9 plot(data1(:,1),data1(:,2),'+');
10 label1=ones(100,1);
11 hold on;
12
13 %%第二个类数据和标号
14 mu2=[1.25 1.25];
15 S2=[0.3 0;0 0.35];
16 data2=mvnrnd(mu2,S2,100);
17 plot(data2(:,1),data2(:,2),'ro');
18 label2=label1+1;
19
20 data=[data1;data2];
21 label=[label1;label2];
22
23 K=11; %两个类,K取奇数才能够区分测试数据属于那个类
24 %测试数据,KNN算法看这个数属于哪个类
25 for ii=-3:0.1:3
26 for jj=-3:0.1:3
27 test_data=[ii jj]; %测试数据
28 label=[label1;label2];
29 %%下面开始KNN算法,显然这里是11NN。
30 %求测试数据和类中每个数据的距离,欧式距离(或马氏距离)
31 distance=zeros(200,1);
32 for i=1:200
33 distance(i)=sqrt((test_data(1)-data(i,1)).^2+(test_data(2)-data(i,2)).^2);
34 end
35
36 %选择排序法,只找出最小的前K个数据,对数据和标号都进行排序
37 for i=1:K
38 ma=distance(i);
39 for j=i+1:200
40 if distance(j)<ma
41 ma=distance(j);
42 label_ma=label(j);
43 tmp=j;
44 end
45 end
46 distance(tmp)=distance(i); %排数据
47 distance(i)=ma;
48
49 label(tmp)=label(i); %排标号,主要使用标号
50 label(i)=label_ma;
51 end
52
53 cls1=0; %统计类1中距离测试数据最近的个数
54 for i=1:K
55 if label(i)==1
56 cls1=cls1+1;
57 end
58 end
59 cls2=K-cls1; %类2中距离测试数据最近的个数
60
61 if cls1>cls2
62 plot(ii,jj); %属于类1的数据画小黑点
63 end
64
65 end
66 end
代码中是两个高斯分布的类,变量取x=-3:3,y=-3:3中的数据,看看这些数据都是属于哪个类。 下面是运行效果图:
|
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论