【实践】数据挖掘DM课程课业打卡实验1 相似度、距离、最近邻分类器


叮嘟!这里是小啊呜的学习课程资料整理。好记性不如烂笔头,今天也是努力进步的一天。一起加油进阶吧!
在这里插入图片描述

一、实验目的

(1)理解相似度、距离的度量方式。
(2)理解最近邻分类器的工作原理。

二、实验内容

1、编程实现任意给定两个相同维度的向量之间的欧氏距离计算函数dist_E(x,y)。

输入:两个任意k维向量x和y,其中k的值随由数据决定。如x=[3,20,3.5], y=[-3,34,7]。

测试代码如下:

x=[3,20,3.5]; y=[-3,34,7];
dist=dist_E(x,y);

(备注:代码粘贴在此处)

function dist = dist_E(x ,y)
dist=[];
if(length(x)~=length(y))
    disp('The length of the vectors must agree!')
else
    t=(x-y).*(x-y);
    dist=sqrt(sum(t));
end
end

在这里插入图片描述

2、编程实现任意给定两个相同维度的向量之间的夹角余弦相似度计算函数sim=sim_COS(x,y)。

输入:两个任意k维向量x和y,其中k的值随由数据决定。

测试代码如下:

x=[3,20,3.5]; y=[-3,34,7];
sim=sim_COS(x,y);

(备注:代码粘贴在此处)

function sim=sim_COS(x,y)
sim=[];
if(length(x)~=length(y))
    disp('The length of the vectors must agree!')
else
    sim=sum(x.*y)/(sqrt(sum(x.*x))*sqrt(sum(y.*y)))
end
end
 

在这里插入图片描述

3、训练数据见trainingData.mat,测试数据见testingData.mat。编程实现K最近邻算法。

函数为:[class]=KNN_Classify_E(trainingSamples, trainingLabels, testingSample,k)。

测试代码如下:

load('testingData.mat');
load('trainingData.mat');
%[trAttr]=normalize(trAttr);
%[tstAttr]=normalize(tstAttr);
k=3;
predictlabel =zeros(length(tstLabels),1);
for i=1:length(tstLabels)
   predictlabel(i) =KNN_Classify_E(trAttr, trLabels ,tstAttr(i,:) ,k);   
end
accurate =sum(predictlabel==tstLabels)/length(tstLabels);
disp(accurate);

KNN_Classify_E函数的处理流程与说明如下:

输入参数:k值、trainingSamples(训练数据集,M*N矩阵,M为样本数,N为属性数)、trainingLabels(训练数据集的分类标签012...M*1矩阵), testingSample(测试数据,1*N矩阵)
输出参数:class(测试数据对应类别标签)
算法流程:
1、得到训练数据集trainingSamples的大小MN
2、初始化Distance数组(M*1),用来存储每个训练样本与测试样本的距离。
3、对每一个训练样本trainingSamples(i,:)for i=1:M】,计算其与测试样本testingSample之间的距离,存储在Distance(i)中。【计算两个样本之间的欧氏距离,调用函数dist_E(vect1,vect2),其中dist_E()为自定义函数,参见上机练习24、对Distance数组排升序【sort函数】
5、取得排序前K个距离对应的序号,将序号对应的训练数据的分类标签得到赋给labs 
6、得到labs数组的不重复元素,存储在数组All_labs 【unique函数】
7、得到不重复元素(数组All_labs )的个数LabNum
8、 (for i=1: LabNum )对每一个不重复的分类标签All_labs(i) ,查找【find函数】最近的k个类别标签labs中,等于All_labs(i)的有几个,将该数目作为第i类的投票数Vote(i)
9、求投票数Vote(i)的最大值所在的索引ind
10、All_labs(ind)是最大投票数对应的类别标签,即为算法输出结果class

函数[class]=KNN_Classify_E(trainingSamples, trainingLabels, testingSample,k):
(将执行正确的代码粘贴在此处,核心代码要求有注释)

function [class] = KNN_Classify_E(trainingSamples, trainingLabels, testingSample,k)
%1、得到训练数据集trainingSamples的大小MN[M,N] = size(trainingSamples); 
%2、初始化Distance数组(M*1),用来存储每个训练样本与测试样本的距离。
Distance = zeros(M,1);
%3、对每一个训练样本trainingSamples(i,:)for i=1:M】,计算其与测试样本testingSample之间的距离,存储在Distance(i)中。
for i=1:M 
    training = trainingSamples(i,:); 
    Distance(i) = dist_E(training,testingSample); 
% dist_E为欧氏距离计算函数 
end 
%4、对Distance数组排升序【sort函数】
[val ind] = sort(Distance); 
% sort函数默认升序,此处有两个输出参数,val:距离排序后的值,ind:val中每个元素在原矩阵Distance中的位置 
%5、取得排序前K个距离对应的序号,将序号对应的训练数据的分类标签得到赋给labs 
labs = trainingLabels(ind(1:k)); 
% 6、得到labs数组的不重复元素,存储在数组All_labs 【unique函数】
All_labs = unique(labs); 
%7、得到不重复元素(数组All_labs )的个数LabNum。
LabNum = length(All_labs); 
%8、 (for i=1: LabNum )对每一个不重复的分类标签All_labs(i)%查找【find函数】最近的k个类别标签labs中,等于All_labs(i)的有几个,将该数目作为第i类的投票数Vote(i)
for i=1:LabNum 
    Vote(i) = length(find(labs==All_labs(i)));
end 
 %9、求投票数Vote(i)的最大值所在的索引ind 
[val ind] = max(Vote); 
%10、All_labs(ind)是最大投票数对应的类别标签,即为算法输出结果class
class = All_labs(ind); 
end

在这里插入图片描述
在这里插入图片描述

4、选做题:函数[Samples2]=normalize(Samples):

(将执行正确的代码粘贴在此处,核心代码要求有注释)

function [Samples2]=normalize(Samples) 
%样本数据在代入算法之前都应该进行归一化
[M,N] = size(Samples); 
Samples2 = zeros(M,N); 
for i=1:N 
    allAtr = Samples(:,i); 
    STD = std(allAtr); 
    % 求标准差 
    MEAN = mean(allAtr); 
    % 求均值 
    x = (allAtr-MEAN)/STD; 
    Samples2(:,i)=x; 
end
end

在这里插入图片描述

Ending!
更多课程知识学习记录随后再来吧!

就酱,嘎啦!

在这里插入图片描述

注:
人生在勤,不索何获。

猜你喜欢

转载自blog.csdn.net/qq_43543789/article/details/106622067
今日推荐