FCMClust(模糊c均值聚类算法MATLAB实现)

合集下载

MATLAB模糊c均值算法FCM分类全解复习课程

MATLAB模糊c均值算法FCM分类全解复习课程

title('原图');
c=3;
%分类数
m=2;
%模糊度
e=0.0001; %阈值
A=double(img(:,:,1));
[n1,n2]=size(A);
A=reshape(A,n1*n2,1);
N=n1*n2;
%样本数
U0=rand(N,c);
U1=sum(U0,2 ); %求出每一行的元素总数
MATLAB模糊c均值算法FCM分 类全解
程序: %functio n [U,z,U1]=SARFCM %读入并显示图像 clear,clc
IMGN=input('Input Original Image Name: ','s');
img=imread(IMGN);
figure
imshow(img)
U2=repmat(U1,1,c);%将每一行总数复制成n*c矩阵
U=U0./U2;
clear U0 U1 U
while a
for j=1:c
V(j)=sum(U(:,j).^m.*A)/sum(U(:,j).^m); %求聚类中心
W(:,j)=abs(repmat(V(j),N,1)-A); %距离
a=0;
end
Z=Z+1
if Z>100
break
end
end
%输出图像
t=max(U,[],2); t=repmat(t,1,c); %最大值排成1*c U=double(t==U); for i=1:N
F(i)= find(U(i,:)==1); end F=reshape(F,n1,n2); map=[1,1,1;0,0,0;1,0,0;0,1,0;0,0,1] figure,imshow(uint8(F),map)

遗传算法改进的模糊C-均值聚类MATLAB源码

遗传算法改进的模糊C-均值聚类MATLAB源码
AA=farm(:,i);
BB=GaussMutation(AA,LB,UB);
farm(:,i)=BB;
end
end
disp(k);
k=k+1;
end
%% 绘图
BESTY2=BESTY;
BESTX2=BESTX;
for k=1:K
TempY=BESTY(1:k);
minTempY=min(TempY);
% UB 决策变量的上界,M×1的向量
% D 原始样本数据,n×p的矩阵
% c 分类个数
% m 模糊C均值聚类数学模型中的指数
%% 输出参数列表
% BESTX K×1细胞结构,每一个元素是M×1向量,记录每一代的最优个体
% BESTY K×1矩阵,记录每一代的最优个体的评价函数值
% ALLX K×1细胞结构,每一个元素是M×N矩阵,记录全部个体
k=1;%迭代计数器初始化
%% 第二步:迭代过程
while k<=K
%% 以下是交叉过程
newfarm=zeros(M,2*N);
Ser=randperm(N);%两两随机配对的配对表
A=farm(:,Ser(1));
B=farm(:,Ser(2));
P0=unidrnd(M-1);
f2=FITNESS(SER(3*i-1));
f3=FITNESS(SER(3*i));
if f1<=f2&&f1<=f3
farm(:,i)=FARM(:,SER(3*i-2));
fitness(:,i)=FITNESS(:,SER(3*i-2));

fcm matlab

fcm  matlab

模糊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均值聚类进行图像分析的技巧

在Matlab中使用模糊C均值聚类进行图像分析的技巧

在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算法的MATLAB代码

模糊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

c均值聚类matlab

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进行模糊聚类分析,以及该方法的一些应用和局限性。

引言聚类分析是一种数据挖掘技术,其目的是将数据集中相似的数据点划分为不同的群组或簇。

而模糊聚类则是一种非常强大的聚类方法,它允许数据点属于不同的群组,以及具有不同的隶属度。

因此,模糊聚类可以更好地处理一些模糊性或不确定性的情况。

Matlab中的模糊聚类分析工具Matlab是一种功能强大的数值计算和数据分析软件,它提供了一些内置的模糊聚类分析工具,可以帮助我们进行模糊聚类分析。

其中最常用的是fcm函数(fuzzy c-means clustering)。

fcm函数是基于fuzzy c-means算法的,它使用隶属度矩阵来度量数据点与不同类之间的相似性。

该函数需要指定聚类的数量和迭代次数,然后根据数据点与聚类中心之间的距离来计算隶属度矩阵,并不断迭代更新聚类中心和隶属度矩阵,直到收敛为止。

例如,假设我们有一个包含N个数据点的数据集X,每个数据点包含M个特征。

我们可以使用fcm函数对该数据集进行模糊聚类分析,首先将数据集归一化,并指定聚类的数量(如3个聚类),迭代次数(如100次),并设置模糊指数(如2)。

然后,我们可以使用聚类中心来获得每个数据点的隶属度,并根据隶属度矩阵来进行进一步的数据分析或可视化。

应用实例模糊聚类分析在实际中有很多应用,下面我们将介绍其中两个常见的应用实例。

1. 图像分割图像分割是一种将图像的像素点划分为不同区域或对象的过程。

模糊聚类分析可以在图像分割中发挥重要作用,因为它可以通过考虑像素点与不同区域之间的隶属度来更好地处理图像的模糊性和纹理。

通过使用Matlab中的模糊聚类分析工具,我们可以将一张图像分割为不同的区域,并进一步进行对象识别或图像处理。

2. 数据分类在数据挖掘和机器学习中,数据分类是一个非常重要的任务,其目的是将数据点划分到不同的类别中。

MATLAB实现FCM聚类算法

MATLAB实现FCM聚类算法

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聚类算法的通⽤聚类准则。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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。

相关文档
最新文档