基于FCM算法的聚类算法

基于FCM算法的聚类算法文章目录一 模糊聚类分析二 案例背景 1 问题描述 2 模糊 C 均值聚类算法 FCM 三 MATLAB 程序实现 1 初始化 2 更新聚类中心 目标函数值 隶属度矩阵 3 程序源码 4 结果分析四 参考文献一 模糊聚类分析模糊聚类是目前知识发现以及模式识别等诸多领域中的重要研究分支之一 随着研究范围的拓展 不管是科学研究还是实际应用 都对聚类的结果从多方面提出了更高的要求 模糊 C 均值聚类 FCM 是目前比较流行的一种聚类方法 该方法使用了在欧几里得空间确定数据点的几何贴近度的概念 它将这些数据分配到不同的聚类 然

一、模糊聚类分析

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

二、案例背景

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={
i2
cn;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、结果分析


图2 FCM优化后的聚类图


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

四、参考文献

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/221066.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午7:00
下一篇 2026年3月17日 下午7:00


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号