1. 程式人生 > >K-medodis聚類演算法MATLAB

K-medodis聚類演算法MATLAB

國內部落格,上介紹實現的K-medodis方法為:

與K-means演算法類似。只是距離選擇與聚類中心選擇不同。

距離為曼哈頓距離

聚類中心選擇為:依次把一個聚類中的每一個點當作當前類的聚類中心,求出代價值最小的點當作當前聚類中心。

維基百科上,實現的方法為PAM演算法。

分成K類,把每個點都嘗試當作聚類中心,並求出當前組合聚類中心點組合的代價值。找到總最小代價值的中心點。

國內實現:

kMedoids.m程式碼:

function [cx,cost] = kMedoids(K,data,num)
%   生成將data聚成K類的最佳聚類
%   K為聚類數目,data為資料集,num為隨機初始化次數
    [cx,cost] 
= kMedoids1(K,data); for i = 2:num [cx1,min] = kMedoids1(K,data); if min<cost cost = min; cx = cx1; end end end function [cx,cost] = kMedoids1(K,data) % 把分類資料集data聚成K類 % [cx,cost] = kmeans(K,data) % K為聚類數目,data為資料集 % cx為樣本所屬聚類,cost為此聚類的代價值
% 選擇需要聚類的數目 % 隨機選擇聚類中心 centroids = data(randperm(size(data,1),K),:); % 迭代聚類 centroids_temp = zeros(size(centroids)); num = 0; while (~isequal(centroids_temp,centroids)&&num<20) centroids_temp = centroids; [cx,cost] = findClosest(data,centroids,K); centroids
= compueCentroids(data,cx,K); num = num+1; end % cost = cost/size(data,1); end function [cx,cost] = findClosest(data,centroids,K) % 將樣本劃分到最近的聚類中心 cost = 0; n = size(data,1); cx = zeros(n,1); for i = 1:n % 曼哈頓距離 [M,I] = min(sum(abs((data(i,:)-centroids))')); cx(i) = I; cost = cost+M; end end function centroids = compueCentroids(data,cx,K) % 計算新的聚類中心 centroids = zeros(K,size(data,2)); for i = 1:K % 尋找代價值最小的當前聚類中心 temp = data((cx==i),:); [~,I] = min(sum(squareform(pdist(temp)))); centroids(i,:) = temp(I,:); end end

Main.m

% 主函式

% 生成符合高斯分佈的資料
mu = [5,5];
sigma = [16,0;0,16];
sigma1 = [0.5,0;0,0.5];
data =  gaussianSample(8,50,mu,sigma,sigma1);

% 聚類
K = 6;
[cx,cost] = kMedoids(K,data,10);
plotMedoids(data,cx,K);

執行Main.m結果為: