当前位置:   article > 正文

FuzzyCMeans算法_fuzzy c-means

fuzzy c-means

FuzzyC-Means

模糊c-均值聚类算法 fuzzy c-means algorithm(FCMA)或(FCM)。模糊c均值聚类算法,是当前模糊系统里表现比较好的算法之一 其特征与k-means相似,也是基于距离来判断分类。模糊c均值需要用户提供除数据之外至少一个参数,而这个参数与k-means中的k类似。

模糊c-均值聚类算法意在求解一个最小化问题即:

1.png

其中,uij为样本xj属于第i类的隶属度,故u是一个c×n的矩阵,xj就是第j个样本数据,ci为第i个聚类中心一共有c个,m则是一个大于1的加权常数一般取2,可由用户定义。 在这里每个样本对于不同类的隶属度之和被限制为1,但一般情况下模糊集合的隶属度通常加起来不为1。接下来我们需要把这个条件极值问题转化为无条件的极值问题, 这里用到的方法就是拉格朗日乘子法:

2.png

然后需要对各个变量求导,以求得使得原式最小的变量值。对聚类的中心C求导:

3.png

其中,

4.png

故:
5.png
然后,
6.png
最后,
7.png

至此聚类中心C的迭代公式已确认,接下来就是模糊矩阵u的迭代推导。

第一部分,先对条件式的前半部分对u进行求导。

1.png

然后再求后半部分。

2.png

将两部分叠加。

3.png

4.png

5.png

最后u的迭代公式:

6.png

(以上参考至: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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87

测试Matlab自带fisheriris数据集。

FSC(meas,3)
  • 1

结果如下图:

0.jpg

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/588394
推荐阅读
相关标签
  

闽ICP备14008679号