基于FCM算法的聚类算法

一、模糊聚类分析

模糊聚类是目前知识发现以及模式识别等诸多领域中的重要研究分支之一。随着研究范围的拓展,不管是科学研究还是实际应用,都对聚类的结果从多方面提出了更高的要求。模糊C–均值聚类(FCM)是目前比较流行的一种聚类方法。该方法使用了在欧几里得空间确定数据点的几何贴近度的概念,它将这些数据分配到不同的聚类,然后确定这些聚类之间的距离。模糊C–均值聚类算法在理论和应用上都为其他的模糊聚类分析方法奠定了基础,应用也最广泛。

二、案例背景

1、问题描述

本文将FCM作用于随机产生的数据进行实验。数据由400个二维平面上的点组成,这些点构成4个集合,但彼此之间并没有明显的界限,数据分布如图1所示。
在这里插入图片描述

图1 400个随机样本数据

2、模糊C–均值聚类算法(FCM)

n n n个数据样本为 X = { x 1 , x 2 , ⋯   , x n } \boldsymbol X=\{x_1, x_2,\cdots,x_n\} X={x1,x2,,xn} c ( 2 ≤ c ≤ n ) c(2≤c≤n) c(2cn)是要将数据样本分成的类型的数目, { A 1 , A 2 , ⋯   , A c } \{A_1,A_2,\cdots,A_c\} {A1,A2,,Ac}表示相应的 c c c个类别, U \boldsymbol U U是其相似分类矩阵,各类别的聚类中心为 { v 1 , v 2 , ⋯   , v c } \{v_1,v_2,\cdots,v_c\} {v1,v2,,vc} μ k ( x i ) \mu_k(x_i) μk(xi)是样本 x i x_i xi对于类 A k A_k Ak的隶属度(简写为 μ i k \mu_{ik} μik)。则目标函数 J b J_b Jb可以用下式表达: J b ( U , v ) = ∑ i = 1 n ∑ k = 1 c ( μ i k ) b ( d i k ) 2 (1) J_b(\boldsymbol U,v)=\sum_{i=1}^n\sum_{k=1}^c(\mu_{ik})^b(d_{ik})^2\tag{1} Jb(U,v)=i=1nk=1c(μik)b(dik)2(1)其中, d i k = d ( x i − v k ) = ∑ j = 1 m ( x i j − v k j ) 2 d_{ik}=d(x_i-v_k)=\sqrt{\displaystyle\sum_{j=1}^m(x_{ij}-v_{kj})^2} dik=d(xivk)=j=1m(xijvkj)2 d i k d_{ik} dik是欧几里得距离,用来度量第 i i i个样本 x i x_i xi与第 k k k类中心点之间的距离; m m m是样本的特征数; b b b是加权参数,取值范围是 1 ≤ b ≤ ∞ 1≤b≤∞ 1b。模糊C–均值聚类方法就是寻找一种最佳的分类,以使该分类能产生最小的函数值 j b j_b jb。它要求一个样本对于各个聚类的隶属度值和为1,即满足 ∑ j = 1 c μ j ( x i ) = 1 , i = 1 , 2 , ⋯   , n (2) \sum_{j=1}^c\mu_j(x_i)=1,\quad i=1,2,\cdots,n\tag{2} j=1cμj(xi)=1,i=1,2,,n(2)式(3)和式(4)分别用于计算样本 x i x_i xi对于类 A k A_k Ak的隶属度 μ i k \mu_{ik} μik c c c个聚类中心 { v i } \{v_i\} {vi} μ i k = 1 ∑ j = 1 c ( d i k d j k ) 2 b − 1 (3) \mu_{ik}=\frac{1}{\displaystyle\sum_{j=1}^c\left(\frac{d_{ik}}{d_{jk}}\right)^{\frac{2}{b-1}}}\tag{3} μik=j=1c(djkdik)b121(3) I k = { i ∣ 2 ≤ c < n ; d i k = 0 } I_k=\{i|2≤c<n;d_{ik}=0\} Ik={i2cn;dik=0},对于所有的 i i i类, i ∈ I k i∈I_k iIk μ i k = 0 \mu_{ik}=0 μik=0 v i j = ∑ k = 1 n ( μ i k ) b x k j ∑ k = 1 n ( μ i k ) b (4) v_{ij}=\frac{\displaystyle\sum_{k=1}^n(\mu_{ik})^bx_{kj}}{\displaystyle\sum_{k=1}^n(\mu_{ik})^b}\tag{4} vij=k=1n(μik)bk=1n(μik)bxkj(4)用式(3)和式(4)反复修改聚类中心、数据隶属度和进行分类,当算法收敛时,理论上就得到了各类的聚类中心以及各个样本对于各模式类的隶属度,从而完成了模糊聚类划分。尽管FCM有很高的搜索速度,但FCM是一种局部搜索算法,且对聚类中心的初值十分敏感,如果初值选择不当,它会收敛到局部极小点。
算法推导过程文献[2]

