文章目录
一、模糊聚类分析
模糊聚类是目前知识发现以及模式识别等诸多领域中的重要研究分支之一。随着研究范围的拓展,不管是科学研究还是实际应用,都对聚类的结果从多方面提出了更高的要求。模糊C–均值聚类(FCM)是目前比较流行的一种聚类方法。该方法使用了在欧几里得空间确定数据点的几何贴近度的概念,它将这些数据分配到不同的聚类,然后确定这些聚类之间的距离。模糊C–均值聚类算法在理论和应用上都为其他的模糊聚类分析方法奠定了基础,应用也最广泛。
二、案例背景
1、问题描述
本文将FCM作用于随机产生的数据进行实验。数据由400个二维平面上的点组成,这些点构成4个集合,但彼此之间并没有明显的界限,数据分布如图1所示。
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(2≤c≤n)是要将数据样本分成的类型的数目,
{
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=1∑nk=1∑c(μ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(xi−vk)=j=1∑m(xij−vkj)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≤∞
1≤b≤∞。模糊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=1∑cμ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=1∑c(djkdik)b−121(3)设
I
k
=
{
i
∣
2
≤
c
<
n
;
d
i
k
=
0
}
I_k=\{i|2≤c<n;d_{ik}=0\}
Ik={i∣2≤c<n;dik=0},对于所有的
i
i
i类,
i
∈
I
k
i∈I_k
i∈Ik,
μ
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=1∑n(μik)bk=1∑n(μ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所示。
FCM聚类目标函数值变化过程如图3所示。
四、参考文献
[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.