原文 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:patrick.lee@foxmail.com 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=======
复制代码
|