一、 KNN算法简介

K最近邻(k-Nearest Neighbor,KNN)分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一。该方法的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。

1 定义
如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别,即由你的“邻居”来推断出你的类别.

2 距离公式
两个样本的距离可以通过如下公式计算,又叫欧式距离
【图像检索】基于matlab GUI KNN图像检索【含Matlab源码 267期】_2d
3 KNN算法的步骤
(1)计算已知类别数据集中每个点与当前点的距离;
(2)选取与当前点距离最小的K个点;
(3)统计前K个点中每个类别的样本出现的频率;
(4)返回前K个点出现频率最高的类别作为当前点的预测分类。

4 KNN原理
【图像检索】基于matlab GUI KNN图像检索【含Matlab源码 267期】_自动驾驶_02
【图像检索】基于matlab GUI KNN图像检索【含Matlab源码 267期】_自动驾驶_03
【图像检索】基于matlab GUI KNN图像检索【含Matlab源码 267期】_自动驾驶_04
5 KNN的优缺点
【图像检索】基于matlab GUI KNN图像检索【含Matlab源码 267期】_2d_05
6 KNN性能问题
NN的性能问题也是KNN的缺点之一。使用KNN,可以很容易的构造模型,但在对待分类样本进行分类时,为了获得K近邻,必须采用暴力搜索的方式,扫描全部训练样本并计算其与待分类样本之间的距离,系统开销很大。

二、部分源代码

function varargout = gui_class_run(varargin)
% GUI_CLASS_RUN M-file for gui_class_run.fig
%      GUI_CLASS_RUN, by itself, creates a new GUI_CLASS_RUN or raises the existing
%      singleton*.
%
%      H = GUI_CLASS_RUN returns the handle to a new GUI_CLASS_RUN or the handle to
%      the existing singleton*.
%
%      GUI_CLASS_RUN('CALLBACK',hObject,eventData,handles,...) calls the local
%      function named CALLBACK in GUI_CLASS_RUN.M with the given input arguments.
%
%      GUI_CLASS_RUN('Property','Value',...) creates a new GUI_CLASS_RUN or raises the
%      existing singleton*.  Starting from the left, property value pairs are
%      applied to the GUI before gui_class_run_OpeningFcn gets called.  An
%      unrecognized property name or invalid value makes property application
%      stop.  All inputs are passed to gui_class_run_OpeningFcn via varargin.
%
%      *See GUI Options on GUIDE's Tools menu.  Choose "GUI allows only one
%      instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES

% Edit the above text to modify the response to help gui_class_run

% Last Modified by GUIDE v2.5 23-Feb-2021 16:38:14

% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
                   'gui_Singleton',  gui_Singleton, ...
                   'gui_OpeningFcn', @gui_class_run_OpeningFcn, ...
                   'gui_OutputFcn',  @gui_class_run_OutputFcn, ...
                   'gui_LayoutFcn',  [] , ...
                   'gui_Callback',   []);
if nargin && ischar(varargin{1})
    gui_State.gui_Callback = str2func(varargin{1});
end

if nargout
    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
    gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT


% --- Executes just before gui_class_run is made visible.
function gui_class_run_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% varargin   command line arguments to gui_class_run (see VARARGIN)

% Choose default command line output for gui_class_run
handles.output = hObject;

% Update handles structure
guidata(hObject, handles);

% UIWAIT makes gui_class_run wait for user response (see UIRESUME)
% uiwait(handles.figure1);
set(handles.pushbutton4,'Visible','off');set(handles.pushbutton5,'Visible','off');
set(handles.axes1,'Visible','off');set(handles.axes2,'Visible','off');set(handles.axes3,'Visible','off');
set(handles.axes4,'Visible','off');set(handles.axes5,'Visible','off');set(handles.axes6,'Visible','off');
set(handles.axes7,'Visible','off');set(handles.axes8,'Visible','off');set(handles.axes9,'Visible','off');
set(handles.axes10,'Visible','off');



% --- Outputs from this function are returned to the command line.
function varargout = gui_class_run_OutputFcn(hObject, eventdata, handles) 
% varargout  cell array for returning output args (see VARARGOUT);
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Get default command line output from handles structure
varargout{1} = handles.output;


% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
set(handles.pushbutton2,'Visible','off');
set(handles.pushbutton4,'Visible','on');set(handles.pushbutton5,'Visible','off');
set(handles.axes1,'Visible','on');set(handles.axes2,'Visible','on');set(handles.axes3,'Visible','on');
set(handles.axes4,'Visible','on');set(handles.axes5,'Visible','on');set(handles.axes6,'Visible','on');
set(handles.axes7,'Visible','on');set(handles.axes8,'Visible','on');set(handles.axes9,'Visible','on');
set(handles.axes10,'Visible','on');
pause(1);
[J P]=uigetfile('*.*','select the Query Image');
I=imread(strcat(P,J));
I=imresize(I,[256 256]);
axes(handles.axes1);imshow(I);title('Query Image');
I=im2double(I);
k=1;wn={'haar','db2','db4','dmey','bior1.1'};
for w=1:5                         % three wavelets 
for c=1:3                         % three band of colors
    T=I(:,:,c);    
for i=1:6                         % six decomposition levels
[a1,b1,c1,d1]=dwt2(T,wn{w});
fq(k,:)=my_feature(a1);          % extraction of features
T=a1;
k=k+1;
end
end
end
handles.fq=fq;
% Update handles structure
guidata(hObject, handles);

% --- Executes on button press in pushbutton2.
function pushbutton2_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton2 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
set(handles.pushbutton1,'Visible','off');
set(handles.pushbutton5,'Visible','on');
[J P]=uigetfile('*.*','select the Query Image');
I=imread(strcat(P,J));
I=imresize(I,[256 256]);
I=im2double(I);
k=1;wn={'haar','db2','db4','dmey','bior1.1'};
for w=1:5                         % three wavelets 
for c=1:3                         % three band of colors
    T=I(:,:,c);    
for i=1:6                         % six decomposition levels
[a1,b1,c1,d1]=dwt2(T,wn{w});
fq(k,:)=my_feature(a1);          % extraction of features
T=a1;
k=k+1;
end
end
end
set(handles.axes1,'Visible','on');
axes(handles.axes1);imshow(I);title('Query Image');
% --- Executes on button press in pushbutton3.
handles.fq=fq;
guidata(hObject, handles);

% --- Executes on button press in pushbutton4.
function pushbutton4_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton4 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
F=dir('database');
F=char(F.name);
sz=size(F,1)-3;
h=waitbar(0,'Please wait the system is searching' );
g=[];
for i=1:4
g=[g repmat([i],1,10)];
end
for ff=1:sz
    str=strcat(num2str(ff),'.jpg');
    cd database
    I=imread(str);
    cd ..
I=imresize(I,[256 256]);
I=im2double(I);
k=1;wn={'haar','db2','db4','dmey','bior1.1'};
for w=1:5                      % three wavelets 
for c=1:3                       % three band of colors
    T=I(:,:,c);
for i=1:6                       % six decomposition levels
[a1,b1,c1,d1]=dwt2(T,wn{w});
fv1(k,:)=my_feature(a1);          % extraction of features
T=a1;
k=k+1;
end
end
end
FT{ff}=fv1;
waitbar(ff/sz);
end
close(h);
fq=handles.fq;

for ii=1:length(FT)
    ft=FT{ii};    
    D(ii)=sum(sum(dist(ft(:)',fq(:))))/numel(I);
end
DD=sort(D);
for i=1:10
dx=find(DD(i)==D);
str=strcat(num2str(dx),'.jpg');
cd database
JJ{i}=imread(str);
cd ..
end
axes(handles.axes2);imshow(JJ{2});axes(handles.axes3);imshow(JJ{3});axes(handles.axes4);imshow(JJ{4});
axes(handles.axes5);imshow(JJ{5});axes(handles.axes6);imshow(JJ{6});axes(handles.axes7);imshow(JJ{7});
axes(handles.axes8);imshow(JJ{8});axes(handles.axes9);imshow(JJ{9});axes(handles.axes10);imshow(JJ{10});


% --- Executes on button press in pushbutton5.
function pushbutton5_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton5 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
fq=handles.fq;
F=dir('database');
F=char(F.name);
sz=size(F,1)-3;
h=waitbar(0,'Please wait the system is searching' );
g=[];
for i=1:4
g=[g repmat([i],1,10)];
end

三、运行结果

【图像检索】基于matlab GUI KNN图像检索【含Matlab源码 267期】_自动驾驶_06

四、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1]韩纪庆,张磊,郑铁然.语音信号处理(第3版)[M].清华大学出版社,2019.
[2]柳若边.深度学习:语音识别技术实践[M].清华大学出版社,2019.
[3]叶斌.基于HMM和PNN的语音情感识别研究.[J]青岛大学学报(工程技术版). 2011,26(04)