一杯清酒邀明月
天下本无事,庸人扰之而烦耳。
posts - 3121,comments - 209,views - 578万

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中的数据,看看这些数据都是属于哪个类。

下面是运行效果图:

posted on   一杯清酒邀明月  阅读(664)  评论(0编辑  收藏  举报
编辑推荐:
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
阅读排行:
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示