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