在實驗中經常會需要計算k近鄰,為了避免多次重寫,這裡用matlab實現了乙個計算k近鄰的函式,該函式要求輸入兩個引數,第乙個引數就是資料矩陣,要求每行為乙個多維樣本點,第二個引數就是k值了。函式返回k近鄰矩陣。計算k近鄰比較好的一種演算法是利用kd樹,這裡暫且用的是易於理解的常規方法。使用kd樹的**將來補充。
具體**實現如下
function [ result ] = knn( data,k )
%計算k近鄰的乙個通用函式
%要求一行為乙個多維變數
%返回result為乙個矩陣,第i行為到第i個資料點的歐幾里得距離最短的k個資料點序號的排列,列序數越小距離越近
%計算knn用kd樹要更好一點,這個第一版暫時先用普通方法了
datasize = size(data);
distance = zeros(datasize(1),datasize(1));%距離矩陣,存放兩點之間的距離
%%%%
% 計算距離矩陣
%%%%%
for i = 1:datasize(1)-1
for j = i+1:datasize(1)
tempsum = 0;
for ci = 1:datasize(2)
tempsum = tempsum + (data(i,ci)-data(j,ci))*(data(i,ci)-data(j,ci));
enddistance(i,j) = sqrt(tempsum);
distance(j,i) = sqrt(tempsum);
end
endresult = zeros(datasize(1),k);%結果矩陣
%%%%
% 計算結果矩陣
%%%%%
for i = 1:datasize(1)
for j = 1:datasize(1)
if i==j
continue;
endindex = k;
while index>0 && result(i,index)==0
index = index-1;
end
if index == 0
result(i,1) = j;
else
if distance(i,j)0 && distance(i,j)使用的測試**如下所示
clc,clear
load('wine.mat')
data = wine(:,2:14);
result = knn(data,10)
計算結果如下所示
另外上面的測試方法其實是不太好的,最好是先將資料normlize一下。
計算乙個向量v在資料集矩陣data中的k近鄰**:
function [ result ] = vknn( v,data,k )
% 對乙個向量量v計算它在data中的k近鄰
% v是那個向量,data是資料集矩陣,k為近鄰數
% 要求向量是乙個行向量
datasize = size(data);
result = zeros(1,k);%結果向量
distance = zeros(datasize(1),1);%距離矩陣
%距離矩陣計算
下面是乙個使用vlfeat求k近鄰的乙個例子
clc,clear
x = rand(2,100);%一百個二維列向量
kdtree = vl_kdtreebuild(x);%構建kd樹
q = rand(2,1);
[index,distance] = vl_kdtreequery(kdtree, x, q);%返回x中與q最近的點
[index, distance] = vl_kdtreequery(kdtree, x, q, 'numneighbors', 10) ;%返回x中q的k的近鄰
k近鄰演算法matlab實現 K 近鄰演算法(一)
k 近鄰演算法是採用不同特徵之間的距離方法進行分類。優點 精度高 對異常值不敏感 無資料輸入假定 缺點 計算複雜度高 空間複雜度高 k 近鄰演算法的一般流程 1 收集資料集 可以使用任何方法 2 準備資料集 距離計算所需要的數值,最好是結構化的資料格式 3 分析資料 可以使用任何方法 4 訓練資料集...
K近鄰的MATLAB實現
參考 1 計算已知類別資料集合彙總的點與當前點的距離 2 按照距離遞增次序排序 3 選取與當前點距離最近的k個點 4 確定距離最近的前k個點所在類別的出現頻率 5 返回距離最近的前k個點中頻率最高的類別作為當前點的 分類 function relustlabel knn inx,data,label...
Matlab實現加權K近鄰
加權k近鄰是k近鄰的一種修正,當理解k近鄰之後,加權k近鄰則很好理解了,不說了,上 function label1 wknn training,testing,k row,column size training row1,column1 size testing 計算測試集與訓練集的距離 dist...