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存了每個樣本點屬於第幾類。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM