ISODATA聚类算法的matlab程序

作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/

参考:Kmeans及ISODATA算法的matlab实现

算法简介:聚类算法:ISODATA算法

数据见:MATLAB实例:PCA降维中的iris数据集,保存为:iris.data,最后一列是类标签。

demo_isodata.m

clear
clc
data_load=dlmread('iris.data');
[~,dim]=size(data_load);
x=data_load(:,1:dim-1);
K=3;
theta_N=1;
theta_S=1;
theta_c=4;
L=1;
I=5;
ISODATA(x,K,theta_N,theta_S,theta_c,L,I)

ISODATA.m

function ISODATA(x,K,theta_N,theta_S,theta_c,L,I)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%input parameters%%%%%%
% x : data
% K : 预期的聚类中心数
% theta_N : 每一聚类中心中最少的样本数,少于此数就不作为一个独立的聚类
% theta_S :一个聚类中样本距离分布的标准差
% theta_c : 两聚类中心之间的最小距离,如小于此数,两个聚类进行合并
% L : 在一次迭代运算中可以和并的聚类中心的最多对数
% I :迭代运算的次数序号
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% step1
n = size(x,1);
N_c = K;
mean = cell(K,1);
for i=1:K
mean{i} = x(i,:);
end
ite = 1;
while ite<I
flag = 1;
while flag
%% step2
class = cell(size(mean));
for i=1:n
num = Belong2(x(i,:),mean);
class{num} = [class{num};x(i,:)];
end
%% step3
for i=1:N_c
size_i = size(class{i},1);
if size_i<theta_N
class_i = class{i};
mean = DeleteRow(mean,i);
class = DeleteRow(class,i);
N_c = N_c-1;
for j=1:size_i
class_ij = class_i(j,:);%the j'th row of class{i}
num = Belong2(class_ij,mean);
class{num} = [class{num};class_ij];
end
end
end %% step4
for i=1:N_c
if ~isempty(mean{i})
mean{i} = sum(class{i})./size(class{i},1);
end
end
%% step5
Dis = zeros(N_c,1);
for i=1:N_c
if ~isempty(class{i})
N_i =size(class{i},1);
tmp = bsxfun(@minus,class{i},mean{i});
Dis(i) = sum(arrayfun(@(x)norm(tmp(x,:)),1:N_i))/N_i;
end
end
%% step6
D = 0;
for i=1:N_c
if ~isempty(class{i})
N_i =size(class{i},1);
D = D + N_i*Dis(i);
end
end
D = D/n;
%% step7
flag = 0;
if ite == I
theta_c = 0;
flag = 0;
elseif ~(N_c > K/2)
flag = 1;
elseif mod(ite,2)==0 || ~(N_c<2*K)
flag = 0;
end
%% 分裂处理
%% step8
if flag
flag = 0;
delta = cell(N_c,1);
for i=1:N_c
if ~isempty(class{i})
N_i =size(class{i},1);
tmp = bsxfun(@minus,class{i},mean{i});
delta{i} = arrayfun(@(x)norm(tmp(:,x)),1:size(tmp,2))/N_i;
end
end %% step9
delta_max = cell(N_c,1);
for i=1:N_c
if ~isempty(class{i})
max_i = max(delta{i});
sub = find(delta{i}==max_i,1);
delta_max{i} = [max_i,sub];
end
end
%% step10
for i=1:N_c
if delta_max{i}(1) > theta_S
N_i =size(class{i},1);
con1 = (Dis(i)>D && N_i>2*(theta_N + 1));
con2 = ~(N_c>K/2);
if con1 || con2
%%%%这里分裂%%%%%
flag = 1;%一旦发生分裂,那么分裂一次后就返回第二步;若没发生分裂,则直接进入合并处理步
lamda = 0.5;
max_sub = delta_max{i}(2);
mean{i}(max_sub) = mean{i}(max_sub) + lamda * delta_max{i}(1);
addOneMean = mean{i};
addOneMean(max_sub) = addOneMean(max_sub) - lamda * delta_max{i}(1);
mean = [mean;addOneMean];
N_c = N_c+1;
break;
end
end
end end end
%% 合并处理
if L
%% step11
Distance = zeros(N_c,N_c);
for i=1:N_c-1
for j=i:N_c
Distance(i,j) = norm(mean{i}-mean{j});
end
end
%% step12
index = find(-Distance>theta_c);
keepIndex = [Distance(index),index];
[~, index] = sort(keepIndex(:,1));
if size(index,1) > L
index = index(1:L,:);
end
%% step13
if size(index,1) ~= 0
for id=1:size(index,1)
[m_i m_j]= seq2idx(index(id),N_c);
%%%%%这里合并%%%%%
N_mi = size(class{m_i},1);
N_mj = size(class{m_j},1);
mean{m_i} = (N_mi*mean{m_i} + N_mj*mean{m_j})/(N_mi+N_mj);
mean = DeleteRow(mean,m_j);
class{m_i} = [class{m_i};class{m_j}];
class = DeleteRow(class,m_j);
end
end
end
%% step14
ite=ite+1;
end
for i=1:N_c
fprintf('第%d类聚类中心为\n',i);
disp(mean{i});
fprintf('第%d类中元素为\n',i);
disp(class{i});
end
end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function number = Belong2(x_i,means)
INF = 10000;
min = INF;
kk = size(means,1);
number = 1;
for i=1:kk
if ~isempty(means{i})
if norm(x_i - means{i}) < min
min = norm(x_i - means{i});
number = i;
end
end
end
end function A_del = DeleteRow(A,r)
n = size(A,1);
if r == 1
A_del = A(2:n,:);
elseif r == n
A_del = A(1:n-1,:);
else
A_del = [A(1:r-1,:);A(r+1:n,:)];
end
end function [row col] = seq2idx(id,n)
if mod(id,n)==0
row = n;
col = id/n;
else
row = mod(id,n);
col = ceil(id/n);
end
end

