k近邻法matlab_KNN算法及其matlab实现

本文介绍了k近邻(kNN)分类算法的原理,包括算法的计算步骤、距离衡量方法和类别判定策略。文章通过实例探讨了如何在MATLAB中应用kNN算法,并讨论了欧式距离和夹角余弦作为相似度衡量标准的选择。同时,提出了投票决定和加权投票法两种分类决策方式,并以K=11为例进行说明。
摘要由CSDN通过智能技术生成

一、算法概述

1、kNN算法又称为k近邻分类(k-nearest neighbor classification)算法。kNN算法则是从训练集中找到和新数据最接近的k条记录,然后根据他们的主要分类来决定新数据的类别。该算法涉及3个主要因素:训练集、距离或相似的衡量、k的大小。

计算步骤如下:

1)算距离:给定测试对象,计算它与训练集中的每个对象的距离

2)找邻居:圈定距离最近的k个训练对象,作为测试对象的近邻

3)做分类:根据这k个近邻归属的主要类别,来对测试对象分类

2、距离或相似度的衡量

什么是合适的距离衡量?距离越近应该意味着这两个点属于一个分类的可能性越大。

觉的距离衡量包括欧式距离、夹角余弦等。

3、类别的判定

投票决定:少数服从多数,近邻中哪个类别的点最多就分为该类。

加权投票法:根据距离的远近,对近邻的投票进行加权,距离越近则权重越大(权重为距离平方的倒数)

clear;
clc;
K=3;
trainData = [1.0,2.0;
    1.2,0.1;
    0.1,1.4;
    0.3,3.5];
trainClass = [1,1,2,2];
testData = [0.5,2.3];

[N,M]=size(trainData);
%计算训练数据集与测试数据之间的欧氏距离dist
dist=zeros(N,1);
for i=1:N
    dist(i,:)=norm(trainData(i,:)-testData);
end
%将dist从小到大进行排序
[Y,I]=sort(dist,1);   
%将训练数据对应的类别与训练数据排序结果对应
trainClass=trainClass(I);
%确定前K个点所在类别的出现频率
classNum=length(unique(trainClass));%取集合中的单值元素的个数
labels=zeros(1,classNum);
for i=1:K
    j=trainClass(i);
    labels(j)=labels(j)+1;
end
%返回前K个点中出现频率最高的类别作为测试数据的预测分类
[~,idx]=max(labels);
fprintf('该测试数据属于类 %dn',idx);

%% f方法二更简单
labels=trainClass;
idx=mode(labels(1:K));%mode函数求众数
fprintf('该测试数据属于类 %d  ',idx);

下面看一个经典的例子,区分两类电影。电影有两个特征描述。K=11

%% KNN
clear all
clc
% 每一个数据有两个特征
%生成第一类数据
data1 =  mvnrnd([8,3],[2 0; 0 2.5],100);
data1(data1<0)=0;
label1 = ones(100,1);

%生成第二类数据
data2 =  mvnrnd([3,8],[2 0; 0 2.5],100);
data2(data1<0)=0;
label2 = 1+ones(100,1);
plot(data1(:,1),data1(:,2),'ro',data2(:,1),data2(:,2),'b^')

hold on
data = [data1;data2];
label = [label1; label2];
K= 11;
for i1 = 3:7
    for i2 = 3:7
        testdata = [i1 i2];
        
        distance=zeros(200,1);
        dis = sum((data-testdata).^2,2);
        [B index]= sort(dis);

        newLabel = label(index(1:K));
        c1 = 0;
        c2 = 0;
        for ii = 1:K
            if newLabel(ii)==1
                c1 = c1+1;
            else
                c2 = c2+1;
            end
        end
        if c1>c2
            scatter(testdata(1),testdata(2),50,'ro','filled')
        else
            scatter(testdata(1),testdata(2),50,'bo','filled')
        end
        
    end
end
legend('第一类','第二类')

805d315fb6e807f46c78265fad50e18c.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值