赞
踩
FuzzyC-Means
模糊c-均值聚类算法 fuzzy c-means algorithm(FCMA)或(FCM)。模糊c均值聚类算法,是当前模糊系统里表现比较好的算法之一 其特征与k-means相似,也是基于距离来判断分类。模糊c均值需要用户提供除数据之外至少一个参数,而这个参数与k-means中的k类似。
模糊c-均值聚类算法意在求解一个最小化问题即:
其中,uij为样本xj属于第i类的隶属度,故u是一个c×n的矩阵,xj就是第j个样本数据,ci为第i个聚类中心一共有c个,m则是一个大于1的加权常数一般取2,可由用户定义。 在这里每个样本对于不同类的隶属度之和被限制为1,但一般情况下模糊集合的隶属度通常加起来不为1。接下来我们需要把这个条件极值问题转化为无条件的极值问题, 这里用到的方法就是拉格朗日乘子法:
然后需要对各个变量求导,以求得使得原式最小的变量值。对聚类的中心C求导:
其中,
故:
然后,
最后,
至此聚类中心C的迭代公式已确认,接下来就是模糊矩阵u的迭代推导。
第一部分,先对条件式的前半部分对u进行求导。
然后再求后半部分。
将两部分叠加。
最后u的迭代公式:
(以上参考至:https://www.cnblogs.com/wxl845235800/p/11053261.html)
接下来我们就可以根据两个迭代公式将算法轻松地编程。初始模糊矩阵取随机数,采用的分类数据为鸢尾花数据集,m设置为2,截至条件为u的二范数变化小于1e-4.
function [V,F]=FSC(X,C,m) [n,D]=size(X); if D>n X=X'; [n,D]=size(X); end if nargin==2 m=2; end old=0; A=rand(C,n); A=oneness(A,n); new=norm(A); while abs(new-old)>1e-4 old=new; V=updataV(A); A=updataA(X,V); new=norm(A); [~,index]=max(A); end F=zeros(C,n); for f=1:n F(index(f),f)=1; end if D>2 X=zscore(X); %数据标准化 [~,~,latent]=pca(X); %PCA降维 [~,b]=sort(latent,'descend'); X=X(:,b(1:2)); %取前两维绘图 PlotClusterinResult(X,index); end if D==2 PlotClusterinResult(X,index); end function A=oneness(A,n) for i=1:n %模糊矩阵概率归一 A(:,i)=A(:,i)/sum(A(:,i)); end end function V=updataV(A) V=zeros(D,C); for i=1:C V(:,i)=(A(i,:).^m*X)'/sum(A(i,:).^m); end end function A=updataA(X,V) A=zeros(C,n); for i=1:C for j=1:n A(i,j)=1/sum((norm(X(j,:)'-V(:,i))./norm(X(j,:)'-V)).^(1/(m-1))); end end A=oneness(A,n); end end function PlotClusterinResult(X, IDX) k=max(IDX); Colors=hsv(k); Legends = {}; for i=0:k Xi=X(IDX==i,:); if i~=0 Style = 'x'; MarkerSize = 8; Color = Colors(i,:); Legends{end+1} = ['Cluster #' num2str(i)]; else Style = 'o'; MarkerSize = 6; Color = [0 0 0]; if ~isempty(Xi) Legends{end+1} = 'Noise'; end end if ~isempty(Xi) plot(Xi(:,1),Xi(:,2),Style,'MarkerSize',MarkerSize,'Color',Color); end hold on; end hold off; axis equal; grid on; legend(Legends); legend('Location', 'NorthEastOutside'); end
测试Matlab自带fisheriris数据集。
FSC(meas,3)
结果如下图:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。