fcm算法的MATLAB实现

fcm算法

分析:

1.算法中包含的参数:
a.模糊因子expo(expo>1)
b.最大迭代次数max_t
c.迭代终止条件ε

2.算法中包含的过程:
a.目标函数
b.欧式距离
c.隶属矩阵
d.聚类中心
e.迭代过程

还有  不要忘记!!初始化!!

3.实现代码过程中需要写成子函数的部分:
a.初始化函数initfcm() (主要实现隶属度矩阵的初始化)
b.一次聚类过程stepfcm()(包含目标函数,隶属矩阵的计算等等)
c.距离函数distfcm()
d.画图函数plotfcm()


代码实现:

· 函数定义–左边是输出参数,右边是函数名以及输入参数

主函数:

function[center, U, obj_fcn] = fcm_final(data,c,options)
% 输入:
% data 数据集 n行m列,n为样本数据数,m为数据的特征数
% c 聚类中心的个数
%options(1): 隶属度矩阵U的指数expo,>1(缺省值: 2.0)
%options(2): 最大迭代次数max_t(缺省值: 100)
%options(3): 隶属度最小变化量e,迭代终止条件(缺省值: 1e-5)
%options(4): 每次迭代是否输出信息标志(缺省值: 1)
% 输出:
% U 隶属度矩阵
% center 聚类中心
% obj_fcn 目标函数

if nargin ~= 2 && nargin ~= 3
    error('Too many or too few input argument! ');
end
data_n = size(data, 1);
data_m = size(data, 2);

default_options = [2; 100; 1e-5; 1];


if nargin == 2,
    options = default_options;
else 

    if length(options) < 4,
        temp = default_options;
        temp(1:length(options)) = options;
        options = temp;
    end
    
    nan_index = find(isnan(options) == 1);
    options(nan_index) = default_options(nan_index);
    if options(1) <= 1,
        error('The exponent should be greater than 1 !');
    end
    
end


expo = options(1);
max_t = options(2);
e = options(3);
display = options(4);

obj_fcn = zeros(maxt, 1);
U = initfcm(c, data_n);

for i = 1 : max_t
    [U, center, obj_fcn(i)] = stepfcm(data, U, c, expo);
    if display,
        fprintf('FCM:Iteration count = %d, obj_fcn = %f\n',i,obj_fcn(i));
        plotfcm(data,center,U,obj_fcn);
    end
    
    if i > 1,
        if abs(obj_fcn(i) - obj_fcn(i-1)) < e,
            break;
        end
    end
    
end
iter_n = i;

obj_fcn(iter_n + 1 : max_t) = [];
end



> 子函数:

**1.初始化函数initfcm()**

% U–> c * n(c行n列) ,c为聚类数, n为样本数
%% 初始化隶属矩阵时需要已知矩阵的行和列,因此输入应该为该矩阵的行和列

% 输入: c, data_n
% data_n 数据集data所含的样本数
% c 这组数据的聚类数
% 输出:U(初始化之后的隶属矩阵)

function[U] = initfcm(c, data_n)
U = rand(c, data_n);
col_sum = sum(U);

U = U./col_sum(ones(c,1), : );
end



**2.一次聚类过程stepfcm()**

% 一次聚类包含的过程:
% % (1)计算聚类中心,(2)目标函数,(3)距离函数,(4)计算新的隶属矩阵

% 输入:data,U,c,expo(模糊因子)
% 输出:U_new(新的隶属矩阵),center(聚类中心),obj_fcn(目标函数)

function[U_new, center, obj_fcn] = stepfcm(data, U, c, expo)
mf = U.^expo;
center = mf*data./((ones(size(data,2),1)*sum(mf’))’));
dist = distfcm(center, data);
obj_fcn = sum(sum(dist.^2 * mf));
temp = dist.^(-2/(expo-1));
U_new = temp./(ones(c,1)*sum(temp));
end




**3.距离函数distfcm()**

% 输入:data, center
% 输出:out

function out = disfcm(center,data)
out = zeros(size(center, 1), size(data, 1));
for k = 1:size(center, 1)
out(k,:) = sqrt(sum(((data - ones(size(data,1),1)*center(k,:)).^2)’,1));
end
end


**4.画图函数plotfcm()**

% 输入:data, center, U, obj_fcn
% 对fcmdata.dat(MATLAB自带的聚类数据集,有两个类)进行聚类

function plotfcm(data,center,U,obj_fcn)

figure(1)
subplot(2,1,1);
plot(U(1,:),’-b’);
title(‘隶属度矩阵值’)
ylabel(‘第一类’)
subplot(2,1,2);
plot(U(2,:),’-r’);
ylabel(‘第二类’)
xlabel(‘样本数’)

figure(2)
grid on
plot(obj_fcn);
title(‘目标函数变化值’);
xlabel(‘迭代次数’)
ylabel(‘目标函数值’)

figure(3)
title(‘聚类图像’);
plot(data(:,1),data(:,2),’*r’);
maxU = max(U);
index1 = find(U(1,:)==maxU);
index2 = find(U(2,:)==maxU);
plot(data(index1,1),data(index1,2),’*g’);
hold on
plot(data(index2,1),data(index2,2),’*r’);
plot(center(1,1),center(1,2),‘oy’,‘Markersize’,5,‘linewidth’,3)
plot(center(2,1),center(2,2),‘ob’,‘Markersize’,5,‘linewidth’,3)
hold off;
end



> 聚类结果

![这里写图片描述](https://img-blog.csdn.net/20180730115135432?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2luX25vY2VuY2U=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)




> 收获心得

%%   由于具有4个特征值的鸢尾花数据集是四维的,无法在图像中展示,可采用两两比对的方式展现。
%% 代码中的隶属度矩阵啊聚类中心啊目标函数啊等等这些表示实际上都是将算法中的数学计算式转化成矩阵问题,要注意理解。












  • 25
    点赞
  • 148
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值