FCMClust(模糊c均值聚类算法MATLAB实现)
- 格式:doc
- 大小:33.50 KB
- 文档页数:4
模糊C均值算法(FCM)分割图像MATLAB程序分类:学习2011-11-17 22:16929人阅读评论(5)收藏举报matlab算法cimageoutputfunction模糊C均值算法(FCM)分割图像MATLAB程序做课题的时候用到模糊C均值算法(FCM)分割图像,写了MATLAB程序给需要的朋友们,仅供参考。
若有不妥之处,望予以指教。
% 文件名: FCM.m% 功能: 模糊C均值(FCM)聚类算法分割图像% 作者: 雨帘% 时间: 2011/11/17%%%%%%%%%%%%%%% FCM算法分割图像%%%%%%%%%%%%%%function clusterResult = FCM(imagePath, C, V, M, iter, epsm)% 模糊C均值(FCM)聚类算法分割图像% clusterResult = FCM(imagePath, C, V, M, iter, epsm)% Example: clusterResult = FCM('E:\Image\lena.bmp')% clusterResult = FCM('E:\Image\lena.bmp',3,[0 127 255])% Input:% imagePath: 图像路径% C: 类别数,缺省值为2% V: 初始化聚类中心,缺省值为[0 255]% M: 加权指数,缺省值为2% iter: 迭代次数,缺省值为100% epsm: 迭代停止阈值,缺省值为1.0e-2% Output:% clusterResult: 聚类中心结果% Note:% C的值要与V的初始化聚类中心个数相同% 设定缺省值if nargin < 6epsm = 1.0e-2;endif nargin < 5iter = 100;endif nargin < 4M = 2;endif nargin < 3V = [0 255];endif nargin < 2C = 2;end% 读入图像及其信息I = imread(imagePath);figure, imshow(I);title('原图像');[row col] = size(I);grayHist = imhist(I);figure, imhist(I);title('直方图');histProb = grayHist / (row * col);len = length(histProb);tic% FCM迭代过程cnt = 0;while(cnt < iter)% 计算隶属度函数(注意要特殊考虑某个像素点和聚类中心一样的情况) for i = 1 : lenflag = 0;for j = 1 : Cif i == V(j)U(j, i) = 1.0;if j == 1U(j + 1 : C, i) = 0.0;elseif j == CU(1 : C - 1, i) = 0.0;elseU(1 : j - 1, i) = 0.0;U(j + 1 : C, i) = 0.0;endflag = 1;break;endendif flag == 0u = (1.0 ./ ((i - V) .^ 2)) .^ (1.0 / (M - 1));uSum = sum(u);U(1 : C, i) = u' / uSum;endend% 计算更新各类聚类中心for j = 1 : Ci = linspace(1, len, len);v = sum(histProb' .* i .* (U(j, :) .^ M));vSum = sum(histProb' .* (U(j, :) .^ M));if vSum == 0clusterResult(j) = 0;elseclusterResult(j) = v / vSum;endend% 计算误差并判断算法迭代是否停止diff = sum((clusterResult - V) .^ 2);if diff <= epsmbreak;elseV = clusterResult;endcnt = cnt + 1;endtoc% 分割图像for i = 1 : rowfor j = 1 : coltemp = (double(I(i, j)) - clusterResult) .^ 2;[fmin pos] = min(temp);I(i, j) = pos * 255 / C;endendfigure, imshow(uint8(I));title('分割后的图像');disp('迭代次数:iterTimes = ');disp(cnt);% end of FCM.m分享到:下一篇:基于VTK的图像三维重建查看评论5楼菜鸟英雄2013-06-06 20:07发表[回复][引用][举报]??? Undefined function or method 'unction' for input arguments of type 'char'.4楼mhx_nx 2013-03-23 22:08发表[回复][引用][举报]准备调试3楼xiaobi361 2012-05-06 22:36发表[回复][引用][举报]为什么总是有错误啊Elapsed time is 0.108087 seconds.??? Attempted to access I(1,305); index out of bounds because size(I)=[304,304].Error in ==> FCM at 106temp = (double(I(i, j)) - clusterResult).^ 2;2楼FTfengtao 2012-04-16 15:38发表[回复][引用][举报]像clusterResult = FCM('E:\Image\lena.bmp',3,[0 127 255])调用。
在Matlab中使用模糊C均值聚类进行图像分析的技巧在图像分析领域,模糊C均值聚类(FCM)是一种常用的工具,它可以帮助我们发现图像中隐藏的信息和模式。
通过使用Matlab中的模糊逻辑工具箱,我们可以轻松地实现FCM算法,并进行图像分析。
本文将介绍在Matlab中使用FCM进行图像分析的技巧。
首先,让我们简要了解一下FCM算法。
FCM是一种基于聚类的图像分割方法,它将图像的像素分为不同的聚类,每个聚类代表一类像素。
与传统的C均值聚类算法不同,FCM允许像素属于多个聚类,因此能够更好地处理图像中的模糊边界。
在Matlab中使用FCM进行图像分析的第一步是加载图像。
可以使用imread函数将图像加载到Matlab的工作区中。
例如,我们可以加载一张名为“image.jpg”的图像:```matlabimage = imread('image.jpg');```加载图像后,可以使用imshow函数显示图像。
这可以帮助我们对图像有一个直观的了解:```matlabimshow(image);```接下来,我们需要将图像转换为灰度图像。
这是因为FCM算法通常用于灰度图像分析。
可以使用rgb2gray函数将彩色图像转换为灰度图像:```matlabgrayImage = rgb2gray(image);```在使用FCM算法之前,我们需要对图像进行预处理。
预处理的目的是消除图像中的噪声和不必要的细节,从而更好地提取图像中的特征。
常用的图像预处理方法包括平滑、锐化和边缘检测等。
Matlab中提供了许多图像预处理函数。
例如,可以使用imnoise函数向图像中添加高斯噪声:```matlabnoisyImage = imnoise(grayImage, 'gaussian', 0, 0.01);```还可以使用imfilter函数对图像进行平滑处理。
常见的平滑方法包括均值滤波和高斯滤波:```matlabsmoothImage = imfilter(noisyImage, fspecial('average', 3));```一旦完成预处理步骤,我们就可以使用模糊逻辑工具箱中的fcm函数执行FCM算法。
模糊c均值聚类FCM算法的MATLAB代码我做毕业论文时需要模糊C-均值聚类,找了好长时间才找到这个,分享给大家:FCM算法的两种迭代形式的MA TLAB代码写于下,也许有的同学会用得着:m文件1/7:function [U,P,Dist,Cluster_Res,Obj_Fcn,iter]=fuzzycm(Data,C,plotflag,M,epsm)% 模糊C 均值聚类FCM: 从随机初始化划分矩阵开始迭代% [U,P,Dist,Cluster_Res,Obj_Fcn,iter] = fuzzycm(Data,C,plotflag,M,epsm)% 输入:% Data: N×S 型矩阵,聚类的原始数据,即一组有限的观测样本集,% Data 的每一行为一个观测样本的特征矢量,S 为特征矢量% 的维数,N 为样本点的个数% C: 聚类数,1<C<N% plotflag: 聚类结果2D/3D 绘图标记,0 表示不绘图,为缺省值% M: 加权指数,缺省值为2% epsm: FCM 算法的迭代停止阈值,缺省值为1.0e-6% 输出:% U: C×N 型矩阵,FCM 的划分矩阵% P: C×S 型矩阵,FCM 的聚类中心,每一行对应一个聚类原型% Dist: C×N 型矩阵,FCM 各聚类中心到各样本点的距离,聚类中% 心i 到样本点j 的距离为Dist(i,j)% Cluster_Res: 聚类结果,共C 行,每一行对应一类% Obj_Fcn: 目标函数值% iter: FCM 算法迭代次数% See also: fuzzydist maxrowf fcmplotif nargin<5epsm=1.0e-6;endif nargin<4M=2;endif nargin<3plotflag=0;end[N,S]=size(Data);m=2/(M-1);iter=0;Dist(C,N)=0; U(C,N)=0; P(C,S)=0;% 随机初始化划分矩阵U0 = rand(C,N);U0=U0./(ones(C,1)*sum(U0));% FCM 的迭代算法while true% 迭代计数器iter=iter+1;% 计算或更新聚类中心PUm=U0.^M;P=Um*Data./(ones(S,1)*sum(Um'))';% 更新划分矩阵Ufor i=1:Cfor j=1:NDist(i,j)=fuzzydist(P(i,:),Data(j,:));endendU=1./(Dist.^m.*(ones(C,1)*sum(Dist.^(-m))));% 目标函数值: 类内加权平方误差和if nargout>4 | plotflagObj_Fcn(iter)=sum(sum(Um.*Dist.^2));end% FCM 算法迭代停止条件if norm(U-U0,Inf)<epsmbreakendU0=U;end% 聚类结果if nargout > 3res = maxrowf(U);for c = 1:Cv = find(res==c);Cluster_Res(c,1:length(v))=v;endend% 绘图if plotflagfcmplot(Data,U,P,Obj_Fcn);endm文件2/7:function [U,P,Dist,Cluster_Res,Obj_Fcn,iter]=fuzzycm2(Data,P0,plotflag,M,epsm) % 模糊C 均值聚类FCM: 从指定初始聚类中心开始迭代% [U,P,Dist,Cluster_Res,Obj_Fcn,iter] = fuzzycm2(Data,P0,plotflag,M,epsm)% 输入: Data,plotflag,M,epsm: 见fuzzycm.m% P0: 初始聚类中心% 输出: U,P,Dist,Cluster_Res,Obj_Fcn,iter: 见fuzzycm.m% See also: fuzzycmif nargin<5epsm=1.0e-6;if nargin<4M=2;endif nargin<3plotflag=0;end[N,S] = size(Data); m = 2/(M-1); iter = 0;C=size(P0,1);Dist(C,N)=0;U(C,N)=0;P(C,S)=0;% FCM 的迭代算法while true% 迭代计数器iter=iter+1;% 计算或更新划分矩阵Ufor i=1:Cfor j=1:NDist(i,j)=fuzzydist(P0(i,:),Data(j,:));endendU=1./(Dist.^m.*(ones(C,1)*sum(Dist.^(-m))));% 更新聚类中心PUm=U.^M;P=Um*Data./(ones(S,1)*sum(Um'))';% 目标函数值: 类内加权平方误差和if nargout>4 | plotflagObj_Fcn(iter)=sum(sum(Um.*Dist.^2));end% FCM 算法迭代停止条件if norm(P-P0,Inf)<epsmbreakendP0=P;end% 聚类结果if nargout > 3res = maxrowf(U);for c = 1:Cv = find(res==c);Cluster_Res(c,1:length(v))=v;endend% 绘图if plotflagfcmplot(Data,U,P,Obj_Fcn);m文件3/7:function fcmplot(Data,U,P,Obj_Fcn)% FCM 结果绘图函数% See also: fuzzycm maxrowf ellipse[C,S] = size(P); res = maxrowf(U);str = 'po*x+d^v><.h';% 目标函数绘图figure(1),plot(Obj_Fcn)title('目标函数值变化曲线','fontsize',8)% 2D 绘图if S==2figure(2),plot(P(:,1),P(:,2),'rs'),hold onfor i=1:Cv=Data(find(res==i),:);plot(v(:,1),v(:,2),str(rem(i,12)+1))ellipse(max(v(:,1))-min(v(:,1)), ...max(v(:,2))-min(v(:,2)), ...[max(v(:,1))+min(v(:,1)), ...max(v(:,2))+min(v(:,2))]/2,'r:') endgrid on,title('2D 聚类结果图','fontsize',8),hold off end% 3D 绘图if S>2figure(2),plot3(P(:,1),P(:,2),P(:,3),'rs'),hold onfor i=1:Cv=Data(find(res==i),:);plot3(v(:,1),v(:,2),v(:,3),str(rem(i,12)+1))ellipse(max(v(:,1))-min(v(:,1)), ...max(v(:,2))-min(v(:,2)), ...[max(v(:,1))+min(v(:,1)), ...max(v(:,2))+min(v(:,2))]/2, ...'r:',(max(v(:,3))+min(v(:,3)))/2) endgrid on,title('3D 聚类结果图','fontsize',8),hold off endm文件4/7:function D=fuzzydist(A,B)% 模糊聚类分析: 样本间的距离% D = fuzzydist(A,B)D=norm(A-B);m文件5/7:function mr=maxrowf(U,c)% 求矩阵U 每列第c 大元素所在行,c 的缺省值为1% 调用格式: mr = maxrowf(U,c)% See also: addrif nargin<2c=1;endN=size(U,2);mr(1,N)=0;for j=1:Naj=addr(U(:,j),'descend');mr(j)=aj(c);endm文件6/7:function ellipse(a,b,center,style,c_3d)% 绘制一个椭圆% 调用: ellipse(a,b,center,style,c_3d)% 输入:% a: 椭圆的轴长(平行于x 轴)% b: 椭圆的轴长(平行于y 轴)% center: 椭圆的中心[x0,y0],缺省值为[0,0]% style: 绘制的线型和颜色,缺省值为实线蓝色% c_3d: 椭圆的中心在3D 空间中的z 轴坐标,可缺省if nargin<4style='b';endif nargin<3 | isempty(center)center=[0,0];endt=1:360;x=a/2*cosd(t)+center(1);y=b/2*sind(t)+center(2);if nargin>4plot3(x,y,ones(1,360)*c_3d,style)elseplot(x,y,style)endm文件7/7:function f = addr(a,strsort)% 返回向量升序或降序排列后各分量在原始向量中的索引% 函数调用:f = addr(a,strsort)% strsort: 'ascend' or 'descend'% default is 'ascend'% -------- example --------% addr([ 4 5 1 2 ]) returns ans:% [ 3 4 1 2 ]if nargin==1strsort='ascend';endsa=sort(a); ca=a;la=length(a);f(la)=0;for i=1:laf(i)=find(ca==sa(i),1);ca(f(i))=NaN;endif strcmp(strsort,'descend') f=fliplr(f);end几天前我还在这里发帖求助,可是很幸运在其他地方找到了,在这里和大家分享一下!function [center, U, obj_fcn] = FCMClust(data, cluster_n, options)% FCMClust.m 采用模糊C均值对数据集data聚为cluster_n类%% 用法:% 1. [center,U,obj_fcn] = FCMClust(Data,N_cluster,options);% 2. [center,U,obj_fcn] = FCMClust(Data,N_cluster);%% 输入:% data ---- nxm矩阵,表示n个样本,每个样本具有m的维特征值% N_cluster ---- 标量,表示聚合中心数目,即类别数% options ---- 4x1矩阵,其中% options(1): 隶属度矩阵U的指数,>1 (缺省值: 2.0)% options(2): 最大迭代次数(缺省值: 100)% options(3): 隶属度最小变化量,迭代终止条件(缺省值: 1e-5)% options(4): 每次迭代是否输出信息标志 (缺省值: 1)% 输出:% center ---- 聚类中心% U ---- 隶属度矩阵% obj_fcn ---- 目标函数值% Example:% data = rand(100,2);% [center,U,obj_fcn] = FCMClust(data,2);% plot(data(:,1), data(:,2),'o');% 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;if nargin ~= 2 & nargin ~= 3, %判断输入参数个数只能是2个或3个error('Too many or too few input arguments!');enddata_n = size(data, 1); % 求出data的第一维(rows)数,即样本个数in_n = size(data, 2); % 求出data的第二维(columns)数,即特征值长度% 默认操作参数default_options = [2; % 隶属度矩阵U的指数100; % 最大迭代次数1e-5; % 隶属度最小变化量,迭代终止条件1]; % 每次迭代是否输出信息标志if nargin == 2,options = default_options;else %分析有options做参数时候的情况% 如果输入参数个数是二那么就调用默认的option;if length(options) < 4, %如果用户给的opition数少于4个那么其他用默认值;tmp = default_options;tmp(1:length(options)) = options;options = tmp;end% 返回options中是数的值为0(如NaN),不是数时为1nan_index = find(isnan(options)==1);%将denfault_options中对应位置的参数赋值给options中不是数的位置.options(nan_index) = default_options(nan_index);if options(1) <= 1, %如果模糊矩阵的指数小于等于1error('The exponent should be greater than 1!');endend%将options 中的分量分别赋值给四个变量;expo = options(1); % 隶属度矩阵U的指数max_iter = options(2); % 最大迭代次数min_impro = options(3); % 隶属度最小变化量,迭代终止条件display = options(4); % 每次迭代是否输出信息标志obj_fcn = zeros(max_iter, 1); % 初始化输出参数obj_fcnU = 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,if abs(obj_fcn(i) - obj_fcn(i-1)) < min_impro,break;end,endenditer_n = i; % 实际迭代次数obj_fcn(iter_n+1:max_iter) = [];[center, U, obj_fcn] = FCMClust(Data,N_cluster,options)data=[94.4304 98 60 0 8592.8068 70 70 0 75.286.3522 100 75 24.87 91.580.5512 50 90 0 65.480.494 76 100 0 9888.1528 100 60 80 78.484.567 55 80 0 8587.722 30 60 0 4988.0056 95 70 46.459 45.885.948 100 60 0 55.683.9578 10 90 0 78.490.0822 5 60 0 58.876.7448 10 60 0 39.295.062 100 70 62.37 94.8];N_cluster=4;options(1)=[2];options(2)=[100];options(3)=[1e-5];options(4)=[1];。
c均值聚类matlab
在MATLAB中,使用c均值聚类(C-means clustering)可以通
过以下步骤实现:
1. 导入数据,首先,你需要准备你的数据集并将其导入MATLAB中。
你可以使用`csvread`或`xlsread`函数来从CSV文件或Excel文件中读取数据,或者直接创建一个数据矩阵。
2. 数据预处理,在进行聚类之前,通常需要对数据进行预处理,例如归一化或标准化,以确保各个特征对聚类结果的影响是均衡的。
3. 调用c均值聚类函数:MATLAB提供了`fcm`函数来实现c均
值聚类。
你可以使用以下语法来调用该函数:
[centers, U] = fcm(data, clusterNum);
其中,`data`是你的数据矩阵,`clusterNum`是你想要得到
的聚类中心的数量。
`centers`包含了每个聚类中心的坐标,`U`是
一个隶属度矩阵,描述了每个数据点属于每个聚类的概率。
4. 可视化结果,你可以使用MATLAB的绘图函数,如`scatter`或`plot`来可视化聚类结果,以及聚类中心的位置。
5. 结果分析,最后,对聚类结果进行分析和解释,可以使用各种统计工具和可视化手段来理解不同聚类之间的差异和相似性。
需要注意的是,c均值聚类的结果可能受初始聚类中心的选择和随机性影响,因此通常需要多次运行算法并比较结果,以确保得到稳健的聚类结果。
希望这些信息能够帮助到你在MATLAB中实现c 均值聚类。
使用Matlab进行模糊聚类分析概述模糊聚类是一种非常有用的数据分析方法,它可以帮助我们在数据集中找到隐藏的模式和结构。
在本文中,我们将介绍如何使用Matlab进行模糊聚类分析,以及该方法的一些应用和局限性。
引言聚类分析是一种数据挖掘技术,其目的是将数据集中相似的数据点划分为不同的群组或簇。
而模糊聚类则是一种非常强大的聚类方法,它允许数据点属于不同的群组,以及具有不同的隶属度。
因此,模糊聚类可以更好地处理一些模糊性或不确定性的情况。
Matlab中的模糊聚类分析工具Matlab是一种功能强大的数值计算和数据分析软件,它提供了一些内置的模糊聚类分析工具,可以帮助我们进行模糊聚类分析。
其中最常用的是fcm函数(fuzzy c-means clustering)。
fcm函数是基于fuzzy c-means算法的,它使用隶属度矩阵来度量数据点与不同类之间的相似性。
该函数需要指定聚类的数量和迭代次数,然后根据数据点与聚类中心之间的距离来计算隶属度矩阵,并不断迭代更新聚类中心和隶属度矩阵,直到收敛为止。
例如,假设我们有一个包含N个数据点的数据集X,每个数据点包含M个特征。
我们可以使用fcm函数对该数据集进行模糊聚类分析,首先将数据集归一化,并指定聚类的数量(如3个聚类),迭代次数(如100次),并设置模糊指数(如2)。
然后,我们可以使用聚类中心来获得每个数据点的隶属度,并根据隶属度矩阵来进行进一步的数据分析或可视化。
应用实例模糊聚类分析在实际中有很多应用,下面我们将介绍其中两个常见的应用实例。
1. 图像分割图像分割是一种将图像的像素点划分为不同区域或对象的过程。
模糊聚类分析可以在图像分割中发挥重要作用,因为它可以通过考虑像素点与不同区域之间的隶属度来更好地处理图像的模糊性和纹理。
通过使用Matlab中的模糊聚类分析工具,我们可以将一张图像分割为不同的区域,并进一步进行对象识别或图像处理。
2. 数据分类在数据挖掘和机器学习中,数据分类是一个非常重要的任务,其目的是将数据点划分到不同的类别中。
MATLAB实现FCM聚类算法本⽂在阐述聚类分析⽅法的基础上重点研究FCM聚类算法。
FCM算法是⼀种基于划分的聚类算法,它的思想是使得被划分到同⼀簇的对象之间相似度最⼤,⽽不同簇之间的相似度最⼩。
最后基于MATLAB实现了对图像信息的聚类。
第1章概述聚类分析是数据挖掘的⼀项重要功能,⽽聚类算法是⽬前研究的核⼼,聚类分析就是使⽤聚类算法来发现有意义的聚类,即“物以类聚”。
虽然聚类也可起到分类的作⽤,但和⼤多数分类或预测不同。
⼤多数分类⽅法都是演绎的,即⼈们事先确定某种事物分类的准则或各类别的标准,分类的过程就是⽐较分类的要素与各类别标准,然后将各要素划归于各类别中。
确定事物的分类准则或各类别的标准或多或少带有主观⾊彩。
为获得基于划分聚类分析的全局最优结果,则需要穷举所有可能的对象划分,为此⼤多数应⽤采⽤的常⽤启发⽅法包括:k-均值算法,算法中的每⼀个聚类均⽤相应聚类中对象的均值来表⽰;k-medoid算法,算法中的每⼀个聚类均⽤相应聚类中离聚类中⼼最近的对象来表⽰。
这些启发聚类⽅法在分析中⼩规模数据集以发现圆形或球状聚类时⼯作得很好,但当分析处理⼤规模数据集或复杂数据类型时效果较差,需要对其进⾏扩展。
⽽模糊C均值(Fuzzy C-means,FCM)聚类⽅法,属于基于⽬标函数的模糊聚类算法的范畴。
模糊C均值聚类⽅法是基于⽬标函数的模糊聚类算法理论中最为完善、应⽤最为⼴泛的⼀种算法。
模糊c均值算法最早从硬聚类⽬标函数的优化中导出的。
为了借助⽬标函数法求解聚类问题,⼈们利⽤均⽅逼近理论构造了带约束的⾮线性规划函数,以此来求解聚类问题,从此类内平⽅误差和WGSS(Within-Groups Sum of Squared Error)成为聚类⽬标函数的普遍形式。
随着模糊划分概念的提出,Dunn[10]⾸先将其推⼴到加权WGSS函数,后来由Bezdek扩展到加权WGSS的⽆限族,形成了FCM聚类算法的通⽤聚类准则。
聚类——FCM的matlab程序聚类——FCM的matlab程序在⽂章中已介绍了FCM算法的理论知识,现在⽤matlab进⾏实现。
1.matlab程序FCM_main.mfunction [ave_acc_FCM,max_acc_FCM,min_acc_FCM,ave_iter_FCM,ave_run_time]=FCM_main(X,real_label,K)%输⼊K:聚的类,max_iter是最⼤迭代次数%输出ave_acc_FCM:迭代max_iter次之后的平均准确度t0=cputime;s=0;s_1=0;max_iter=20; %重复max_iter次accuracy=zeros(max_iter,1);iter_FCM_t=zeros(max_iter,1);%对data做最⼤-最⼩归⼀化处理% [data_num,~]=size(data);% X=(data-ones(data_num,1)*min(data))./(ones(data_num,1)*(max(data)-min(data)));for i=1:max_iter[label_1,~,iter_FCM]=My_FCM(X,K);iter_FCM_t(i)=iter_FCM;accuracy(i)=succeed(real_label,K,label_1);s=s+accuracy(i);s_1=s_1+iter_FCM_t(i);fprintf('第 %2d 次,FCM的迭代次数为:%2d,准确度为:%.8f\n', i, iter_FCM_t(i), accuracy(i));endave_iter_FCM=s_1/max_iter;ave_acc_FCM=s/max_iter;max_acc_FCM=max(accuracy);min_acc_FCM=min(accuracy);run_time=cputime-t0;ave_run_time=run_time/max_iter;My_FCM.mfunction [label_1,para_miu_new,iter]=My_FCM(X,K)%输⼊K:聚类数%输出:label_1:聚的类, para_miu_new:模糊聚类中⼼µ,responsivity:模糊⾪属度format longeps=1e-4; %定义迭代终⽌条件的epsalpha=2; %模糊加权指数,[1,+⽆穷)T=100; %最⼤迭代次数fitness=zeros(T,1);[X_num,X_dim]=size(X);count=zeros(X_num,1); %统计distant中每⼀⾏为0的个数%----------------------------------------------------------------------------------------------------%随机初始化K个聚类中⼼rand_array=randperm(X_num); %产⽣1~X_num之间整数的随机排列para_miu=X(rand_array(1:K),:); %随机排列取前K个数,在X矩阵中取这K⾏作为初始聚类中⼼responsivity=zeros(X_num,K);R_up=zeros(X_num,K);% ----------------------------------------------------------------------------------------------------% FCM算法for t=1:T%欧⽒距离,计算(X-para_miu)^2=X^2+para_miu^2-2*para_miu*X',矩阵⼤⼩为X_num*Kdistant=(sum(X.*X,2))*ones(1,K)+ones(X_num,1)*(sum(para_miu.*para_miu,2))'-2*X*para_miu';%更新⾪属度矩阵X_num*Kfor i=1:X_numcount(i)=sum(distant(i,:)==0);if count(i)>0for k=1:Kif distant(i,k)==0responsivity(i,k)=1./count(i);elseresponsivity(i,k)=0;endendelseR_up(i,:)=distant(i,:).^(-1/(alpha-1)); %⾪属度矩阵的分⼦部分responsivity(i,:)= R_up(i,:)./sum( R_up(i,:),2);endend%⽬标函数值fitness(t)=sum(sum(distant.*(responsivity.^(alpha))));%更新聚类中⼼K*X_dimmiu_up=(responsivity'.^(alpha))*X; %µ的分⼦部分para_miu=miu_up./((sum(responsivity.^(alpha)))'*ones(1,X_dim));if t>1if abs(fitness(t)-fitness(t-1))<epsbreak;endendendpara_miu_new=para_miu;iter=t; %实际迭代次数[~,label_1]=max(responsivity,[],2);succeed.mfunction accuracy=succeed(real_label,K,id)%输⼊K:聚的类,id:训练后的聚类结果,N*1的矩阵N=size(id,1); %样本个数p=perms(1:K); %全排列矩阵p_col=size(p,1); %全排列的⾏数new_label=zeros(N,p_col); %聚类结果的所有可能取值,N*p_colnum=zeros(1,p_col); %与真实聚类结果⼀样的个数%将训练结果全排列为N*p_col的矩阵,每⼀列为⼀种可能性for i=1:Nfor j=1:p_colfor k=1:Kif id(i)==knew_label(i,j)=p(j,k); %iris数据库,1 2 3endendendend%与真实结果⽐对,计算精确度for j=1:p_colfor i=1:Nif new_label(i,j)==real_label(i)num(j)=num(j)+1;endendendaccuracy=max(num)/N;2.在UCI数据库的iris上的运⾏结果>> data_load=dlmread('E:\My matlab\database\iris.data');data=data_load(:,1:4);real_label=data_load(:,5); >> [ave_acc_FCM,max_acc_FCM,min_acc_FCM,ave_iter_FCM,ave_run_time]=FCM_main(data,real_label,3)第 1 次,FCM的迭代次数为:33,准确度为:0.89333333第 2 次,FCM的迭代次数为:41,准确度为:0.89333333第 3 次,FCM的迭代次数为:14,准确度为:0.89333333第 4 次,FCM的迭代次数为:13,准确度为:0.89333333第 5 次,FCM的迭代次数为:16,准确度为:0.89333333第 6 次,FCM的迭代次数为:10,准确度为:0.89333333第 7 次,FCM的迭代次数为:21,准确度为:0.89333333第 8 次,FCM的迭代次数为:46,准确度为:0.89333333第 9 次,FCM的迭代次数为:19,准确度为:0.89333333第 10 次,FCM的迭代次数为:18,准确度为:0.89333333第 11 次,FCM的迭代次数为:17,准确度为:0.89333333第 12 次,FCM的迭代次数为:38,准确度为:0.89333333第 13 次,FCM的迭代次数为:37,准确度为:0.89333333第 14 次,FCM的迭代次数为:11,准确度为:0.89333333第 15 次,FCM的迭代次数为:22,准确度为:0.89333333第 16 次,FCM的迭代次数为:17,准确度为:0.89333333第 17 次,FCM的迭代次数为:13,准确度为:0.89333333第 18 次,FCM的迭代次数为: 8,准确度为:0.89333333第 19 次,FCM的迭代次数为:13,准确度为:0.89333333第 20 次,FCM的迭代次数为:20,准确度为:0.89333333ave_acc_FCM =0.893333333333333max_acc_FCM =0.893333333333333min_acc_FCM =0.893333333333333ave_iter_FCM =21.350000000000001ave_run_time =0.0359375000000003. iris.data 5.1,3.5,1.4,0.2,14.9,3.0,1.4,0.2,1 4.7,3.2,1.3,0.2,14.6,3.1,1.5,0.2,15.0,3.6,1.4,0.2,1 5.4,3.9,1.7,0.4,14.6,3.4,1.4,0.3,15.0,3.4,1.5,0.2,1 4.4,2.9,1.4,0.2,14.9,3.1,1.5,0.1,15.4,3.7,1.5,0.2,1 4.8,3.4,1.6,0.2,1 4.8,3.0,1.4,0.1,14.3,3.0,1.1,0.1,15.8,4.0,1.2,0.2,1 5.7,4.4,1.5,0.4,1 5.4,3.9,1.3,0.4,1 5.1,3.5,1.4,0.3,1 5.7,3.8,1.7,0.3,1 5.1,3.8,1.5,0.3,1 5.4,3.4,1.7,0.2,1 5.1,3.7,1.5,0.4,14.6,3.6,1.0,0.2,15.1,3.3,1.7,0.5,14.8,3.4,1.9,0.2,15.0,3.0,1.6,0.2,1 5.0,3.4,1.6,0.4,1 5.2,3.5,1.5,0.2,1 5.2,3.4,1.4,0.2,1 4.7,3.2,1.6,0.2,14.8,3.1,1.6,0.2,15.4,3.4,1.5,0.4,1 5.2,4.1,1.5,0.1,1 5.5,4.2,1.4,0.2,14.9,3.1,1.5,0.1,15.0,3.2,1.2,0.2,1 5.5,3.5,1.3,0.2,1 4.9,3.1,1.5,0.1,14.4,3.0,1.3,0.2,15.1,3.4,1.5,0.2,1 5.0,3.5,1.3,0.3,1 4.5,2.3,1.3,0.3,14.4,3.2,1.3,0.2,15.0,3.5,1.6,0.6,1 5.1,3.8,1.9,0.4,14.8,3.0,1.4,0.3,15.1,3.8,1.6,0.2,14.6,3.2,1.4,0.2,15.3,3.7,1.5,0.2,1 5.0,3.3,1.4,0.2,1 7.0,3.2,4.7,1.4,26.4,3.2,4.5,1.5,2 6.9,3.1,4.9,1.5,25.5,2.3,4.0,1.3,26.5,2.8,4.6,1.5,25.7,2.8,4.5,1.3,26.3,3.3,4.7,1.6,2 4.9,2.4,3.3,1.0,2 6.6,2.9,4.6,1.3,2 5.2,2.7,3.9,1.4,2 5.0,2.0,3.5,1.0,25.9,3.0,4.2,1.5,26.0,2.2,4.0,1.0,2 6.1,2.9,4.7,1.4,25.6,2.9,3.6,1.3,26.7,3.1,4.4,1.4,2 5.6,3.0,4.5,1.5,25.8,2.7,4.1,1.0,26.2,2.2,4.5,1.5,2 5.6,2.5,3.9,1.1,25.9,3.2,4.8,1.8,26.1,2.8,4.0,1.3,2 6.3,2.5,4.9,1.5,2 6.1,2.8,4.7,1.2,2 6.4,2.9,4.3,1.3,2 6.6,3.0,4.4,1.4,2 6.8,2.8,4.8,1.4,2 6.7,3.0,5.0,1.7,2 6.0,2.9,4.5,1.5,2 5.7,2.6,3.5,1.0,2 5.5,2.4,3.8,1.1,25.5,2.4,3.7,1.0,25.8,2.7,3.9,1.2,26.0,2.7,5.1,1.6,25.4,3.0,4.5,1.5,26.0,3.4,4.5,1.6,2 6.7,3.1,4.7,1.5,2 6.3,2.3,4.4,1.3,2 5.6,3.0,4.1,1.3,2 5.5,2.5,4.0,1.3,25.5,2.6,4.4,1.2,26.1,3.0,4.6,1.4,2 5.8,2.6,4.0,1.2,2 5.0,2.3,3.3,1.0,2 5.6,2.7,4.2,1.3,2 5.7,3.0,4.2,1.2,25.7,2.9,4.2,1.3,26.2,2.9,4.3,1.3,2 5.1,2.5,3.0,1.1,25.7,2.8,4.1,1.3,26.3,3.3,6.0,2.5,3 5.8,2.7,5.1,1.9,37.1,3.0,5.9,2.1,3 6.3,2.9,5.6,1.8,36.5,3.0,5.8,2.2,37.6,3.0,6.6,2.1,3 4.9,2.5,4.5,1.7,3 7.3,2.9,6.3,1.8,36.7,2.5,5.8,1.8,37.2,3.6,6.1,2.5,3 6.5,3.2,5.1,2.0,3 6.4,2.7,5.3,1.9,3 6.8,3.0,5.5,2.1,3 5.7,2.5,5.0,2.0,35.8,2.8,5.1,2.4,36.4,3.2,5.3,2.3,36.5,3.0,5.5,1.8,37.7,3.8,6.7,2.2,3 7.7,2.6,6.9,2.3,3 6.0,2.2,5.0,1.5,3 6.9,3.2,5.7,2.3,3 5.6,2.8,4.9,2.0,3 7.7,2.8,6.7,2.0,3 6.3,2.7,4.9,1.8,36.7,3.3,5.7,2.1,37.2,3.2,6.0,1.8,3 6.2,2.8,4.8,1.8,3 6.1,3.0,4.9,1.8,36.4,2.8,5.6,2.1,37.2,3.0,5.8,1.6,3 7.4,2.8,6.1,1.9,3 7.9,3.8,6.4,2.0,3 6.4,2.8,5.6,2.2,3 6.3,2.8,5.1,1.5,36.1,2.6,5.6,1.4,37.7,3.0,6.1,2.3,3 6.3,3.4,5.6,2.4,3 6.4,3.1,5.5,1.8,3 6.0,3.0,4.8,1.8,3 6.9,3.1,5.4,2.1,3 6.7,3.1,5.6,2.4,3 6.9,3.1,5.1,2.3,35.8,2.7,5.1,1.9,36.8,3.2,5.9,2.3,3 6.7,3.3,5.7,2.5,3 6.7,3.0,5.2,2.3,3 6.3,2.5,5.0,1.9,3 6.5,3.0,5.2,2.0,3 6.2,3.4,5.4,2.3,3 5.9,3.0,5.1,1.8,3。
matlab模糊c均值聚类算法matlab模糊c均值聚类算法模糊C均值聚类算法是一种广泛应用于数据挖掘、图像分割等领域的聚类算法。
相比于传统的C均值聚类算法,模糊C均值聚类算法能够更好地处理噪声数据和模糊边界。
模糊C均值聚类算法的基本思想是将样本集合分为K个聚类集合,使得每个样本点属于某个聚类集合的概率最大。
同时,每个聚类集合的中心点被计算为该聚类集合中所有样本的均值。
具体实现中,模糊C均值聚类算法引入了模糊化权重向量来描述每个样本点属于各个聚类集合的程度。
这些权重值在每次迭代中被更新,直至达到预设的收敛精度为止。
模糊C均值聚类算法的目标函数可以表示为:J = ∑i∑j(wij)q||xi-cj||2其中,xi表示样本集合中的第i个样本,cj表示第j个聚类集合的中心点,wij表示第i个样本点属于第j个聚类集合的权重,q是模糊指数,通常取2。
不同于C均值聚类算法,模糊C均值聚类算法对每个样本点都考虑了其属于某个聚类集合的概率,因此能够更好地处理模糊边界和噪声数据。
同时,模糊C均值聚类算法可以自适应地确定聚类的数量,从而避免了事先设定聚类数量所带来的限制。
在MATLAB中,可以使用fcm函数实现模糊C均值聚类算法。
具体来说,fcm函数的使用方法如下:[idx,center] = fcm(data,k,[options]);其中,data表示样本矩阵,k表示聚类数量,options是一个包含算法参数的结构体。
fcm函数的输出包括聚类标签idx和聚类中心center。
MATLAB中的fcm函数还提供了其他参数和选项,例如模糊权重阈值、最大迭代次数和收敛精度等。
可以根据具体应用需求来设置这些参数和选项。
如何在Matlab中进行模糊聚类分析在数据分析领域,模糊聚类分析是一种常用的技术,它可以应用于各种领域的数据处理和模式识别问题。
而Matlab作为一种功能强大的数据分析工具,也提供了丰富的函数和工具箱,以支持模糊聚类分析的实施。
1. 引言模糊聚类分析是一种基于模糊集理论的聚类方法,与传统的硬聚类方法不同,它允许样本属于多个聚类中心。
这种方法的优势在于可以更好地应对数据中的不确定性和复杂性,对于某些模糊或模糊边界问题具有更好的解释能力。
2. 模糊聚类算法概述Matlab提供了多种模糊聚类算法的实现,其中最常用的是基于模糊C均值(Fuzzy C-Means,FCM)算法。
FCM算法的基本思想是通过最小化聚类后的模糊划分矩阵与原始数据之间的距离来确定每个样本所属的聚类中心。
3. 数据预处理与特征提取在进行模糊聚类分析之前,需要对原始数据进行预处理和特征提取。
预处理包括数据清洗、缺失值处理和异常值处理等;特征提取则是从原始数据中抽取出具有代表性和区分性的特征,用于模糊聚类分析。
4. 模糊聚类分析步骤在Matlab中,进行模糊聚类分析通常包括以下步骤:(1) 初始化聚类中心:通过随机选择或基于某种准则的方法初始化聚类中心。
(2) 计算模糊划分矩阵:根据当前的聚类中心,计算每个样本属于各个聚类中心的隶属度。
(3) 更新聚类中心:根据当前的模糊划分矩阵,更新聚类中心的位置。
(4) 判断终止条件:通过设置一定的终止条件,判断是否达到停止迭代的条件。
(5) 输出最终结果:得到最终的聚类结果和每个样本所属的隶属度。
5. 模糊聚类结果评估在进行模糊聚类分析后,需要对聚类结果进行评估以验证其有效性和可解释性。
常用的评估指标包括模糊划分矩阵的聚类有效性指标、外部指标和内部指标等。
通过这些指标的比较和分析,可以选择合适的模糊聚类算法和参数设置。
6. 模糊聚类的应用模糊聚类分析在诸多领域中都有广泛的应用。
例如,在图像处理中,可以利用模糊聚类方法对图像进行分割和识别;在生物信息学中,可以应用于基因表达数据的分类和模式识别等。
利用MATLAB进行模糊聚类分析1. 引言近年来,随着数据科学的飞速发展,模糊聚类分析作为一种有效的数据挖掘技术被广泛应用于各个领域。
模糊聚类分析可以在数据集中找到隐含的模式和结构,帮助人们更好地理解数据和做出预测。
本文将介绍如何利用MATLAB进行模糊聚类分析,并通过实例演示其应用。
2. 模糊聚类分析原理模糊聚类分析是一种非监督学习方法,其目标是将数据集中的样本划分为若干个模糊的聚类。
与传统的硬聚类方法不同,模糊聚类分析允许一个样本属于多个聚类的成员,这样可以更好地反映样本之间的相似性和差异性。
模糊聚类分析的核心是模糊C-均值(FCM)算法,它基于样本与聚类中心之间的模糊隶属度进行迭代优化,直到达到停止条件为止。
3. MATLAB中的模糊聚类分析工具MATLAB提供了丰富的工具箱和函数,方便进行模糊聚类分析。
其中,Fuzzy Logic Toolbox是一个强大的工具箱,提供了各种用于模糊逻辑和模糊推理的函数。
可以利用该工具箱中的函数,如genfis1和genfis2,生成模糊推理系统的模糊近似模型。
此外,MATLAB还提供了fcm函数,用于执行模糊C-均值算法进行聚类分析。
4. 实例演示假设我们有一个数据集包含N个样本和M个属性,我们希望将这些样本进行聚类分析。
首先,我们需要准备数据集,并进行预处理,如缺失值处理、标准化等。
然后,我们利用genfis1函数生成一个模糊推理系统的模糊近似模型,设置聚类数目和输入输出变量。
接下来,我们使用fcm函数执行模糊C-均值算法进行聚类分析,得到样本的隶属度矩阵和聚类中心。
5. 结果分析通过模糊聚类分析,我们可以得到每个样本对于每个聚类的隶属度,根据隶属度大小,我们可以确定每个样本的主要归属聚类。
此外,聚类中心可以用于描述聚类的特征,可以通过可视化的方式展示。
通过对结果的分析,我们可以发现潜在的模式和结构,并可以进一步进行数据挖掘和预测。
6. 总结本文介绍了利用MATLAB进行模糊聚类分析的原理和步骤,并通过实例演示了该方法的应用。
[转载]MATLAB⾃带的FCM算法整合整理+代码注释详解整理+KFCM与FCM的原⽂地址:MATLAB⾃带的FCM算法整合整理+代码注释详解整理+KFCM与FCM的测试⽐较(转)作者:jiandanjinxin⾸先,我们看以下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 ---- ⽬标函数值【函数实例】接着,我们来详细研究⼀下fcm的实现代码=============该词条在函数啦的位置fcm/index.php?doc-view-919.html==外⼀篇KFCM与FCM的测试⽐较==从⽐较中可以看出KFCM的迭代步骤更少⽽且可以得出同样模式的聚类,能更有效的进⾏聚类,即将核函数的思想引⼊FCM可以提⾼聚类效率(也可以提⾼聚类的效果尤其是对噪声的抵御能⼒,但这个在下⾯的仿真测试中还没有体现)测试1:测试2:测试3:测试4:测试5:测试6:。
实验二 模糊C 均值聚类实验目的:学会使用MATLAB 软件进行模糊C 均值聚类,学会如何进行迭代并观察迭代过程。
实验学时:4学时实验内容:1、认真阅读guide.doc 文件 ,通过给出的英文的例子学习进行C 均值聚类的具体步骤。
2、在学习完所给的例子后进行实际操作。
根据表格提供的固定资本和人力资本等进行聚类分布。
进一步熟悉和掌握熟悉FUZZY CLUSTERING.实验日期:2013年4月24日实验过程:1、查看所给数据表格(如下),由经济学理论知,GDP 的产出状况是由固定资本的投入和人力资源的投入决定的。
因此,实际上我们只需要选取固定资本和人力资源这两组数据进行处理就行了。
地区(District )GDP 固定资本(Fixed Capital)人力资本(manpower Capital)地区(District )GDP 固定资本(Fixed Capital)人力资本(manpower Capital)北京 2.0576 5.9489 1.3600湖北0.7803 1.3820 1.0000天津 1.8328 4.0308 1.3990湖南0.60390.91710.6660河北0.8236 1.62230.8690广东 1.3681 2.7298 1.0260山西0.5440 1.03370.7960广西0.46600.83420.5460内蒙古0.6503 1.10990.9310海南0.68590.81270.6200辽宁 1.2001 2.03140.3850重庆0.56500.81270.6200吉林0.75530.3114 1.0220四川0.5118 1.04100.5630黑龙江0.9344 1.4208 1.2810贵州0.28560.57560.2990上海 3.06748.0396 1.7480云南0.4840 1.01660.4660江苏1.29332.2450 1.0880西藏0.5275 1.35880.5240浙江1.4629 3.10380.8940陕西0.5040 1.03070.5740安徽0.51990.81120.6140甘肃0.41650.85440.4590福建1.23652.0523 1.1550青海0.5754 1.5080.5500江西0.51980.74940.7850宁夏0.5300 1.50360.5180山东1.0439 1.65340.9470新疆0.79812.02260.9110河南0.5903 1.92100.6530平均0.8914 1.89360.85732、通过学习guide 中的范例,将所给的defcm.m 程序进行重新编辑。
matlab模糊c均值聚类算法Matlab是广泛应用的数学计算软件,其中模糊c均值聚类算法是一种常用的无监督聚类算法。
本文将围绕此算法,介绍其原理、实现步骤以及应用场景。
1.算法原理模糊c均值聚类算法是继普通k均值聚类算法之后的一种改进算法。
通常情况下,k均值聚类算法的核心是将数据集分成k个不同的类簇,使得每个数据点与其所属的类簇中心点距离最小。
而对于模糊c均值聚类算法,每个数据点并不是强制归属于某一个特定的类簇,而是存在一个隶属度矩阵,代表该数据点属于各个类簇的概率。
同时,每个类簇中心也不是单一的一个坐标点,而是一个多维向量。
算法的基本步骤为:先随机初始化隶属度矩阵和各个类簇中心,然后按照一定的迭代公式不断更新隶属度矩阵和类簇中心,直到达到一定的收敛准则(如最大迭代次数、误差值小于某一阈值等)。
2.算法实现在Matlab中实现模糊c均值聚类算法,需要先安装fuzzy工具包。
以下是实现的三个主要步骤:①初始化隶属度矩阵和类簇中心。
可以使用rand()函数生成一定范围内均匀分布的随机数,将其归一化为各维总和为1的隶属度矩阵。
类簇中心可以在数据集范围内随机选择。
②迭代更新隶属度矩阵和类簇中心。
根据迭代公式,先计算各数据点与各类簇中心的距离(可以使用欧几里得距离),得到距离矩阵。
然后根据距离矩阵和一个模糊参数,更新隶属度矩阵。
根据隶属度矩阵和原始数据,权重加权计算每个类簇的中心坐标,得到新的类簇中心。
③判断是否达到收敛准则,如果满足收敛准则则停止迭代,否则回到第②步。
常见的收敛准则包括最大迭代次数、前后两次迭代误差小于某一阈值等。
3.应用场景模糊c均值聚类算法可以用于统计学、图像处理、生物信息学等领域中的无监督聚类问题。
例如,在图像处理中,可以将像素点看作数据点,使用模糊c均值聚类算法对图像进行分割处理,将像素点划分为不同的颜色区域。
模糊c均值聚类算法还可以用于人工智能领域的模糊推理问题,在模糊控制领域有广泛的应用。
基于MATLAB的FCM聚类算法研究作者:俞群爱王艳清来源:《科学与财富》2010年第04期[摘要] 本文介绍了FCM聚类算法是一种柔性的模糊划分,通过对比常用的其他模糊聚类算法,对FCM聚类算法进行了改进,并基于MATLAB对实验数据库进行了详细分析。
结果显示,如要提高聚类的准确率,需先完成初始中心确定的两阶段FCM聚类算法,避免初值的主观随意性,从而可以提高模糊聚类的效率和准确性。
[关键词] MATLAB FCM聚类算法模糊集合1 引言FCM算法是一种基于划分的聚类算法,它的思想就是使得被划分到同一簇的对象之间相似度最大,而不同簇之间的相似度最小。
模糊C均值算法是普通C均值算法的改进,普通C均值算法对于数据的划分是硬性的,而FCM则是一种柔性的模糊划分。
FCM算法需要两个参数一个是聚类数目C,另一个是参数m。
一般来讲C要远远小于聚类样本的总个数,同时要保证C>1。
对于m,它是一个控制算法的柔性的参数,如果m过大,则聚类效果会很次,而如果m过小则算法会接近HCM聚类算法。
算法的输出是C个聚类中心点向量和C*N的一个模糊划分矩阵,这个矩阵表示的是每个样本点属于每个类的隶属度。
根据这个划分矩阵按照模糊集合中的最大隶属原则就能够确定每个样本点归为哪个类。
聚类中心表示的是每个类的平均特征,可以认为是这个类的代表点,FCM算法对于满足正态分布的数据聚类效果会很好。
2 常用的其他模糊聚类算法目前比较常用的模糊聚类算法有:基于模糊等价关系的传递闭包方法;基于模糊图论的最大树方法。
设聚类样本空间为X=(x1,x2,…,xn),对应的模糊相似矩阵为R=(rij)。
其中,rij∈[0,1],rij 表示对象xi和xj的相似度,相似度的计算可采用相似系数法、距离法以及主观评分法等,本文中选择欧氏距离法。
2.1 传递闭包法根据模糊数学理论,模糊等价矩阵能进行等价的分类,而模糊相似矩阵仅仅满足自反性和对称性,并不满足传递性,因此采用求R的传递闭包t(R)形成模糊等价矩阵是最自然的想法。
模糊C均值聚类算法及应用作者:张洪艳来源:《科技资讯》2014年第05期摘要:在对模糊C均值聚类算法原理进行简要分析的基础上,进行了实验仿真。
首先利用聚类树形图估计分类数,再利用模糊C均值聚类算法进行分类,结果表明算法具有较好的分类效果。
关键词:FCM 聚类树形图隶属度中图分类号:TP391.41 文献标识码:A 文章编号:1672-3791(2014)2(b)-0000-001 引言聚类分析是一种多元统计分析方法,属于无监督模式识别方法,被广泛应用于模式识别、图像处理、数据分析等领域[1-3]。
模糊聚类分析建立了样本对类别的不确定描述,更能客观地反应样本的实际情况,从而成为聚类分析的主要方法 [4-5]。
在模糊聚类算法中,模糊C均值聚类算法(Fuzzy C-means,简称FCM)应用最为广泛。
FCM是基于目标函数的模糊聚类算法中理论最完善、应用最广泛的一种算法。
为了借助目标函数法求解聚类问题,类内平方误差和WGSS(Within-Groups Sum of Squared Error)成为聚类目标函数的普遍形式。
随着模糊划分概念的提出,Dunn[6]首先将其推广到加权WGSS函数,后来由Bezdek[7]扩展到加权WGSS的无限族,形成了FCM聚类算法的通用聚类准则。
2 模糊C均值聚类算法原理模糊C均值聚类算法原理[8]描述如下:设样本空间为:,数据矩阵为:。
FCM思想即将n个样本划分为c类(),记为c个类的聚类中心,其中。
令为隶属度矩阵,表示第k个样本属于第i类的隶属度(),。
定义目标函数:,。
FCM的聚类准则即确定U、V,使最小。
FCM一般步骤如下:Step1:初始化,确定c、m、初始隶属度矩阵及隶属度终止容限和最大迭代次数;Step2:利用下式计算第步的聚类中心:;Step3:修正隶属度矩阵,计算目标函数:其中:;Step4:判断是否满足终止条件,满足则退出程序;否则,,转Step2。
function [center, U, obj_fcn] = FCMClust(data, cluster_n, options)% FCMClust.m 采用模糊C均值对数据集data聚为cluster_n类% 用法:% 1. [center,U,obj_fcn] = FCMClust(Data,N_cluster,options);% 2. [center,U,obj_fcn] = FCMClust(Data,N_cluster);% 输入:% data ---- nxm矩阵,表示n个样本,每个样本具有m的维特征值% N_cluster ---- 标量,表示聚合中心数目,即类别数% options ---- 4x1矩阵,其中% options(1): 隶属度矩阵U的指数,>1 (缺省值: 2.0)% options(2): 最大迭代次数(缺省值: 100)% options(3): 隶属度最小变化量,迭代终止条件(缺省值: 1e-5)% options(4): 每次迭代是否输出信息标志(缺省值: 1)% 输出:% center ---- 聚类中心% U ---- 隶属度矩阵% obj_fcn ---- 目标函数值% Example:% data = rand(100,2);% [center,U,obj_fcn] = FCMClust(data,2);% plot(data(:,1), data(:,2),'o');% 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; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%if nargin ~= 2 & nargin ~= 3, %判断输入参数个数只能是2个或3个error('Too many or too few input arguments!');enddata_n = size(data, 1); % 求出data的第一维(rows)数,即样本个数in_n = size(data, 2); % 求出data的第二维(columns)数,即特征值长度% 默认操作参数default_options = [2; % 隶属度矩阵U的指数100; % 最大迭代次数1e-5; % 隶属度最小变化量,迭代终止条件1]; % 每次迭代是否输出信息标志if nargin == 2,options = default_options;else %分析有options做参数时候的情况% 如果输入参数个数是二那么就调用默认的option;if length(options) < 4, %如果用户给的opition数少于4个那么其他用默认值;tmp = default_options;tmp(1:length(options)) = options;options = tmp;end% 返回options中是数的值为0(如NaN),不是数时为1nan_index = find(isnan(options)==1);%将denfault_options中对应位置的参数赋值给options中不是数的位置.options(nan_index) = default_options(nan_index);if options(1) <= 1, %如果模糊矩阵的指数小于等于1error('The exponent should be greater than 1!');endend%将options 中的分量分别赋值给四个变量;expo = options(1); % 隶属度矩阵U的指数max_iter = options(2); % 最大迭代次数min_impro = options(3); % 隶属度最小变化量,迭代终止条件display = options(4); % 每次迭代是否输出信息标志obj_fcn = zeros(max_iter, 1); % 初始化输出参数obj_fcnU = 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,if abs(obj_fcn(i) - obj_fcn(i-1)) < min_impro,break;end,endenditer_n = i; %实际迭代次数obj_fcn(iter_n+1:max_iter) = [];%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%% 子函数1function 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), :); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%% 子函数2function [U_new, center, obj_fcn] = stepfcm(data, U, cluster_n, expo)% 模糊C均值聚类时迭代的一步% 输入:% data ---- nxm矩阵,表示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'))'); % 新聚类中心(5.4)式dist = distfcm(center, data); % 计算距离矩阵obj_fcn = sum(sum((dist.^2).*mf)); % 计算目标函数值(5.1)式tmp = dist.^(-2/(expo-1));U_new = tmp./(ones(cluster_n, 1)*sum(tmp)); % 计算新的隶属度矩阵(5.3)式%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%% 子函数3function 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。