机器学习十大算法之Matlab-3KNN
- KNN
-
- Matlab代码
-
- 例子1-KNN算法的Matlab实现
- 例子2-三分类
- 例子3-系统自带函数进行调用
- 例子4-系统自带函数进行调用
KNN
Matlab代码
例子1-KNN算法的Matlab实现
%k近邻算法的MATLAB实现
clc, clear all, close all;
%利用高斯分布生成打斗片数据和标签
mu1=[8 3]; %均值
sigma1=[2 0; 0 2.5]; %二维数据的协方差矩阵
data1=mvnrnd(mu1,sigma1,100); %产生高斯分布数据
% for i=1:100 %令高斯数据中的负数为零
% for j=1:2 %因为打斗和接吻镜头数不能为负数
% if data1(i,j)<0
% data1(i,j)=0;
% end
% end
% end
data1(find(data1<0))=0;%令高斯数据中的负数为零,因为打斗和接吻镜头数不能为负数
label1=ones(100,1); %将该类数据的标签定义为1
plot(data1(:,1),data1(:,2),'bd'); %用+号绘制出数据
axis([-1 12 -1 12]); %设定两坐标轴范围
xlabel('打斗镜头数'); %标记横轴为打斗镜头数
ylabel('接吻镜头数'); %标记纵轴为接吻镜头数
hold on
%利用高斯分布生成爱情片数据和标签
mu2=[3 8]; %均值
sigma2=[2 0; 0 2.5]; %二维数据的协方差矩阵
data2=mvnrnd(mu2,sigma2,100); %产生高斯分布数据
% for i=1:100 %令高斯数据中的负数为零
% for j=1:2 %因为打斗和接吻镜头数不能为负数
% if data2(i,j)<0
% data2(i,j)=0;
% end
% end
% end
data2(find(data2<0))=0;%令高斯数据中的负数为零
label2=2*ones(100,1); %将该类数据的标签定义为2
plot(data2(:,1),data2(:,2),'rv'); %用+号绘制出数据
data=[data1; data2];
label=[label1;label2];
k=11; %两个类,一般k取奇数有利于测试数据属于哪个类
%测试数据,k近邻算法看这个数据属于哪个类,测试数据共25个
%打斗镜头数遍历3~7,接吻镜头数也遍历3~7
for movenum=3:1:7
for kissnum=3:1:7
test_data=[movenum, kissnum]; %测试数据,为5*5矩阵
%求测试数据与类中每个数据的距离,欧氏距离
dist=zeros(200,1);
for i=1:200
dist(i)=sqrt((test_data(1)-data(i,1)).^2+(test_data(2)-data(i,2)).^2);
end
%选择排序算法,只找出最小的前k个数据,对数据和标号都进行排序
for i=1:k
min=dist(i);
for j=i+1:200
if dist(j)cls2
plot(movenum,kissnum,'ko'); %属于类1(动作片)的数据画小圆圈
else
plot(movenum,kissnum,'k*'); %属于类2(爱情片)的数据画星号*
end
label=[label1;label2]; %更新label标签排序
end
end
例子2-三分类
%对鸢尾属植物数据集进行分类
k=23; %选取超参数k的值
flower = load('iris.txt');
train_X = [flower(1:40, :);flower(51:90, :);flower(101:140, :)];
train_Y = [ones(40, 1); 2*ones(40, 1);3*ones(40, 1)];
test_X = [flower(41:50, :); flower(91:100, :); flower(141:150, :)];
test_Y = [ones(10, 1); 2*ones(10, 1);3*ones(10, 1)]; test_Y=test_Y'
Est_Y = knn_alg(train_X, train_Y, test_X, k)
Correct_ratio=sum(Est_Y==test_Y)./length(test_Y),
%三分类的KNN程序
function Est_Y = knn_alg(X, Y, test_X, k)
for i = 1:length(test_X)
for j = 1:length(X)
dist(i,j) = norm(test_X(i)-X(j));%计算欧氏距离
end
[~,idx] = mink(dist(i,:),k); %求数组中最小的k个元素
result(i,:) = Y(idx);
end
for i = 1:length(test_X)
s1=sum(result(i,:) ==1);
s2=sum(result(i,:) ==2);
s3=sum(result(i,:) ==3);
[~,idx]=max([s1,s2,s3]);
if (idx==1)
Est_Y(i) = 1;
else if (idx==2)
Est_Y(i) = 2;
else
Est_Y(i) = 3;
end
end
end
5.1000 3.5000 1.4000 0.2000
4.9000 3.0000 1.4000 0.2000
4.7000 3.2000 1.3000 0.2000
4.6000 3.1000 1.5000 0.2000
5.0000 3.6000 1.4000 0.2000
5.4000 3.9000 1.7000 0.4000
4.6000 3.4000 1.4000 0.3000
5.0000 3.4000 1.5000 0.2000
4.4000 2.9000 1.4000 0.2000
4.9000 3.1000 1.5000 0.1000
5.4000 3.7000 1.5000 0.2000
4.8000 3.4000 1.6000 0.2000
4.8000 3.0000 1.4000 0.1000
4.3000 3.0000 1.1000 0.1000
5.8000 4.0000 1.2000 0.2000
5.7000 4.4000 1.5000 0.4000
5.4000 3.9000 1.3000 0.4000
5.1000 3.5000 1.4000 0.3000
5.7000 3.8000 1.7000 0.3000
5.1000 3.8000 1.5000 0.3000
5.4000 3.4000 1.7000 0.2000
5.1000 3.7000 1.5000 0.4000
4.6000 3.6000 1.0000 0.2000
5.1000 3.3000 1.7000 0.5000
4.8000 3.4000 1.9000 0.2000
5.0000 3.0000 1.6000 0.2000
5.0000 3.4000 1.6000 0.4000
5.2000 3.5000 1.5000 0.2000
5.2000 3.4000 1.4000 0.2000
4.7000 3.2000 1.6000 0.2000
4.8000 3.1000 1.6000 0.2000
5.4000 3.4000 1.5000 0.4000
5.2000 4.1000 1.5000 0.1000
5.5000 4.2000 1.4000 0.2000
4.9000 3.1000 1.5000 0.2000
5.0000 3.2000 1.2000 0.2000
5.5000 3.5000 1.3000 0.2000
4.9000 3.6000 1.4000 0.1000
4.4000 3.0000 1.3000 0.2000
5.1000 3.4000 1.5000 0.2000
5.0000 3.5000 1.3000 0.3000
4.5000 2.3000 1.3000 0.3000
4.4000 3.2000 1.3000 0.2000
5.0000 3.5000 1.6000 0.6000
5.1000 3.8000 1.9000 0.4000
4.8000 3.0000 1.4000 0.3000
5.1000 3.8000 1.6000 0.2000
4.6000 3.2000 1.4000 0.2000
5.3000 3.7000 1.5000 0.2000
5.0000 3.3000 1.4000 0.2000
7.0000 3.2000 4.7000 1.4000
6.4000 3.2000 4.5000 1.5000
6.9000 3.1000 4.9000 1.5000
5.5000 2.3000 4.0000 1.3000
6.5000 2.8000 4.6000 1.5000
5.7000 2.8000 4.5000 1.3000
6.3000 3.3000 4.7000 1.6000
4.9000 2.4000 3.3000 1.0000
6.6000 2.9000 4.6000 1.3000
5.2000 2.7000 3.9000 1.4000
5.0000 2.0000 3.5000 1.0000
5.9000 3.0000 4.2000 1.5000
6.0000 2.2000 4.0000 1.0000
6.1000 2.9000 4.7000 1.4000
5.6000 2.9000 3.6000 1.3000
6.7000 3.1000 4.4000 1.4000
5.6000 3.0000 4.5000 1.5000
5.8000 2.7000 4.1000 1.0000
6.2000 2.2000 4.5000 1.5000
5.6000 2.5000 3.9000 1.1000
5.9000 3.2000 4.8000 1.8000
6.1000 2.8000 4.0000 1.3000
6.3000 2.5000 4.9000 1.5000
6.1000 2.8000 4.7000 1.2000
6.4000 2.9000 4.3000 1.3000
6.6000 3.0000 4.4000 1.4000
6.8000 2.8000 4.8000 1.4000
6.7000 3.0000 5.0000 1.7000
6.0000 2.9000 4.5000 1.5000
5.7000 2.6000 3.5000 1.0000
5.5000 2.4000 3.8000 1.1000
5.5000 2.4000 3.7000 1.0000
5.8000 2.7000 3.9000 1.2000
6.0000 2.7000 5.1000 1.6000
5.4000 3.0000 4.5000 1.5000
6.0000 3.4000 4.5000 1.6000
6.7000 3.1000 4.7000 1.5000
6.3000 2.3000 4.4000 1.3000
5.6000 3.0000 4.1000 1.3000
5.5000 2.5000 4.0000 1.3000
5.5000 2.6000 4.4000 1.2000
6.1000 3.0000 4.6000 1.4000
5.8000 2.6000 4.0000 1.2000
5.0000 2.3000 3.3000 1.0000
5.6000 2.7000 4.2000 1.3000
5.7000 3.0000 4.2000 1.2000
5.7000 2.9000 4.2000 1.3000
6.2000 2.9000 4.3000 1.3000
5.1000 2.5000 3.0000 1.1000
5.7000 2.8000 4.1000 1.3000
6.3000 3.3000 6.0000 2.5000
5.8000 2.7000 5.1000 1.9000
7.1000 3.0000 5.9000 2.1000
6.3000 2.9000 5.6000 1.8000
6.5000 3.0000 5.8000 2.2000
7.6000 3.0000 6.6000 2.1000
4.9000 2.5000 4.5000 1.7000
7.3000 2.9000 6.3000 1.8000
6.7000 2.5000 5.8000 1.8000
7.2000 3.6000 6.1000 2.5000
6.5000 3.2000 5.1000 2.0000
6.4000 2.7000 5.3000 1.9000
6.8000 3.0000 5.5000 2.1000
5.7000 2.5000 5.0000 2.0000
5.8000 2.8000 5.1000 2.4000
6.4000 3.2000 5.3000 2.3000
6.5000 3.0000 5.5000 1.8000
7.7000 3.8000 6.7000 2.2000
7.7000 2.6000 6.9000 2.3000
6.0000 2.2000 5.0000 1.5000
6.9000 3.2000 5.7000 2.3000
5.6000 2.8000 4.9000 2.0000
7.7000 2.8000 6.7000 2.0000
6.3000 2.7000 4.9000 1.8000
6.7000 3.3000 5.7000 2.1000
7.2000 3.2000 6.0000 1.8000
6.2000 2.8000 4.8000 1.8000
6.1000 3.0000 4.9000 1.8000
6.4000 2.8000 5.6000 2.1000
7.2000 3.0000 5.8000 1.6000
7.4000 2.8000 6.1000 1.9000
7.9000 3.8000 6.4000 2.0000
6.4000 2.8000 5.6000 2.2000
6.3000 2.8000 5.1000 1.5000
6.1000 2.6000 5.6000 1.4000
7.7000 3.0000 6.1000 2.3000
6.3000 3.4000 5.6000 2.4000
6.4000 3.1000 5.5000 1.8000
6.0000 3.0000 4.8000 1.8000
6.9000 3.1000 5.4000 2.1000
6.7000 3.1000 5.6000 2.4000
6.9000 3.1000 5.1000 2.3000
5.8000 2.7000 5.1000 1.9000
6.8000 3.2000 5.9000 2.3000
6.7000 3.3000 5.7000 2.5000
6.7000 3.0000 5.2000 2.3000
6.3000 2.5000 5.0000 1.9000
6.5000 3.0000 5.2000 2.0000
6.2000 3.4000 5.4000 2.3000
5.9000 3.0000 5.1000 1.8000
例子3-系统自带函数进行调用
%MATLAB自带k近邻算法函数fitcknn
clc, clear all, close all;
rng('default'); %可重复性
%生成200个数据样本
mu1=[2 2]; sigma1=[1 0;0 1];
mu2=[-2 -2]; sigma2=[2 0;0 2];
train=[mvnrnd(mu1,sigma1,100); mvnrnd(mu2,sigma2,100)];
%200个数据前100个标记为标签1,后100个标记为标签2
group=[ones(100,1);2*ones(100,1)];
%绘制出离散的样本数据点
gscatter(train(:,1),train(:,2),group,'rb','*x');
hold on
%生成待分类样本20个
sample=unifrnd(-2,2,20,2);
%产生一个20 x 2矩阵,这个矩阵中的每个元素为-2~2连续均匀分布的随机数
k=3; %k近邻算法中的k值
ck=fitcknn(train,group,'NumNeighbors', k);
cls=predict(ck,sample)
gscatter(sample(:,1),sample(:,2),cls,'gm','od');
hold off
例子4-系统自带函数进行调用
%对鸢尾属植物数据集进行分类
clc, clear all, close all
load fisheriris
X = meas;
Y = species;
mdl = fitcknn(X,Y,'NumNeighbors',5,'Standardize',1)
cls=predict(mdl,[1 0.2 0.4 2])