首页 技术 正文
技术 2022年11月9日
0 收藏 411 点赞 2,904 浏览 4585 个字

FCM算法的matlab程序2

在“FCM算法的matlab程序”这篇文章中已经用matlab程序对iris数据库进行实现,并求解准确度。下面的程序是另一种方法,是最常用的方法:先初始化聚类中心,在进行迭代(此方法由于循环较多,时间复杂度相对较高,但更严谨。就时间性而言,推荐使用“FCM算法的matlab程序”这个程序)。

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

1.采用iris数据库

iris_data.txt

5.13.51.40.2
4.931.40.2
4.73.21.30.2
4.63.11.50.2
53.61.40.2
5.43.91.70.4
4.63.41.40.3
53.41.50.2
4.42.91.40.2
4.93.11.50.1
5.43.71.50.2
4.83.41.60.2
4.831.40.1
4.331.10.1
5.841.20.2
5.74.41.50.4
5.43.91.30.4
5.13.51.40.3
5.73.81.70.3
5.13.81.50.3
5.43.41.70.2
5.13.71.50.4
4.63.610.2
5.13.31.70.5
4.83.41.90.2
531.60.2
53.41.60.4
5.23.51.50.2
5.23.41.40.2
4.73.21.60.2
4.83.11.60.2
5.43.41.50.4
5.24.11.50.1
5.54.21.40.2
4.93.11.50.2
53.21.20.2
5.53.51.30.2
4.93.61.40.1
4.431.30.2
5.13.41.50.2
53.51.30.3
4.52.31.30.3
4.43.21.30.2
53.51.60.6
5.13.81.90.4
4.831.40.3
5.13.81.60.2
4.63.21.40.2
5.33.71.50.2
53.31.40.2
73.24.71.4
6.43.24.51.5
6.93.14.91.5
5.52.341.3
6.52.84.61.5
5.72.84.51.3
6.33.34.71.6
4.92.43.31
6.62.94.61.3
5.22.73.91.4
523.51
5.934.21.5
62.241
6.12.94.71.4
5.62.93.61.3
6.73.14.41.4
5.634.51.5
5.82.74.11
6.22.24.51.5
5.62.53.91.1
5.93.24.81.8
6.12.841.3
6.32.54.91.5
6.12.84.71.2
6.42.94.31.3
6.634.41.4
6.82.84.81.4
6.7351.7
62.94.51.5
5.72.63.51
5.52.43.81.1
5.52.43.71
5.82.73.91.2
62.75.11.6
5.434.51.5
63.44.51.6
6.73.14.71.5
6.32.34.41.3
5.634.11.3
5.52.541.3
5.52.64.41.2
6.134.61.4
5.82.641.2
52.33.31
5.62.74.21.3
5.734.21.2
5.72.94.21.3
6.22.94.31.3
5.12.531.1
5.72.84.11.3
6.33.362.5
5.82.75.11.9
7.135.92.1
6.32.95.61.8
6.535.82.2
7.636.62.1
4.92.54.51.7
7.32.96.31.8
6.72.55.81.8
7.23.66.12.5
6.53.25.12
6.42.75.31.9
6.835.52.1
5.72.552
5.82.85.12.4
6.43.25.32.3
6.535.51.8
7.73.86.72.2
7.72.66.92.3
62.251.5
6.93.25.72.3
5.62.84.92
7.72.86.72
6.32.74.91.8
6.73.35.72.1
7.23.261.8
6.22.84.81.8
6.134.91.8
6.42.85.62.1
7.235.81.6
7.42.86.11.9
7.93.86.42
6.42.85.62.2
6.32.85.11.5
6.12.65.61.4
7.736.12.3
6.33.45.62.4
6.43.15.51.8
634.81.8
6.93.15.42.1
6.73.15.62.4
6.93.15.12.3
5.82.75.11.9
6.83.25.92.3
6.73.35.72.5
6.735.22.3
6.32.551.9
6.535.22
6.23.45.42.3
5.935.11.8

iris_id.txt

0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2

2.matlab程序

My_FCM2.m

function label_1=My_FCM2(K)
%输入K:聚类数
%输出:label_1:聚的类, para_miu_new:模糊聚类中心μ,responsivity:模糊隶属度
format long
eps=1e-5; %定义迭代终止条件的eps
alpha=2; %模糊加权指数,[1,+无穷)
max_iter=100; %最大迭代次数
fitness=zeros(max_iter,1);
data=dlmread('E:\www.cnblogs.comkailugaji\data\iris\iris_data.txt');
%----------------------------------------------------------------------------------------------------
%对data做最大-最小归一化处理
[data_num,~]=size(data);
X=(data-ones(data_num,1)*min(data))./(ones(data_num,1)*(max(data)-min(data)));
[X_num,X_dim]=size(X);
%----------------------------------------------------------------------------------------------------
%随机初始化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:max_iter
%欧氏距离,计算(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
for j=1:K
if distant(i,j)==1
responsivity(i,j)=0;
elseif distant(i,j)==0
responsivity(i,j)=1./sum(responsivity(i,:)==0);
else
R_up(i,j)=distant(i,j).^(-1/(alpha-1)); %隶属度矩阵的分子部分
responsivity(i,j)= R_up(i,j)./sum( R_up(i,:),2);
end
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 %改成while不行
if abs(fitness(t)-fitness(t-1))<eps
break;
end
end
end
%iter=t; %实际迭代次数
[~,label_1]=max(responsivity,[],2);

succeed.m

function accuracy=succeed(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); %与真实聚类结果一样的个数
real_label=dlmread('E:\www.cnblogs.comkailugaji\data\iris\iris_id.txt');
%将训练结果全排列为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)-1; %加一减一看情况
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;

Eg_FCM.m

function ave_acc_FCM=Eg_FCM(K,max_iter)
%输入K:聚的类,max_iter是最大迭代次数
%输出ave_acc_FCM:迭代max_iter次之后的平均准确度
s=0;
for i=1:max_iter
label_1=My_FCM2(K);
accuracy=succeed(K,label_1);
s=s+accuracy;
end
ave_acc_FCM=s/max_iter;

3.结果

>> ave_acc_FCM=Eg_FCM(3,50)ave_acc_FCM =   0.893333333333333

4.注意

此算法是一个大众化的算法,先初始化聚类中心,再进行迭代,对隶属函数进行分情况讨论,将距离为0的情况考虑进去,但是计算速度慢。而在“FCM算法的matlab程序”是先初始化模糊隶属函数,再进行迭代,这样就避免分母为零的情况,而且计算速度快。对于严谨性大众性,可以采用本文的算法,对于时间性,可以采用“FCM算法的matlab程序”算法。

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,487
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,903
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,736
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,486
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:8,126
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:5,287