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
% 输入参数数量检测