原文
http://www.matlabsky.com/thread-9389-1-1.html
【近期想要實現模糊核聚類算法(KFCM),所以就將FCM的一些東西一併整理了一下】
首先,我們看以下fcm函數語法使用
【功能描述】
Fuzzy c-means clustering
模糊C均值聚類算法,可將輸入的數據集data聚爲指定的cluster_n類
【函數描述】
語法格式
[center, U, obj_fcn] = FCM(data, cluster_n, options)
用法:
1. [center,U,obj_fcn] = FCM(Data,N_cluster,options);
2. [center,U,obj_fcn] = FCM(Data,N_cluster);
輸入變量
data ---- n*m矩陣,表示n個樣本,每個樣本具有m維特徵值
cluster_n ---- 標量,表示聚合中心數目,即類別數
options ---- 4*1列向量,其中
options(1): 隸屬度矩陣U的指數,>1(缺省值: 2.0)
options(2): 最大迭代次數(缺省值: 100)
options(3): 隸屬度最小變化量,迭代終止條件(缺省值: 1e-5)
options(4): 每次迭代是否輸出信息標誌(缺省值: 0)
輸出變量
center ---- 聚類中心
U ---- 隸屬度矩陣
obj_fcn ---- 目標函數值
【函數實例】
-
data = rand(100,2);
-
options = [2;100;1e-5;1];
-
[center,U,obj_fcn] = FCM(data,2,options);
-
figure;
-
plot(data(:,1), data(:,2),'o');
-
title('DemoTest of FCM Cluster');
-
xlabel('1st Dimension');
-
ylabel('2nd Dimension');
-
grid on;
-
hold on;
-
maxU = max(U);
-
index1 = find(U(1,:) == maxU);
-
index2 = find(U(2,:) == maxU);
-
line(data(index1,1),data(index1,2),'marker','*','color','g');
-
line(data(index2,1),data(index2,2),'marker','*','color','r');
-
plot([center([1 2],1)],[center([1 2],2)],'*','color','k')
-
hold off;
複製代碼
補充:data = rand(100,2);
options = [2;100;1e-5;1];
<span style="color:#ff0000;">[center,U,obj_fcn] = FCM(data,3,options); </span>
figure;
plot(data(:,1), data(:,2),'o');
title('DemoTest of FCM Cluster');
xlabel('1st Dimension');
ylabel('2nd Dimension');
grid on;
hold on;
maxU = max(U);
index1 = find(U(1,:) == maxU);
index2 = find(U(2,:) == maxU);
<span style="color:#ff0000;">index3 = find(U(3,:) == maxU);</span>
line(data(index1,1),data(index1,2),'marker','*','color','g');
line(data(index2,1),data(index2,2),'marker','*','color','r');
<span style="color:#ff0000;">line(data(index3,1),data(index3,2),'marker','*','color','y');</span>
<span style="color:#ff0000;">plot([center(:,1)],[center(:,2)],'*','color','k') </span>
hold off;
接着,我們來詳細研究一下fcm的實現代碼
-
function [center, U, obj_fcn] = FCM(data, cluster_n, options)
-
% 採用FCM(模糊C均值)算法將數據集data聚爲cluster_n類
-
% MATLAB自帶的FCM算法整合整理+註釋詳解整理
-
% by faruto @ faruto's Studio http://blog.sina.com.cn/faruto
-
% Email:[email protected] QQ:516667408
-
% http://www.matlabsky.com http://www.mfun.la
-
% last modified 2010.08.21
-
% 用法:
-
% 1. [center,U,obj_fcn] = FCM(Data,N_cluster,options);
-
% 2. [center,U,obj_fcn] = FCM(Data,N_cluster);
-
%
-
% 輸入:
-
% data ---- n*m矩陣,表示n個樣本,每個樣本具有m維特徵值
-
% cluster_n ---- 標量,表示聚合中心數目,即類別數
-
% options ---- 4*1列向量,其中
-
% options(1): 隸屬度矩陣U的指數,>1(缺省值: 2.0)
-
% options(2): 最大迭代次數(缺省值: 100)
-
% options(3): 隸屬度最小變化量,迭代終止條件(缺省值: 1e-5)
-
% options(4): 每次迭代是否輸出信息標誌(缺省值: 0)
-
% 輸出:
-
% center ---- 聚類中心
-
% U ---- 隸屬度矩陣
-
% obj_fcn ---- 目標函數值
-
% Example:
-
% data = rand(100,2);
-
% options = [2;100;1e-5;1];
-
% [center,U,obj_fcn] = FCM(data,2,options);
-
% figure;
-
% plot(data(:,1), data(:,2),'o');
-
% title('DemoTest of FCM Cluster');
-
% xlabel('1st Dimension');
-
% ylabel('2nd Dimension');
-
% grid on;
-
% hold on;
-
% maxU = max(U);
-
% index1 = find(U(1,:) == maxU);
-
% index2 = find(U(2,:) == maxU);
-
% line(data(index1,1),data(index1,2),'marker','*','color','g');
-
% line(data(index2,1),data(index2,2),'marker','*','color','r');
-
% plot([center([1 2],1)],[center([1 2],2)],'*','color','k')
-
% hold off;
-
%% 初始化initialization
-
-
% 輸入參數數量檢測
-
if nargin ~= 2 && nargin ~= 3 %判斷輸入參數個數只能是2個或3個
-
error('Too many or too few input arguments!');
-
end
-
-
data_n = size(data, 1); % 求出data的第一維(rows)數,即樣本個數
-
data_m = size(data, 2); % 求出data的第二維(columns)數,即特徵屬性個數
-
% 設置默認操作參數
-
default_options = ...
-
[2; % 隸屬度矩陣U的指數
-
100; % 最大迭代次數
-
1e-5; % 隸屬度最小變化量,迭代終止條件
-
0]; % 每次迭代是否輸出信息標誌
-
if nargin == 2
-
% 如果輸入參數個數是二那麼就調用默認的option
-
options = default_options;
-
else
-
% 如果用戶給的opition數少於4個那麼其他用默認值
-
if length(options) < 4
-
tmp = default_options;
-
tmp(1:length(options)) = options;
-
options = tmp;
-
end
-
% 檢測options中是否有nan值
-
nan_index = find(isnan(options)==1);
-
% 將denfault_options中對應位置的參數賦值給options中不是數的位置.
-
options(nan_index) = default_options(nan_index);
-
% 如果模糊矩陣的指數小於等於1,給出報錯
-
if options(1) <= 1,
-
error('The exponent should be greater than 1!');
-
end
-
end
-
% 將options中的分量分別賦值給四個變量
-
expo = options(1); % 隸屬度矩陣U的指數
-
max_iter = options(2); % 最大迭代次數
-
min_impro = options(3); % 隸屬度最小變化量,迭代終止條件
-
display = options(4); % 每次迭代是否輸出信息標誌
-
-
obj_fcn = zeros(max_iter, 1); % 初始化輸出參數obj_fcn
-
U = initfcm(cluster_n, data_n); % 初始化模糊分配矩陣,使U滿足列上相加爲1
-
%% Main loop 主要循環
-
for i = 1:max_iter
-
% 在第k步循環中改變聚類中心ceneter,和分配函數U的隸屬度值;
-
[U, center, obj_fcn(i)] = stepfcm(data, U, cluster_n, expo);
-
if display,
-
fprintf('FCM:Iteration count = %d, obj.fcn = %f\n', i, obj_fcn(i));
-
end
-
% 終止條件判別
-
if i > 1 && abs(obj_fcn(i) - obj_fcn(i-1)) <= min_impro
-
break;
-
end
-
end
-
iter_n = i; % 實際迭代次數
-
obj_fcn(iter_n+1:max_iter) = [];
-
-
%% initfcm子函數
-
function U = initfcm(cluster_n, data_n)
-
% 初始化fcm的隸屬度函數矩陣
-
% 輸入:
-
% cluster_n ---- 聚類中心個數
-
% data_n ---- 樣本點數
-
% 輸出:
-
% U ---- 初始化的隸屬度矩陣
-
U = rand(cluster_n, data_n);
-
col_sum = sum(U);
-
U = U./col_sum(ones(cluster_n, 1), :);
-
%% stepfcm子函數
-
function [U_new, center, obj_fcn] = stepfcm(data, U, cluster_n, expo)
-
% 模糊C均值聚類時迭代的一步
-
% 輸入:
-
% data ---- n*m矩陣,表示n個樣本,每個樣本具有m維特徵值
-
% U ---- 隸屬度矩陣
-
% cluster_n ---- 標量,表示聚合中心數目,即類別數
-
% expo ---- 隸屬度矩陣U的指數
-
% 輸出:
-
% U_new ---- 迭代計算出的新的隸屬度矩陣
-
% center ---- 迭代計算出的新的聚類中心
-
% obj_fcn ---- 目標函數值
-
mf = U.^expo; % 隸屬度矩陣進行指數運算結果
-
center = mf*data./((ones(size(data, 2), 1)*sum(mf'))'); % 新聚類中心
-
dist = distfcm(center, data); % 計算距離矩陣
-
obj_fcn = sum(sum((dist.^2).*mf)); % 計算目標函數值
-
tmp = dist.^(-2/(expo-1));
-
U_new = tmp./(ones(cluster_n, 1)*sum(tmp)); % 計算新的隸屬度矩陣
-
%% distfcm子函數
-
function out = distfcm(center, data)
-
% 計算樣本點距離聚類中心的距離
-
% 輸入:
-
% center ---- 聚類中心
-
% data ---- 樣本點
-
% 輸出:
-
% out ---- 距離
-
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
複製代碼
=============
==外一篇KFCM與FCM的測試比較==
從比較中可以看出KFCM的迭代步驟更少而且可以得出同樣模式的聚類,能更有效的進行聚類,即將核函數的思想引入FCM可以提高聚類效率(也可以提高聚類的效果尤其是對噪聲的抵禦能力,但這個在下面的仿真測試中還沒有體現)
測試1:
-
=========聚類數目:2=============
-
=========樣本數目:1000=============
-
=====DemoTest of FCM Cluster Start=======
-
Elapsed time is 0.104910 seconds.
-
iterFcm =
-
81
-
=====DemoTest of FCM Cluster Done=======
-
=====DemoTest of KFCM Cluster Start=======
-
iterKFcm =
-
72
-
Elapsed time is 0.085688 seconds.
-
=====DemoTest of KFCM Cluster Done=======
複製代碼
測試2:
-
=========聚類數目:2=============
-
=========樣本數目:2000=============
-
=====DemoTest of FCM Cluster Start=======
-
Elapsed time is 0.394891 seconds.
-
iterFcm =
-
304
-
=====DemoTest of FCM Cluster Done=======
-
=====DemoTest of KFCM Cluster Start=======
-
iterKFcm =
-
146
-
Elapsed time is 0.307502 seconds.
-
=====DemoTest of KFCM Cluster Done=======
複製代碼
測試3:
-
=========聚類數目:3=============
-
=========樣本數目:2000=============
-
=====DemoTest of FCM Cluster Start=======
-
Elapsed time is 0.614612 seconds.
-
iterFcm =
-
347
-
=====DemoTest of FCM Cluster Done=======
-
=====DemoTest of KFCM Cluster Start=======
-
iterKFcm =
-
20
-
Elapsed time is 0.081001 seconds.
-
=====DemoTest of KFCM Cluster Done=======
複製代碼
測試4:
-
=========聚類數目:3=============
-
=========樣本數目:1000=============
-
=====DemoTest of FCM Cluster Start=======
-
Elapsed time is 0.135941 seconds.
-
iterFcm =
-
61
-
=====DemoTest of FCM Cluster Done=======
-
=====DemoTest of KFCM Cluster Start=======
-
iterKFcm =
-
51
-
Elapsed time is 0.096983 seconds.
-
=====DemoTest of KFCM Cluster Done=======
複製代碼
測試5:
-
=========聚類數目:4=============
-
=========樣本數目:1000=============
-
=====DemoTest of FCM Cluster Start=======
-
Elapsed time is 0.124145 seconds.
-
iterFcm =
-
37
-
=====DemoTest of FCM Cluster Done=======
-
=====DemoTest of KFCM Cluster Start=======
-
iterKFcm =
-
29
-
Elapsed time is 0.080621 seconds.
-
=====DemoTest of KFCM Cluster Done=======
複製代碼
測試6:
-
=========聚類數目:4=============
-
=========樣本數目:2000=============
-
=====DemoTest of FCM Cluster Start=======
-
Elapsed time is 0.168298 seconds.
-
iterFcm =
-
39
-
=====DemoTest of FCM Cluster Done=======
-
=====DemoTest of KFCM Cluster Start=======
-
iterKFcm =
-
31
-
Elapsed time is 0.135263 seconds.
-
=====DemoTest of KFCM Cluster Done=======
複製代碼
|