结果

>> demo_isodata
第1类聚类中心为
6.6016 2.9857 5.3841 1.9159 第1类中元素为
7.0000 3.2000 4.7000 1.4000
6.4000 3.2000 4.5000 1.5000
6.9000 3.1000 4.9000 1.5000
6.5000 2.8000 4.6000 1.5000
6.3000 3.3000 4.7000 1.6000
6.6000 2.9000 4.6000 1.3000
6.7000 3.1000 4.4000 1.4000
5.9000 3.2000 4.8000 1.8000
6.3000 2.5000 4.9000 1.5000
6.6000 3.0000 4.4000 1.4000
6.8000 2.8000 4.8000 1.4000
6.7000 3.0000 5.0000 1.7000
6.0000 2.7000 5.1000 1.6000
6.7000 3.1000 4.7000 1.5000
6.3000 3.3000 6.0000 2.5000
5.8000 2.7000 5.1000 1.9000
7.1000 3.0000 5.9000 2.1000
6.3000 2.9000 5.6000 1.8000
6.5000 3.0000 5.8000 2.2000
7.6000 3.0000 6.6000 2.1000
7.3000 2.9000 6.3000 1.8000
6.7000 2.5000 5.8000 1.8000
7.2000 3.6000 6.1000 2.5000
6.5000 3.2000 5.1000 2.0000
6.4000 2.7000 5.3000 1.9000
6.8000 3.0000 5.5000 2.1000
5.7000 2.5000 5.0000 2.0000
5.8000 2.8000 5.1000 2.4000
6.4000 3.2000 5.3000 2.3000
6.5000 3.0000 5.5000 1.8000
7.7000 3.8000 6.7000 2.2000
7.7000 2.6000 6.9000 2.3000
6.0000 2.2000 5.0000 1.5000
6.9000 3.2000 5.7000 2.3000
5.6000 2.8000 4.9000 2.0000
7.7000 2.8000 6.7000 2.0000
6.3000 2.7000 4.9000 1.8000
6.7000 3.3000 5.7000 2.1000
7.2000 3.2000 6.0000 1.8000
6.2000 2.8000 4.8000 1.8000
6.1000 3.0000 4.9000 1.8000
6.4000 2.8000 5.6000 2.1000
7.2000 3.0000 5.8000 1.6000
7.4000 2.8000 6.1000 1.9000
7.9000 3.8000 6.4000 2.0000
6.4000 2.8000 5.6000 2.2000
6.3000 2.8000 5.1000 1.5000
6.1000 2.6000 5.6000 1.4000
7.7000 3.0000 6.1000 2.3000
6.3000 3.4000 5.6000 2.4000
6.4000 3.1000 5.5000 1.8000
6.0000 3.0000 4.8000 1.8000
6.9000 3.1000 5.4000 2.1000
6.7000 3.1000 5.6000 2.4000
6.9000 3.1000 5.1000 2.3000
5.8000 2.7000 5.1000 1.9000
6.8000 3.2000 5.9000 2.3000
6.7000 3.3000 5.7000 2.5000
6.7000 3.0000 5.2000 2.3000
6.3000 2.5000 5.0000 1.9000
6.5000 3.0000 5.2000 2.0000
6.2000 3.4000 5.4000 2.3000
5.9000 3.0000 5.1000 1.8000 第2类聚类中心为
5.6838 2.6784 4.0919 1.2676 第2类中元素为
5.5000 2.3000 4.0000 1.3000
5.7000 2.8000 4.5000 1.3000
4.9000 2.4000 3.3000 1.0000
5.2000 2.7000 3.9000 1.4000
5.0000 2.0000 3.5000 1.0000
5.9000 3.0000 4.2000 1.5000
6.0000 2.2000 4.0000 1.0000
6.1000 2.9000 4.7000 1.4000
5.6000 2.9000 3.6000 1.3000
5.6000 3.0000 4.5000 1.5000
5.8000 2.7000 4.1000 1.0000
6.2000 2.2000 4.5000 1.5000
5.6000 2.5000 3.9000 1.1000
6.1000 2.8000 4.0000 1.3000
6.1000 2.8000 4.7000 1.2000
6.4000 2.9000 4.3000 1.3000
6.0000 2.9000 4.5000 1.5000
5.7000 2.6000 3.5000 1.0000
5.5000 2.4000 3.8000 1.1000
5.5000 2.4000 3.7000 1.0000
5.8000 2.7000 3.9000 1.2000
5.4000 3.0000 4.5000 1.5000
6.0000 3.4000 4.5000 1.6000
6.3000 2.3000 4.4000 1.3000
5.6000 3.0000 4.1000 1.3000
5.5000 2.5000 4.0000 1.3000
5.5000 2.6000 4.4000 1.2000
6.1000 3.0000 4.6000 1.4000
5.8000 2.6000 4.0000 1.2000
5.0000 2.3000 3.3000 1.0000
5.6000 2.7000 4.2000 1.3000
5.7000 3.0000 4.2000 1.2000
5.7000 2.9000 4.2000 1.3000
6.2000 2.9000 4.3000 1.3000
5.1000 2.5000 3.0000 1.1000
5.7000 2.8000 4.1000 1.3000
4.9000 2.5000 4.5000 1.7000 第3类聚类中心为
5.0060 3.4180 1.4640 0.2440 第3类中元素为
5.1000 3.5000 1.4000 0.2000
4.9000 3.0000 1.4000 0.2000
4.7000 3.2000 1.3000 0.2000
4.6000 3.1000 1.5000 0.2000
5.0000 3.6000 1.4000 0.2000
5.4000 3.9000 1.7000 0.4000
4.6000 3.4000 1.4000 0.3000
5.0000 3.4000 1.5000 0.2000
4.4000 2.9000 1.4000 0.2000
4.9000 3.1000 1.5000 0.1000
5.4000 3.7000 1.5000 0.2000
4.8000 3.4000 1.6000 0.2000
4.8000 3.0000 1.4000 0.1000
4.3000 3.0000 1.1000 0.1000
5.8000 4.0000 1.2000 0.2000
5.7000 4.4000 1.5000 0.4000
5.4000 3.9000 1.3000 0.4000
5.1000 3.5000 1.4000 0.3000
5.7000 3.8000 1.7000 0.3000
5.1000 3.8000 1.5000 0.3000
5.4000 3.4000 1.7000 0.2000
5.1000 3.7000 1.5000 0.4000
4.6000 3.6000 1.0000 0.2000
5.1000 3.3000 1.7000 0.5000
4.8000 3.4000 1.9000 0.2000
5.0000 3.0000 1.6000 0.2000
5.0000 3.4000 1.6000 0.4000
5.2000 3.5000 1.5000 0.2000
5.2000 3.4000 1.4000 0.2000
4.7000 3.2000 1.6000 0.2000
4.8000 3.1000 1.6000 0.2000
5.4000 3.4000 1.5000 0.4000
5.2000 4.1000 1.5000 0.1000
5.5000 4.2000 1.4000 0.2000
4.9000 3.1000 1.5000 0.1000
5.0000 3.2000 1.2000 0.2000
5.5000 3.5000 1.3000 0.2000
4.9000 3.1000 1.5000 0.1000
4.4000 3.0000 1.3000 0.2000
5.1000 3.4000 1.5000 0.2000
5.0000 3.5000 1.3000 0.3000
4.5000 2.3000 1.3000 0.3000
4.4000 3.2000 1.3000 0.2000
5.0000 3.5000 1.6000 0.6000
5.1000 3.8000 1.9000 0.4000
4.8000 3.0000 1.4000 0.3000
5.1000 3.8000 1.6000 0.2000
4.6000 3.2000 1.4000 0.2000
5.3000 3.7000 1.5000 0.2000
5.0000 3.3000 1.4000 0.2000

