根据论文的推导对FCM算法进行了改进,加入了权重这一项。但是我按照论文的方法进行编程之后,代码运行不收敛。本人matalab刚入门,下面是改进算法的公式推导以及我的代码运行结果。
MATLAB R2019b
我的代码如下:
data数据如下,是60组九个维度的数据
data=[0.106481481481481,0.0337078651685393,0.600000000000000,0,0.569800569800570,0.0481927710843374,0,0.107142857142857,0.139175257731959;%越大越坏归一化
0.162037037037037,0.191011235955056,0.600000000000000,0,0.515669515669516,0.660929432013769,0,0.0714285714285714,0.154639175257732;
0.226851851851852,0.247191011235955,0.600000000000000,0,0.749287749287749,0.469879518072289,0.0333333333333333,0.0714285714285714,0.201030927835052;
0.189814814814815,0.0337078651685393,0.600000000000000,0,0.730769230769231,0.0929432013769363,0.0111111111111111,0.0357142857142857,0.0103092783505155;
0.0416666666666667,0.0337078651685393,0.600000000000000,0,0.954415954415955,0.709122203098107,0.0333333333333333,0.250000000000000,0.237113402061856;
0.0324074074074074,0,0.600000000000000,0,0.658119658119658,0.0722891566265060,0,0,0.0154639175257732;
0.0185185185185185,0,0.600000000000000,0,0.158119658119658,0.0654044750430293,0.0555555555555556,0.0357142857142857,0.0257731958762887;
0.111111111111111,0.280898876404494,0.600000000000000,0,0.222222222222222,0.296041308089501,0.0111111111111111,0,0.00515463917525773;
0,0.0112359550561798,0.600000000000000,0,0.222222222222222,0.611015490533563,0.0333333333333333,0.0357142857142857,0.0154639175257732;
0.0138888888888889,0,0.600000000000000,0.0600000000000000,0.189458689458690,0.0499139414802065,0.0666666666666667,0.214285714285714,0.211340206185567;
0.0787037037037037,0.382022471910112,0.600000000000000,0,0.914529914529915,0.345955249569707,0,0.0714285714285714,0.0103092783505155;
0.0231481481481481,0.539325842696629,0.600000000000000,0,1,0.0550774526678141,0.0666666666666667,0.392857142857143,0.340206185567010;
0.0185185185185185,0.0112359550561798,0.600000000000000,0,0.639601139601140,1,0,0.0357142857142857,0.0360824742268041;
0.0416666666666667,0.224719101123596,0.600000000000000,0,0.189458689458690,0.0740103270223752,0.0222222222222222,0.464285714285714,0.453608247422680;
0.203703703703704,0.247191011235955,0.600000000000000,0.990000000000000,0.189458689458690,0.347676419965577,0.288888888888889,0.285714285714286,0.324742268041237;
0.0138888888888889,0,0.600000000000000,0,0.158119658119658,0.514629948364888,0,0.214285714285714,0.247422680412371;
0.166666666666667,0.202247191011236,0.200000000000000,0,0.189458689458690,0.0550774526678141,0.0222222222222222,0.607142857142857,0.798969072164948;
0.00462962962962963,0,0.200000000000000,1,0.126780626780627,0.993115318416523,0.0777777777777778,0.500000000000000,0.701030927835052;
0.0324074074074074,0.0224719101123595,0.200000000000000,0,0.253561253561254,0.846815834767642,0.0222222222222222,0.464285714285714,0.618556701030928;
0.0277777777777778,0.0337078651685393,0.200000000000000,0.600000000000000,0.253561253561254,0.497418244406196,0.777777777777778,0.107142857142857,0.231958762886598;
0.175925925925926,0.112359550561798,0.200000000000000,0,0.538461538461539,0.652323580034424,0.0111111111111111,0.250000000000000,0.340206185567010;
0.0185185185185185,0,0.200000000000000,0.780000000000000,0.569800569800570,0.0516351118760757,0.955555555555556,0.321428571428571,0.381443298969072;
0.0324074074074074,0,0.200000000000000,0.990000000000000,0.316239316239316,0.519793459552496,0.122222222222222,0.392857142857143,0.355670103092784;
0.217592592592593,0.0898876404494382,0.600000000000000,0.990000000000000,0.253561253561254,0.0636833046471601,0.588888888888889,0.464285714285714,0.283505154639175;
0.162037037037037,0.505617977528090,0.600000000000000,0.0900000000000000,0.702279202279202,0.0619621342512909,0,0.214285714285714,0.190721649484536;
0.185185185185185,0.224719101123596,0.600000000000000,0,0.683760683760684,0.499139414802065,0.511111111111111,0.464285714285714,0.381443298969072;
0.162037037037037,0.359550561797753,0.600000000000000,0.110000000000000,0.702279202279202,0.0516351118760757,0.433333333333333,0.357142857142857,0.247422680412371;
0.370370370370370,0.280898876404494,0.600000000000000,0,0.702279202279202,0.0550774526678141,0.344444444444444,0.321428571428571,0.268041237113402;
0.541666666666667,0.202247191011236,0.600000000000000,0,0.702279202279202,0.0413080895008606,0.455555555555556,0.107142857142857,0.211340206185567;
0.361111111111111,0.0898876404494382,0.200000000000000,0,0.380341880341880,0.0550774526678141,0.0333333333333333,0,0.0103092783505155;
0.879629629629630,0.0561797752808989,0.200000000000000,0,0.237891737891738,0.0808950086058520,0.977777777777778,0.0357142857142857,0.0257731958762887;
1,0.0449438202247191,0.200000000000000,0.356000000000000,0.158119658119658,0.0447504302925990,0.0333333333333333,0.464285714285714,0.675257731958763;
0.583333333333333,0.0224719101123595,0,0,0.316239316239316,0.0895008605851979,0.122222222222222,0,0.0154639175257732;
0.745370370370370,0.0674157303370787,0,0,0,0,0.0222222222222222,0.0357142857142857,0.0206185567010309;
0.185185185185185,0,0,0,0,0.0808950086058520,0,0.0357142857142857,0.0206185567010309;
0.185185185185185,0.0112359550561798,0.200000000000000,0,0,0.151462994836489,0.288888888888889,0,0.0103092783505155;
0.194444444444444,0.00674157303370786,0.600000000000000,0,0,0.161790017211704,1,0.535714285714286,0.829896907216495;
0.0185185185185185,0,0.200000000000000,0,0,0.0722891566265060,0.0333333333333333,0.0357142857142857,0.0206185567010309;
0.189814814814815,0.0112359550561798,0.200000000000000,0,0,0.0619621342512909,0,0.0714285714285714,0.298969072164948;
0.185185185185185,0,0,0,0,0.0378657487091222,0.0666666666666667,0.0357142857142857,0.0206185567010309;
0.171296296296296,0.0112359550561798,0.200000000000000,0,0,0,0.0222222222222222,0.0357142857142857,0.0309278350515464;
0.189814814814815,0.0224719101123595,0,0,0,0.0585197934595525,0,0,0.00515463917525773;
0.495370370370370,0.426966292134831,0,0,0,0.0757314974182444,0.144444444444444,0.0714285714285714,0.0206185567010309;
0.180555555555556,0.0269662921348315,0,0,0,0.0654044750430293,0.177777777777778,0,0.0154639175257732;
0.356481481481481,0.0112359550561798,0,0,0,0.0740103270223752,0,0,0.0309278350515464;
0.421296296296296,0.112359550561798,0,0,0.347578347578348,0.0585197934595525,0.0444444444444444,0.0357142857142857,0;
0.175925925925926,0.0224719101123595,0.600000000000000,0.300000000000000,0.522792022792023,0.113597246127367,0.100000000000000,1,1;
0.740740740740741,0.0337078651685393,0.200000000000000,0,0.522792022792023,0.0654044750430293,0.0666666666666667,0,0.0309278350515464;
0.115740740740741,1,0.600000000000000,0,0.766381766381767,0.614457831325301,0,0.0714285714285714,0.190721649484536;
0.189814814814815,0.0112359550561798,0.200000000000000,0,0.347578347578348,0.0774526678141136,0.0666666666666667,0.0357142857142857,0.0360824742268041;
0.0555555555555556,0.0337078651685393,0.600000000000000,0.980000000000000,0.693732193732194,0.0722891566265060,0.444444444444444,0.250000000000000,0.237113402061856;
0.0509259259259259,0.191011235955056,0.200000000000000,0,0,0.0602409638554217,0.100000000000000,0.0357142857142857,0.00515463917525773;
0.0787037037037037,0.370786516853933,0.600000000000000,0.620000000000000,0.639601139601140,0.0826161790017212,0.122222222222222,0.142857142857143,0.201030927835052;
0.0324074074074074,0.0337078651685393,0.600000000000000,0,0.621082621082621,0.0550774526678141,0.411111111111111,0.285714285714286,0.268041237113402;
0.370370370370370,0.202247191011236,0.200000000000000,0,0.347578347578348,0.0808950086058520,0.144444444444444,0.250000000000000,0.0463917525773196;
0.0277777777777778,0,0.200000000000000,0,0,0,0,0,0.0257731958762887;
0.342592592592593,0.0337078651685393,0.200000000000000,0,0.316239316239316,0.0654044750430293,0.0777777777777778,0,0.0206185567010309;
0.745370370370370,0.0449438202247191,1,0,0,0.0981067125645439,0.977777777777778,0.0357142857142857,0.0154639175257732;
0.541666666666667,0.0337078651685393,0.200000000000000,0,0,0.0671256454388985,0.122222222222222,0,0.0206185567010309;
0.0694444444444445,0.168539325842697,0.600000000000000,0,0.189458689458690,0.0636833046471601,0.477777777777778,0.392857142857143,0.309278350515464];
运行结果
万分感谢!
```html
function [center,U,W,obj_fun] = FWCMcluster(data,cluster_n,options)
% FWCMCluster.m 采用模糊C均值对数据集data聚为cluster_n类
% 用法:
% 1. [center,U,W,obj_fun] = FWCMCluster(Data,cluster_n,options);
% 2. [center,U,W,obj_fun] = FWCMCluster(Data,cluster_n);
% 输入:
% data ---- n*m矩阵,表示n个样本,每个样本的维度为m
% cluster_n ---- 标量,表示聚类中心数目,即类别数
% options ---- 5*1矩阵,其中
% options(1): 隶属度矩阵U的模糊加权指数,>1 (缺省值: 2.0)
% options(2): 最大迭代次数 (缺省值: 100)
% options(3): 隶属度最小变化量,迭代终止条件 (缺省值: 1e-5)
% options(4): 每次迭代是否输出信息标志 (缺省值: 1)
% options(5): 权重系数加权指数 (缺省值: 2)
% 输出:
% center ---- 聚类中心
% U ---- 隶属度矩阵
% obj_fun ---- 目标函数(值)
if nargin ~= 2 && nargin ~= 3 % 判断输入参数个数只能是2个或3个
error('Too many or too few input arguments!');
end
cluster_n = 5; % 表示聚类中心数目,即类别数,本课题取值5个
data_n = size(data, 1); % 求出data的第一维行数,即样本个数,60个
in_n = size(data, 2); % 求出data的第二维列数,即样本的维度(特征值长度),9列
% 默认操作参数
default_options = [2; % 隶属度矩阵U的模糊加权指数
100; % 最大迭代次数
1e-5; % 隶属度最小变化量,迭代终止条件
1; % 每次迭代是否输出信息标志
2]; %权重系数加权指数
% 参数配置
if nargin == 2
options = default_options; % 如果只输入前两个参数,那么就调用默认的参数
else
if length(options) < 4 % 如果参数个数少于4个,那么其他选用默认参数
tmp = default_options; % 令tmp赋值等于默认参数
tmp(1:length(options)) = options; % 令tmp的前options长度的个数对应位置赋值等于options中相应位置的值,更新tmp
options = tmp; % 令options赋值等于新的tmp
end
nan_index = find(isnan(options)==1); % 返回options中不是数值时对应位置的值为1(1表示真,如NaN非数值),是数时的值为0(假);并将值为1的相应位置编号赋值给nan_index
options(nan_index) = default_options(nan_index); % 将denfault_options中对应位置的参数赋值给options中不是数的位置
if options(1) <= 1
error('The exponent should be greater than 1!'); % 如果模糊矩阵(即隶属度矩阵)的模糊加权指数小于等于1,则显示错误,该值应大于1
end
end
% 将options 中的分量分别赋值给五个变量;
expu = options(1); % 隶属度矩阵U的模糊加权指数
max_iter = options(2); % 最大迭代次数
min_impro = options(3); % 隶属度最小变化量,迭代终止条件
display = options(4); % 每次迭代是否输出信息标志
expw = options(5); %权重系数加权指数
obj_fun = zeros(max_iter, 1); % 初始化输出参数obj_fun
U = initfcm(cluster_n, data_n); % 初始化模糊分配矩阵,使U满足每列相加等于1
% data=rand(60,9)
Foods=(1+rands(5,9))*0.5;
center=Foods; % 将IABC的运算中心结果作为FWCM的初始聚类中心
% Main loop 主要循环
for k = 1:max_iter
% 在第i步循环中改变聚类中心center\模糊矩阵U的隶属度值\权重系数W的值;
% [U,center,W,obj_fun(i)] = stepfcm(data,center,cluster_n,expu,expw);
%%更新权重矩阵W
out1=ones(size(center,1)*size(data,1),size(data,2));%用来储存各个数据点各个维度到各个聚类中心各个维度的差的平方
out=ones(size(center,1)*size(data,1),size(data,2));
W=initfcm(1,size(data,2))*(size(data,2));%初始化权重矩阵
for i=1:size(data,1)%遍历data中的每一个数据
for j=1:size(center,1)%遍历每一个聚类中心点
out1(size(center,1)*(i-1)+j,:)=(data(i,:)-center(j,:)).^2;
out(size(center,1)*(i-1)+j,:) = out1(size(center,1)*(i-1)+j,:);
end
end
% out;
temp=(sum(out)).^(1/(1-expw));
W=temp./(sum(temp)*(1/size(data,2)));%求得初始权重矩阵 *(1/size(data,2))
%%更新隶属度矩阵U
temp1=ones(size(center,1)*size(data,1),1);
temp2=ones(size(center,1),size(data,1));
temp3=ones(1,300);
for i=1:size(data,1)
for j=1:size(center,1)
temp1((i-1)*size(center,1)+j,1)=((1+W)*(out((i-1)*(size(center,1))+j,:))').^(1/(1-expu));
end
end
temp2=reshape(temp1,size(center,1),size(data,1));
repmat(sum(temp2),1,size(center,1));
temp3=(temp1)'./( repmat(sum(temp2),1,size(center,1)));
U=reshape(temp3,size(center,1),size(data,1));
%%计算目标函数
%%
obj_fun(k)=sum(sum((U.^(expu)).*(reshape((1+W.^(expw))*(out'),size(center,1),size(data,1)))));
%%更新聚类中心
center=((U.^(expu))*data)./(repmat((sum((U.^(expu))'))',1,size(data,2)));
if display %display即disp,可用来显示字符串、计算结果、矩阵、数字等
fprintf('FWCM:Iteration count = %d, obj_fun = %f\n,', k, obj_fun(k));% %d表示整数,%f表示小数形式的实数;输出的结果为单引号内的内容,其中i和obj_fun(i)替换%d和%f
end % Interaction count为迭代次数;\n是换行,英文是New line,表示使光标到行首
%% 终止条件判别
if k > 1
if abs(obj_fun(k) - obj_fun(k-1)) < min_impro % 终止条件判别
break;
end
end
end
U
W
for i=1:60
[m(i),b(i)]=max(U(:,i));
end
find(b==1)
find(b==2)
find(b==3)
find(b==4)
find(b==5)
iter_n = k; % 实际迭代次数
obj_fun(iter_n+1:max_iter) = []; %清除后面没有迭代的位置
```