聚类——FCM的matlab程序
聚类——FCM的matlab程序
作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/
在聚类——FCM文章中已介绍了FCM算法的理论知识,现在用matlab进行实现。
1.matlab程序
FCM_main.m
function [ave_acc_FCM,max_acc_FCM,min_acc_FCM,ave_iter_FCM,ave_run_time]=FCM_main(X,real_label,K)
%输入K:聚的类,max_iter是最大迭代次数
%输出ave_acc_FCM:迭代max_iter次之后的平均准确度
t0=cputime;
s=0;
s_1=0;
max_iter=20; %重复max_iter次
accuracy=zeros(max_iter,1);
iter_FCM_t=zeros(max_iter,1);
%对data做最大-最小归一化处理
% [data_num,~]=size(data);
% X=(data-ones(data_num,1)*min(data))./(ones(data_num,1)*(max(data)-min(data)));
for i=1:max_iter
[label_1,~,iter_FCM]=My_FCM(X,K);
iter_FCM_t(i)=iter_FCM;
accuracy(i)=succeed(real_label,K,label_1);
s=s+accuracy(i);
s_1=s_1+iter_FCM_t(i);
fprintf('第 %2d 次,FCM的迭代次数为:%2d,准确度为:%.8f\n', i, iter_FCM_t(i), accuracy(i));
end
ave_iter_FCM=s_1/max_iter;
ave_acc_FCM=s/max_iter;
max_acc_FCM=max(accuracy);
min_acc_FCM=min(accuracy);
run_time=cputime-t0;
ave_run_time=run_time/max_iter;
My_FCM.m
function [label_1,para_miu_new,iter]=My_FCM(X,K)
%输入K:聚类数
%输出:label_1:聚的类, para_miu_new:模糊聚类中心μ,responsivity:模糊隶属度
format long
eps=1e-4; %定义迭代终止条件的eps
alpha=2; %模糊加权指数,[1,+无穷)
T=100; %最大迭代次数
fitness=zeros(T,1);
[X_num,X_dim]=size(X);
count=zeros(X_num,1); %统计distant中每一行为0的个数
%----------------------------------------------------------------------------------------------------
%随机初始化K个聚类中心
rand_array=randperm(X_num); %产生1~X_num之间整数的随机排列
para_miu=X(rand_array(1:K),:); %随机排列取前K个数,在X矩阵中取这K行作为初始聚类中心
responsivity=zeros(X_num,K);
R_up=zeros(X_num,K);
% ----------------------------------------------------------------------------------------------------
% FCM算法
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
for i=1:X_num
count(i)=sum(distant(i,:)==0);
if count(i)>0
for k=1:K
if distant(i,k)==0
responsivity(i,k)=1./count(i);
else
responsivity(i,k)=0;
end
end
else
R_up(i,:)=distant(i,:).^(-1/(alpha-1)); %隶属度矩阵的分子部分
responsivity(i,:)= R_up(i,:)./sum( R_up(i,:),2);
end
end
%目标函数值
fitness(t)=sum(sum(distant.*(responsivity.^(alpha))));
%更新聚类中心K*X_dim
miu_up=(responsivity'.^(alpha))*X; %μ的分子部分
para_miu=miu_up./((sum(responsivity.^(alpha)))'*ones(1,X_dim));
if t>1
if abs(fitness(t)-fitness(t-1))<eps
break;
end
end
end
para_miu_new=para_miu;
iter=t; %实际迭代次数
[~,label_1]=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;
2.在UCI数据库的iris上的运行结果
>> data_load=dlmread('E:\My matlab\database\iris.data');data=data_load(:,1:4);real_label=data_load(:,5);
>> [ave_acc_FCM,max_acc_FCM,min_acc_FCM,ave_iter_FCM,ave_run_time]=FCM_main(data,real_label,3)
第 1 次,FCM的迭代次数为:33,准确度为:0.89333333
第 2 次,FCM的迭代次数为:41,准确度为:0.89333333
第 3 次,FCM的迭代次数为:14,准确度为:0.89333333
第 4 次,FCM的迭代次数为:13,准确度为:0.89333333
第 5 次,FCM的迭代次数为:16,准确度为:0.89333333
第 6 次,FCM的迭代次数为:10,准确度为:0.89333333
第 7 次,FCM的迭代次数为:21,准确度为:0.89333333
第 8 次,FCM的迭代次数为:46,准确度为:0.89333333
第 9 次,FCM的迭代次数为:19,准确度为:0.89333333
第 10 次,FCM的迭代次数为:18,准确度为:0.89333333
第 11 次,FCM的迭代次数为:17,准确度为:0.89333333
第 12 次,FCM的迭代次数为:38,准确度为:0.89333333
第 13 次,FCM的迭代次数为:37,准确度为:0.89333333
第 14 次,FCM的迭代次数为:11,准确度为:0.89333333
第 15 次,FCM的迭代次数为:22,准确度为:0.89333333
第 16 次,FCM的迭代次数为:17,准确度为:0.89333333
第 17 次,FCM的迭代次数为:13,准确度为:0.89333333
第 18 次,FCM的迭代次数为: 8,准确度为:0.89333333
第 19 次,FCM的迭代次数为:13,准确度为:0.89333333
第 20 次,FCM的迭代次数为:20,准确度为:0.89333333
ave_acc_FCM =
0.893333333333333
max_acc_FCM =
0.893333333333333
min_acc_FCM =
0.893333333333333
ave_iter_FCM =
21.350000000000001
ave_run_time =
0.035937500000000
聚类——FCM的matlab程序的更多相关文章
- 聚类——WKFCM的matlab程序
聚类——WKFCM的matlab程序 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 在聚类——WKFCM文章中已介绍了WKFCM算法的理论知识,现在用 ...
- 聚类——KFCM的matlab程序
聚类——KFCM的matlab程序 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 在聚类——KFCM文章中已介绍了KFCM-F算法的理论知识,现在用m ...
- 聚类——GAKFCM的matlab程序
聚类——GAKFCM的matlab程序 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 在聚类——GAKFCM文章中已介绍了GAKFCM算法的理论知识, ...
- ISODATA聚类算法的matlab程序
ISODATA聚类算法的matlab程序 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 参考:Kmeans及ISODATA算法的matlab实现 算法 ...
- canopy聚类算法的MATLAB程序
canopy聚类算法的MATLAB程序 凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 1. canopy聚类算法简介 Canopy聚类算法是一个将对象分组到 ...
- mean shift聚类算法的MATLAB程序
mean shift聚类算法的MATLAB程序 凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 1. mean shift 简介 mean shift, 写的 ...
- KFCM算法的matlab程序(用FCM初始化聚类中心)
KFCM算法的matlab程序(用FCM初始化聚类中心) 在“聚类——KFCM”这篇文章中已经介绍了KFCM算法,现在用matlab程序对iris数据库进行实现,用FCM初始化聚类中心,并求其准确度与 ...
- MATLAB程序:用FCM分割脑图像
MATLAB程序:用FCM分割脑图像 作者:凯鲁嘎吉 - 博客园http://www.cnblogs.com/kailugaji/ 脑图像基础知识请看:脑图像:FCM算法介绍请看:聚类——FCM:数据 ...
- FCM算法的matlab程序2
FCM算法的matlab程序2 在“FCM算法的matlab程序”这篇文章中已经用matlab程序对iris数据库进行实现,并求解准确度.下面的程序是另一种方法,是最常用的方法:先初始化聚类中心,在进 ...
随机推荐
- vmware vcsa-6.5 网络架构之虚拟机的标准交换机
一.配置虚拟机网络 1.概述(esxi 比workstation,vmware server,网络功能更强大) workstation和vmware server每块物理网卡可以给多个虚拟机使用,多个 ...
- [转]bitcoin API reference (JSON-RPC)
本文转自:https://en.bitcoin.it/wiki/API_reference_%28JSON-RPC%29#Node.js API reference (JSON-RPC) Co ...
- C#文件操作。
文件操作常用相关类: File: 操作文件,静态类,对文件整体操作. Directory:操作目录(文件夹),静态类. FileInfo:文件类,用来描述一个文件对象,获取指定目录下的所有文件时,返回 ...
- C#字符串。
string类型不能被继承,它是密封类,sealed. 一.字符串的特性. 1.不可变性. class Program { static void Main(string[] args) { stri ...
- Java学习笔记之——单例模式
(1)懒汉式:对象在方法中,第一次调用时创建对象,线程不安全的 public class Singleton { //外部不可以创建对象,就要在内部创建一个对象,还能够在外部获取 private ...
- java多线程高并发
旭日Follow_24 的CSDN 博客 ,全文地址请点击: https://blog.csdn.net/xuri24/article/details/81293321 “高并发和多线程”总是被一起提 ...
- Linux下Python安装完成后如何使用pip命令
一.很多读者Python安装完成之后,想要下载相关的包,例如:numpy.pandas等Python中这些基础的包,但是,发现pip根本用不了,主要表现在一下几种情况: 二.出现这种情况其实并不意外, ...
- 2:Python字符串与数字
字符串(引号):只有四种情况如下 name="我是编程高手" name='我是编程高手' name="""我是编程高手""&quo ...
- 远程过程调用概述-RMI简介
简介: RPC是远程过程调用(Remote Procedure Call)的缩写形式.SAP系统RPC调用的原理其实很简单,有一些类似于三层构架的C/S系统,第三方的客户程序通过接口调用SAP内部的标 ...
- vue-awesome-swiper 水平滚动异常
使用教程:https://github.com/cynthiawupore/vue-awesome-swiper 实例: <template> <div class="in ...