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存了每个样本点属于第几类。

猜你喜欢

转载自www.cnblogs.com/lolybj/p/10163666.html