聚类——GAKFCM的matlab程序

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

聚类——GAKFCM文章中已介绍了GAKFCM算法的理论知识,现在用matlab进行实现,下面这个例子是用GA初始化聚类中心。

1.matlab程序

GAKFCM_main.m

function [ave_acc_GAKFCM,max_acc_GAKFCM,min_acc_GAKFCM,ave_iter_GA,ave_iter_KFCM,ave_run_time]=GAKFCM_main(X,real_label,K)
%输入K:聚的类,max_iter是最大迭代次数,T:遗传算法最大迭代次数,n:种群个数, X:没有进行归一化
%输出ave_acc_KFCM:迭代max_iter次之后的平均准确度,iter:实际KFCM迭代次数
t0=cputime;
max_iter=20;
s=0;
s_1=0;
s_2=0;
iter_GA=zeros(max_iter,1);
iter_KFCM=zeros(max_iter,1);
accuracy=zeros(max_iter,1);
for i=1:max_iter
[label, iter_KFCM(i), ~,iter_GA(i)]=My_GAKFCM(X,K);
accuracy(i)=succeed(real_label,K,label);
s=s+accuracy(i);
s_1=s_1+iter_GA(i);
s_2=s_2+iter_KFCM(i);
fprintf('第 %2d 次,GA的迭代次数为:%2d,KFCM的迭代次数为:%2d,准确度为:%.8f\t\n', i, iter_GA(i), iter_KFCM(i), accuracy(i));
end
ave_acc_GAKFCM=s/max_iter;
max_acc_GAKFCM=max(accuracy);
min_acc_GAKFCM=min(accuracy);
ave_iter_GA=s_1/max_iter;
ave_iter_KFCM=s_2/max_iter;
run_time=cputime-t0;
ave_run_time=run_time/max_iter;

My_GAKFCM.m

