【實踐】數據挖掘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(訓練數據集的分類標籤0、1、2...,M*1矩陣), testingSample(測試數據,1*N矩陣)
輸出參數:class(測試數據對應類別標籤)
算法流程:
1、得到訓練數據集trainingSamples的大小M,N
2、初始化Distance數組(M*1),用來存儲每個訓練樣本與測試樣本的距離。
3、對每一個訓練樣本trainingSamples(i,:)【for i=1:M】,計算其與測試樣本testingSample之間的距離,存儲在Distance(i)中。【計算兩個樣本之間的歐氏距離,調用函數dist_E(vect1,vect2),其中dist_E()爲自定義函數,參見上機練習2】
4、對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的大小M,N。
[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!
更多課程知識學習記錄隨後再來吧!
就醬,嘎啦!
注:
人生在勤,不索何獲。