三、MATLAB程序实现

1、初始化

%% 初始化参数
data = rand(400, 2);
figure;
plot(data(:, 1), data(:, 2), 'ro', 'MarkerSize', 8);
xlabel '横坐标X'; ylabel '纵坐标';
title '样本数据';
K = 4;                   % 分类个数
maxgen = 100;            % 最大迭代次数
alpha = 3;               % 指数的次幂
threshold = 1e-6;        % 阈值
[data_n, in_n] = size(data);   % 行数,即样本个数/列数,即样本维数
% 初始化隶属度矩阵
U = rand(K, data_n);
col_sum = sum(U);
U = U./col_sum(ones(K, 1), :);

2、更新聚类中心、目标函数值、隶属度矩阵

% 更新聚类中心
mf = U.^alpha;
center = mf*data./((ones(in_n, 1)*sum(mf'))');
% 更新目标函数值
dist = zeros(size(center, 1), data_n);
for k = 1:size(center, 1)
    dist(k, :) = sqrt(sum(((data-ones(data_n, 1)*center(k, :)).^2)', 1));
end
J(i) = sum(sum((dist.^2).*mf));
% 更新隶属度矩阵
tmp = dist.^(-2/(alpha-1));
U = tmp./(ones(K, 1)*sum(tmp));
% 终止条件判断
if i > 1
    if abs(J(i) - J(i-1)) < threshold
        break;
    end
end

3、程序源码

具体程序代码如下:

%% 清空环境变量
clear;
clc;
close all;

%% 初始化参数
data = rand(400, 2);
figure;
plot(data(:, 1), data(:, 2), 'ro', 'MarkerSize', 8);
xlabel '横坐标X'; ylabel '纵坐标';
title '样本数据';
K = 4;              % 分类个数
maxgen = 100;       % 最大迭代次数
alpha = 3;          % 指数的次幂
threshold = 1e-6;   % 阈值
[data_n, in_n] = size(data);   % 行数,即样本个数/列数,即样本维数
% 初始化隶属度矩阵
U = rand(K, data_n);
col_sum = sum(U);
U = U./col_sum(ones(K, 1), :);

%% 迭代
for i = 1:maxgen
    % 更新聚类中心
    mf = U.^alpha;
    center = mf*data./((ones(in_n, 1)*sum(mf'))');
    % 更新目标函数值
    dist = zeros(size(center, 1), data_n);
    for k = 1:size(center, 1)
        dist(k, :) = sqrt(sum(((data-ones(data_n, 1)*center(k, :)).^2)', 1));
    end
    J(i) = sum(sum((dist.^2).*mf));
    % 更新隶属度矩阵
    tmp = dist.^(-2/(alpha-1));
    U = tmp./(ones(K, 1)*sum(tmp));
    % 终止条件判断
    if i > 1
        if abs(J(i) - J(i-1)) < threshold
            break;
        end
    end
end

%% 绘图
[max_vluae, index] = max(U);
index = index';
figure;
for i = 1:K
    col = find(index == i);      % max(U)返回隶属度列最大值所在行一致的分为一类
    plot(data(col, 1), data(col, 2), '*', 'MarkerSize', 8);
    hold on
end
grid on
% 画出聚类中心
plot(center(:, 1), center(:, 2), 'p', 'color', 'm', 'MarkerSize', 12);
xlabel '横坐标X'; ylabel '纵坐标Y';
title 'FCM优化后的聚类图';
% 目标函数变化过程
figure;
plot(J, 'r', 'linewidth', 2);
xlabel '迭代次数'; ylabel '目标函数值';
title 'FCM聚类目标函数变化过程';
grid on

4、结果分析

FCM优化后的聚类图如图2所示。
在这里插入图片描述

图2 FCM优化后的聚类图

FCM聚类目标函数值变化过程如图3所示。
在这里插入图片描述

图3 FCM聚类目标函数值变化过程

四、参考文献

[1] J. C. Dunn. A Fuzzy Relative of the ISODATA Process and Its Use in Detecting Compact Well-Separated Clusters[J]. Journal of Cybernetics, 1973, 3(3): 32-57.
[2] W.J.Z. matlab实现FCM算法. CSDN博客.
[3] 凯鲁嘎吉. FCM算法的matlab程序. 博客园.
[4] 郁磊, 史峰, 王辉, 等. MATLAB智能算法30个案例分析(第2版)[M]. 北京: 北京航空航天大学出版社, 2015.

  • 41
    点赞
  • 351
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 22
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

心️升明月

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值