function  [label, iter_KFCM, para_miu,iter_GA]=My_GAKFCM(X,K)
%用GA初始聚类中心
%输入K:聚类数,X:数据集
%输出:label:聚的类, para_miu:模糊聚类中心μ,iter_KFCM:KFCM迭代次数
format long
eps=1e-4; %定义迭代终止条件的eps
alpha=2; %模糊加权指数,[1,+无穷)
T=100; %最大迭代次数
%sigma_2=2^(-4); %高斯核函数的参数2*sigma^2
sigma_2=150; %高斯核函数的参数sigma^2
[X_num,X_dim]=size(X);
fitness=zeros(X_num,1); %目标函数
responsivity=zeros(X_num,K); %隶属函数
R_up=zeros(X_num,K); %隶属函数的分子部分
count=zeros(X_num,1); %统计distant中每一行为0的个数
%随机初始化K个聚类中心
% [X_num,~]=size(X);
% rand_array=randperm(X_num); %产生1~X_num之间整数的随机排列
% para_miu=X(rand_array(1:K),:); %随机排列取前K个数,在X矩阵中取这K行作为初始聚类中心
%用GA初始聚类中心
[para_miu,iter_GA]=my_genetic(X,K);
% KFCM算法
for t=1:T
%欧氏距离,计算(X-para_miu)^2=X^2+para_miu^2-2*para_miu*X',矩阵大小为X_num*K
distant=(sum(X.*X,2))*ones(1,K)+ones(X_num,1)*(sum(para_miu.*para_miu,2))'-2*X*para_miu';
%高斯核函数,X_num*K的矩阵
kernel_fun=exp((-distant)./(sigma_2));
%更新隶属度矩阵X_num*K
for i=1:X_num
count(i)=sum(kernel_fun(i,:)==1);
if count(i)>0
for k=1:K
if kernel_fun(i,k)==1
responsivity(i,k)=1./count(i);
else
responsivity(i,k)=0;
end
end
else
R_up(i,:)=(1-kernel_fun(i,:)).^(-1/(alpha-1)); %隶属度矩阵的分子部分
responsivity(i,:)= R_up(i,:)./sum( R_up(i,:),2);
end
end
%目标函数值
fitness(t)=2*sum(sum((ones(X_num,K)-kernel_fun).*(responsivity.^(alpha))));
%更新聚类中心K*X_dim
miu_up=(kernel_fun.*(responsivity.^(alpha)))'*X; %μ的分子部分
para_miu=miu_up./(sum(kernel_fun.*(responsivity.^(alpha)))'*ones(1,X_dim));
if t>1
if abs(fitness(t)-fitness(t-1))<eps
break;
end
end
end
iter_KFCM=t; %实际迭代次数
[~,label]=max(responsivity,[],2);

succeed.m

function accuracy=succeed(real_label,K,id)
%输入K:聚的类,id:训练后的聚类结果,N*1的矩阵
N=size(id,1); %样本个数
p=perms(1:K); %全排列矩阵
p_col=size(p,1); %全排列的行数
new_label=zeros(N,p_col); %聚类结果的所有可能取值,N*p_col
num=zeros(1,p_col); %与真实聚类结果一样的个数
%将训练结果全排列为N*p_col的矩阵,每一列为一种可能性
for i=1:N
for j=1:p_col
for k=1:K
if id(i)==k
new_label(i,j)=p(j,k); %iris数据库,1 2 3
end
end
end
end
%与真实结果比对,计算精确度
for j=1:p_col
for i=1:N
if new_label(i,j)==real_label(i)
num(j)=num(j)+1;
end
end
end
accuracy=max(num)/N;

my_genetic.m

function [para_miu_new,iter]=my_genetic(data,K)
%data:数据集,K:聚类数
pc_0=0.6; %初始交叉概率
pm_0=0.1; %初始变异概率
eps=1e-4; %定义迭代终止条件的eps
n=50; %n:n个初始个体,每个个体为K*X_dim
T=100; %T:最大迭代次数
pc=zeros(T,1); %交叉概率
pm=zeros(T,1); %变异概率
fitness=zeros(n,1);
ave_fitness=zeros(T,1);
%实数编码
%对data做最大-最小归一化处理
[data_num,~]=size(data);
X=(data-ones(data_num,1)*min(data))./(ones(data_num,1)*(max(data)-min(data)));
%产生初始种群
population=init_population(X,K,n);
for t=1:T
%更新适应度
fitness=fit_vector(X,K,population,n);
%非线性排序选择
population=sort_select(population,fitness);
%计算交叉概率,进行交叉操作
pc(t)=pc_0*(1-(t-1)/T);
population=crossover(population,pc(t));
%计算变异概率,进行变异操作
pm(t)=pm_0*(1-(t-1)/T);
population=mutation(population,pm(t));
ave_fitness(t)=sum(fitness)/n;
if t>1
if abs( ave_fitness(t)- ave_fitness(t-1))<eps
break;
end
end
end
iter=t; %实际迭代次数
%输出适应度最大的个体
[~,index_final]=max(fitness);
para_miu=population(:,:,index_final);
%解码para_miu
para_miu_new=para_miu.*(ones(K,1)*(max(data)-min(data)))+ones(K,1)*min(data);

init_population.m

function population=init_population(X,K,n)
%data:数据集,K:聚类数,n:n个初始个体,每个个体为K*X_dim,new_index为排序后的个体序号
rand_num=3; %rand_num:随机取rand_num个样本作为一类
[X_num,X_dim]=size(X);
individual=zeros(K,X_dim); %individual为聚类中心矩阵,K*X_dim的矩阵
population=zeros(K,X_dim,n);
for i=1:n
%随机初始化K个聚类中心
for k=1:K
rand_array=randperm(X_num); %产生1~X_num之间整数的随机排列
temp=X(rand_array(1:rand_num),:);
individual(k,:)=sum(temp)./rand_num; %individual(k)为1*X_dim的矩阵,为一类的聚类中心,对rand_num取平均
end
population(:,:,i)=individual;
end

fit_vector.m

function fitness=fit_vector(X,K,population,n)
fitness=zeros(n,1);
for i=1:n
%计算个体适应度
fitness(i)=fitness_value(X,K,population(:,:,i)); %fitness为GAKFCM适应度函数 n*1的矩阵
end

fitness_value.m

function fitness=fitness_value(X,K,para_miu)
%X是数据,para_miu为每一个individual矩阵,K*X_dim,fitness为GAKFCM适应度函数
%sigma_2=2^(-4); %高斯核函数的参数2*sigma^2
sigma_2=150; %高斯核函数的参数sigma^2
alpha=2; %模糊加权指数,[1,+无穷)
[X_num,~]=size(X);
responsivity=zeros(X_num,K); %隶属函数
R_up=zeros(X_num,K);
count=zeros(X_num,1); %统计distant中每一行为0的个数
%欧氏距离,计算(X-para_miu)^2=X^2+para_miu^2-2*para_miu*X',矩阵大小为X_num*K
distant=(sum(X.*X,2))*ones(1,K)+ones(X_num,1)*(sum(para_miu.*para_miu,2))'-2*X*para_miu';
%高斯核函数,X_num*K的矩阵
kernel_fun=exp((-distant)./(sigma_2));
%更新隶属度矩阵X_num*K
for i=1:X_num
count(i)=sum(kernel_fun(i,:)==1);
if count(i)>0
for k=1:K
if kernel_fun(i,k)==1
responsivity(i,k)=1./count(i);
else
responsivity(i,k)=0;
end
end
else
R_up(i,:)=(1-kernel_fun(i,:)).^(-1/(alpha-1)); %隶属度矩阵的分子部分
responsivity(i,:)= R_up(i,:)./sum( R_up(i,:),2);
end
end
%目标函数值
fitness_KFCM=2*sum(sum((ones(X_num,K)-kernel_fun).*(responsivity.^(alpha)))); %KFCM的目标函数
fitness=1/(1+fitness_KFCM); %fitness为GAKFCM适应度函数

sort_select.m

function population=sort_select(population,fitness)
%q属于(0,1)为参数, i表示排序序号,本文取q=0.1
q=0.1;
[n,~]=size(fitness);
new_index=zeros(n,1); %选择之后最优个体的序号
fun=zeros(n,1); %非线性排序选择概率分布函数
add_pro=zeros(n,1); %累积概率
[~,index_fit]=sort(fitness,'descend'); %将fitness按降序排序
%计算每个个体选择的概率
for i=1:n
fun(i)=q*(1-q)^(i-1);
end
new_fun=fun/sum(fun);
%求累积概率
for i=1:n
add_pro(i)=sum(new_fun(1:i));
end
%选择最优个体,求其在X中的顺序
for t=1:n
rand_pro=rand(); %[0,1]之间的随机数
if rand_pro<=add_pro(1)
new_index(t)=index_fit(1);
end
for i=2:n
if (rand_pro>add_pro(i-1))&&(rand_pro<=add_pro(i))
new_index(t)=index_fit(i);
end
end
population(:,:,t)=population(:,:,new_index(t));
end

crossover.m

function population=crossover(population,pc)
%个体之间进行交叉操作,交换两行
[K,~,n]=size(population);
num=floor(n/2); %对n/2向下取整
for i=1:num
rand_c=rand(); %[0,1]之间的随机数
rand_pro=unidrnd(K); %[1,K]之间的随机整数
%交换两个矩阵中的第rand_pro行
if pc>rand_c
t=population(rand_pro,:,2*i-1);
population(rand_pro,:,2*i-1)=population(rand_pro,:,2*i);
population(rand_pro,:,2*i)=t;
end
end

mutation.m

function population=mutation(population,pm)
%个体进行变异操作
[K,X_dim,n]=size(population);
for i=1:n
rand_m=rand(); %[0,1]之间的随机数
rand_pro=unidrnd(K); %[1,K]之间的随机整数
if pm>rand_m
%对第rand_pro行进行变异操作
population(rand_pro,:,i)=rand(1,X_dim);
end
end

2.在UCI数据库的iris上的运行结果

>> data_load=dlmread('E:\My matlab\database\iris.data');data=data_load(:,1:4);real_label=data_load(:,5);
>> [ave_acc_GAKFCM,max_acc_GAKFCM,min_acc_GAKFCM,ave_iter_GA,ave_iter_KFCM,ave_run_time]=GAKFCM_main(data,real_label,3)
第 1 次,GA的迭代次数为:10,KFCM的迭代次数为: 6,准确度为:0.89333333
第 2 次,GA的迭代次数为: 3,KFCM的迭代次数为:13,准确度为:0.89333333
第 3 次,GA的迭代次数为:39,KFCM的迭代次数为: 8,准确度为:0.89333333
第 4 次,GA的迭代次数为:66,KFCM的迭代次数为:10,准确度为:0.89333333
第 5 次,GA的迭代次数为:18,KFCM的迭代次数为: 8,准确度为:0.89333333
第 6 次,GA的迭代次数为:26,KFCM的迭代次数为: 6,准确度为:0.89333333
第 7 次,GA的迭代次数为:93,KFCM的迭代次数为: 7,准确度为:0.89333333
第 8 次,GA的迭代次数为:70,KFCM的迭代次数为: 5,准确度为:0.89333333
第 9 次,GA的迭代次数为:11,KFCM的迭代次数为: 8,准确度为:0.89333333
第 10 次,GA的迭代次数为: 9,KFCM的迭代次数为: 9,准确度为:0.89333333
第 11 次,GA的迭代次数为:80,KFCM的迭代次数为: 7,准确度为:0.89333333
第 12 次,GA的迭代次数为:39,KFCM的迭代次数为: 7,准确度为:0.89333333
第 13 次,GA的迭代次数为:12,KFCM的迭代次数为: 6,准确度为:0.89333333
第 14 次,GA的迭代次数为:22,KFCM的迭代次数为: 6,准确度为:0.89333333
第 15 次,GA的迭代次数为: 7,KFCM的迭代次数为: 8,准确度为:0.89333333
第 16 次,GA的迭代次数为:13,KFCM的迭代次数为: 8,准确度为:0.89333333
第 17 次,GA的迭代次数为:19,KFCM的迭代次数为:15,准确度为:0.89333333
第 18 次,GA的迭代次数为:22,KFCM的迭代次数为:14,准确度为:0.89333333
第 19 次,GA的迭代次数为:30,KFCM的迭代次数为: 9,准确度为:0.89333333
第 20 次,GA的迭代次数为:13,KFCM的迭代次数为: 7,准确度为:0.89333333 ave_acc_GAKFCM =
0.893333333333333 max_acc_GAKFCM =
0.893333333333333 min_acc_GAKFCM =
0.893333333333333 ave_iter_GA =
30.100000000000001 ave_iter_KFCM =
8.350000000000000 ave_run_time =
2.457812500000000

遗传算法中的具体实现细节有可能有误,望指正。

聚类——GAKFCM的matlab程序的更多相关文章

  1. 聚类——WKFCM的matlab程序

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

  2. 聚类——KFCM的matlab程序

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

  3. 聚类——FCM的matlab程序

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

  4. ISODATA聚类算法的matlab程序

    ISODATA聚类算法的matlab程序 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 参考:Kmeans及ISODATA算法的matlab实现 算法 ...

  5. canopy聚类算法的MATLAB程序

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

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

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

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

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

  8. 密度峰值聚类算法MATLAB程序

    密度峰值聚类算法MATLAB程序 凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 密度峰值聚类算法简介见:[转] 密度峰值聚类算法(DPC) 数据见:MATL ...

  9. MATLAB程序:用FCM分割脑图像

    MATLAB程序:用FCM分割脑图像 作者:凯鲁嘎吉 - 博客园http://www.cnblogs.com/kailugaji/ 脑图像基础知识请看:脑图像:FCM算法介绍请看:聚类——FCM:数据 ...

随机推荐

  1. iOS高效裁剪图片圆角算法

    项目有个需求:裁剪图片,针对头像,下面是要求: 大家可以看到这张图片的圆角已经去除,下面说说我在项目利用了两种方式实现此裁剪以及查看技术文档发现更高效裁剪方式,下面一一讲解:看下来大约需要15-20分 ...

  2. IdentityServer4 中文文档 -14- (快速入门)使用 ASP.NET Core Identity

    IdentityServer4 中文文档 -14- (快速入门)使用 ASP.NET Core Identity 原文:http://docs.identityserver.io/en/release ...

  3. C#正则表达式_简单梳理_Emoji表情字符处理

    A-最近一直有接触到正则表达式,现对其做简单梳理: private const RegexOptions OPTIONS = RegexOptions.IgnoreCase | RegexOption ...

  4. ASP.NET Core中使用Graylog记录日志

    以下基于.NET Core 2.1 定义GrayLog日志记录中间件: 中间件代码: public class GrayLogMiddleware { private readonly Request ...

  5. 7.QT-Qt对象间的父子关系

    Qt对象之间可以存在父子关系 继承于QObject类或者其子类的对象,都称为Qt对象 当指定Qt对象的父对象时 需要通过setParent()成员函数来设置对象间的父子关系 子对象将会把自己的指针地址 ...

  6. (6)Jquery1.8.3快速入门_过滤选择器

    一.Jquery的基本过滤选择器: 基本过滤选择器: 1. :first 选取第一个元素 2. :last 选取最后一个元素 3.:not(selector) 去除所有与给定的选择器匹配的元素 4.: ...

  7. 数据结构——基于java的链表实现(真正理解链表这种数据结构)

    原创不易,如需转载,请注明出处https://www.cnblogs.com/baixianlong/p/10759599.html,否则将追究法律责任!!! 一.链表介绍 1.什么是链表? 链表是一 ...

  8. 1.写页面 2.css的继承属性有哪些 3.margin对布局的影响

    1. sparent 透明的 2. placeholder 提示语 写页面 1.搞清结构层次 2. 保证模块化 让它们之间不能收到影响. (1) 元素性质 (2)标准流 浮动带来的脱离文档流撑不起父级 ...

  9. Java io 入门

    目录 前言 代码演练 字符流 FileReader,FileWriter: BufferedReader,BufferedWriter: InputStreamReader,OutputStreamW ...

  10. Java中static与final

    修饰变量:static:静态变量,是属于这个类的final :常量,只能赋值一次static final:静态常量,必须立即初始化(同时具有static.final的特点) 修饰方法:static:静 ...