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

K-modes聚類演算法MATLAB

K-modes演算法主要用於分類資料,如 國籍,性別等特徵。

距離使用漢明距離,即有多少對應特徵不同則距離為幾。

中心點計算為,選擇眾數作為中心點。

主要功能:

隨機初始化聚類中心,計算聚類。

選擇每次聚類次數,選擇最佳聚類初始化。

kmodes.m程式碼

function [cx,cost] = kmodes(K,data,num)
% 生成將data聚成K類的最佳聚類
%   K為聚類數目,data為資料集,num為隨機初始化次數
    [cx,cost] = kmodes1(K,data);
    for i = 2:num
        [cx1,min] = kmodes1(K,data);
        
if min<cost cost = min; cx = cx1; end end end function [cx,cost] = kmodes1(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((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 % 眾數為聚類中心 centroids(i,:) = mode(data(cx==i,:)); end end

Main.m

% 生成分類資料集
data = randi(3,40,2);
% 生成最佳聚類
K = 3;
[cx,cost] = kmodes(K,data,10);

 

執行Main.m,返回聚類的代價值。與聚類結果。cx存了每個樣本點屬於第幾類。