2019-10-10 16:10:14

ISODATA聚类算法的matlab程序的更多相关文章

  1. canopy聚类算法的MATLAB程序

    canopy聚类算法的MATLAB程序 凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 1. canopy聚类算法简介 Canopy聚类算法是一个将对象分组到 ...

  2. mean shift聚类算法的MATLAB程序

    mean shift聚类算法的MATLAB程序 凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 1. mean shift 简介 mean shift, 写的 ...

  3. KFCM算法的matlab程序(用FCM初始化聚类中心)

    KFCM算法的matlab程序(用FCM初始化聚类中心) 在“聚类——KFCM”这篇文章中已经介绍了KFCM算法,现在用matlab程序对iris数据库进行实现,用FCM初始化聚类中心,并求其准确度与 ...

  4. GMM算法的matlab程序

    GMM算法的matlab程序 在“GMM算法的matlab程序(初步)”这篇文章中已经用matlab程序对iris数据库进行简单的实现,下面的程序最终的目的是求准确度. 作者:凯鲁嘎吉 - 博客园 h ...

  5. GMM算法的matlab程序(初步)

    GMM算法的matlab程序 在https://www.cnblogs.com/kailugaji/p/9648508.html文章中已经介绍了GMM算法,现在用matlab程序实现它. 作者:凯鲁嘎 ...

  6. 聚类——GAKFCM的matlab程序

    聚类——GAKFCM的matlab程序 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 在聚类——GAKFCM文章中已介绍了GAKFCM算法的理论知识, ...

  7. 聚类——WKFCM的matlab程序

    聚类——WKFCM的matlab程序 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 在聚类——WKFCM文章中已介绍了WKFCM算法的理论知识,现在用 ...

  8. 聚类——KFCM的matlab程序

    聚类——KFCM的matlab程序 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 在聚类——KFCM文章中已介绍了KFCM-F算法的理论知识,现在用m ...

  9. 聚类——FCM的matlab程序

    聚类——FCM的matlab程序 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 在聚类——FCM文章中已介绍了FCM算法的理论知识,现在用matlab ...

随机推荐

  1. Java后端,最全知识点

    你可能有所感悟.零散的资料读了很多,但是很难有提升.到处是干货,但是并没什么用,简单来说就是缺乏系统化.另外,噪音太多,雷同的框架一大把,我不至于全都要去学了吧. 这里,根据基础.Java基础.Jav ...

  2. [logstash.outputs.elasticsearch] retrying failed action with response code: 403

    0x00 Event [2019-09-24T19:22:31,655][INFO ][logstash.outputs.elasticsearch] retrying failed action w ...

  3. Android 查看项目依赖树的四种方式

    Android 查看项目依赖树的四种方式: 方式一: ./gradlew 模块名:dependencies //查看单独模块的依赖 ./gradlew :app:dependencies --conf ...

  4. 43-安装 Docker Machine

    前面我们的实验环境中只有一个 docker host,所有的容器都是运行在这一个 host 上的.但在真正的环境中会有多个 host,容器在这些 host 中启动.运行.停止和销毁,相关容器会通过网络 ...

  5. MySQL数据篇(九)--存储过程实现定时每天清理过期数据

    需求:有一个活动记录表 t_ad ,商家每次发起一个活动,就会在 t_shake_devices_relation 表里面生成一些关联记录.现在写一个存储过程实现,如果活动过期,就将关联表里面的数据标 ...

  6. 激活windows操作系统的命令行指令

    1.开始菜单中搜索命令提示符,右键管理员运行 2.为了避免激活的失败,首先卸载已经过期的密钥 输入以下命令:slmgr.vbs /upk 回车确认之后会弹出提示“已成功卸载了产品密钥” 3.下一步是将 ...

  7. LeetCode 5126. 有序数组中出现次数超过25%的元素 Element Appearing More Than 25% In Sorted Array

    地址 https://leetcode-cn.com/contest/biweekly-contest-15/problems/element-appearing-more-than-25-in-so ...

  8. Codeforces Round #599 (Div. 2) B1. Character Swap (Easy Version) 水题

    B1. Character Swap (Easy Version) This problem is different from the hard version. In this version U ...

  9. ModelAndView重定向带参数解决方法

    业务场景:SpringMVC项目使用ModelAndView进行重定向跳转到另外一个action时,需要在url后面带上参数 如果是带参数带一个页面,直接用modelAndView.addObject ...

  10. solidity定长数组和动态数组

    固定长度的数组 固定长度数组声明 直接在定义数组的时候声明固定长度数组的值: uint[5] fixedArr = [1,2,3,4,5]; 可通过数组的length属性来获得数组的长度,进而进行遍历 ...