1. 程式人生 > >FCM算法的matlab程序2

FCM算法的matlab程序2

1.7 訓練 sum 避免 分情況討論 mat 實現 form 3.6

FCM算法的matlab程序2

在“FCM算法的matlab程序”這篇文章中已經用matlab程序對iris數據庫進行實現,並求解準確度。下面的程序是另一種方法,是最常用的方法:先初始化聚類中心,在進行叠代(此方法由於循環較多,時間復雜度相對較高,但更嚴謹。就時間性而言,推薦使用“FCM算法的matlab程序”這個程序)。

作者:凱魯嘎吉 - 博客園 http://www.cnblogs.com/kailugaji/

1.采用iris數據庫

iris_data.txt

5.1	3.5	1.4	0.2
4.9	3	1.4	0.2
4.7	3.2	1.3	0.2
4.6	3.1	1.5	0.2
5	3.6	1.4	0.2
5.4	3.9	1.7	0.4
4.6	3.4	1.4	0.3
5	3.4	1.5	0.2
4.4	2.9	1.4	0.2
4.9	3.1	1.5	0.1
5.4	3.7	1.5	0.2
4.8	3.4	1.6	0.2
4.8	3	1.4	0.1
4.3	3	1.1	0.1
5.8	4	1.2	0.2
5.7	4.4	1.5	0.4
5.4	3.9	1.3	0.4
5.1	3.5	1.4	0.3
5.7	3.8	1.7	0.3
5.1	3.8	1.5	0.3
5.4	3.4	1.7	0.2
5.1	3.7	1.5	0.4
4.6	3.6	1	0.2
5.1	3.3	1.7	0.5
4.8	3.4	1.9	0.2
5	3	1.6	0.2
5	3.4	1.6	0.4
5.2	3.5	1.5	0.2
5.2	3.4	1.4	0.2
4.7	3.2	1.6	0.2
4.8	3.1	1.6	0.2
5.4	3.4	1.5	0.4
5.2	4.1	1.5	0.1
5.5	4.2	1.4	0.2
4.9	3.1	1.5	0.2
5	3.2	1.2	0.2
5.5	3.5	1.3	0.2
4.9	3.6	1.4	0.1
4.4	3	1.3	0.2
5.1	3.4	1.5	0.2
5	3.5	1.3	0.3
4.5	2.3	1.3	0.3
4.4	3.2	1.3	0.2
5	3.5	1.6	0.6
5.1	3.8	1.9	0.4
4.8	3	1.4	0.3
5.1	3.8	1.6	0.2
4.6	3.2	1.4	0.2
5.3	3.7	1.5	0.2
5	3.3	1.4	0.2
7	3.2	4.7	1.4
6.4	3.2	4.5	1.5
6.9	3.1	4.9	1.5
5.5	2.3	4	1.3
6.5	2.8	4.6	1.5
5.7	2.8	4.5	1.3
6.3	3.3	4.7	1.6
4.9	2.4	3.3	1
6.6	2.9	4.6	1.3
5.2	2.7	3.9	1.4
5	2	3.5	1
5.9	3	4.2	1.5
6	2.2	4	1
6.1	2.9	4.7	1.4
5.6	2.9	3.6	1.3
6.7	3.1	4.4	1.4
5.6	3	4.5	1.5
5.8	2.7	4.1	1
6.2	2.2	4.5	1.5
5.6	2.5	3.9	1.1
5.9	3.2	4.8	1.8
6.1	2.8	4	1.3
6.3	2.5	4.9	1.5
6.1	2.8	4.7	1.2
6.4	2.9	4.3	1.3
6.6	3	4.4	1.4
6.8	2.8	4.8	1.4
6.7	3	5	1.7
6	2.9	4.5	1.5
5.7	2.6	3.5	1
5.5	2.4	3.8	1.1
5.5	2.4	3.7	1
5.8	2.7	3.9	1.2
6	2.7	5.1	1.6
5.4	3	4.5	1.5
6	3.4	4.5	1.6
6.7	3.1	4.7	1.5
6.3	2.3	4.4	1.3
5.6	3	4.1	1.3
5.5	2.5	4	1.3
5.5	2.6	4.4	1.2
6.1	3	4.6	1.4
5.8	2.6	4	1.2
5	2.3	3.3	1
5.6	2.7	4.2	1.3
5.7	3	4.2	1.2
5.7	2.9	4.2	1.3
6.2	2.9	4.3	1.3
5.1	2.5	3	1.1
5.7	2.8	4.1	1.3
6.3	3.3	6	2.5
5.8	2.7	5.1	1.9
7.1	3	5.9	2.1
6.3	2.9	5.6	1.8
6.5	3	5.8	2.2
7.6	3	6.6	2.1
4.9	2.5	4.5	1.7
7.3	2.9	6.3	1.8
6.7	2.5	5.8	1.8
7.2	3.6	6.1	2.5
6.5	3.2	5.1	2
6.4	2.7	5.3	1.9
6.8	3	5.5	2.1
5.7	2.5	5	2
5.8	2.8	5.1	2.4
6.4	3.2	5.3	2.3
6.5	3	5.5	1.8
7.7	3.8	6.7	2.2
7.7	2.6	6.9	2.3
6	2.2	5	1.5
6.9	3.2	5.7	2.3
5.6	2.8	4.9	2
7.7	2.8	6.7	2
6.3	2.7	4.9	1.8
6.7	3.3	5.7	2.1
7.2	3.2	6	1.8
6.2	2.8	4.8	1.8
6.1	3	4.9	1.8
6.4	2.8	5.6	2.1
7.2	3	5.8	1.6
7.4	2.8	6.1	1.9
7.9	3.8	6.4	2
6.4	2.8	5.6	2.2
6.3	2.8	5.1	1.5
6.1	2.6	5.6	1.4
7.7	3	6.1	2.3
6.3	3.4	5.6	2.4
6.4	3.1	5.5	1.8
6	3	4.8	1.8
6.9	3.1	5.4	2.1
6.7	3.1	5.6	2.4
6.9	3.1	5.1	2.3
5.8	2.7	5.1	1.9
6.8	3.2	5.9	2.3
6.7	3.3	5.7	2.5
6.7	3	5.2	2.3
6.3	2.5	5	1.9
6.5	3	5.2	2
6.2	3.4	5.4	2.3
5.9	3	5.1	1.8

iris_id.txt

0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2

2.matlab程序

My_FCM2.m

function label_1=My_FCM2(K)
%輸入K:聚類數
%輸出:label_1:聚的類, para_miu_new:模糊聚類中心μ,responsivity:模糊隸屬度
format long
eps=1e-5;  %定義叠代終止條件的eps
alpha=2;  %模糊加權指數,[1,+無窮)
max_iter=100;  %最大叠代次數
fitness=zeros(max_iter,1);
data=dlmread(‘E:\www.cnblogs.comkailugaji\data\iris\iris_data.txt‘);
%----------------------------------------------------------------------------------------------------
%對data做最大-最小歸一化處理
[data_num,~]=size(data);
X=(data-ones(data_num,1)*min(data))./(ones(data_num,1)*(max(data)-min(data)));
[X_num,X_dim]=size(X);
%----------------------------------------------------------------------------------------------------
%隨機初始化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:max_iter
    %歐氏距離,計算(X-para_miu)^2=X^2+para_miu^2-2*para_miu*X‘,矩陣大小為X_num*K
    distant=(sum(X.*X,2))*ones(1,K)+ones(X_num,1)*(sum(para_miu.*para_miu,2))‘-2*X*para_miu‘;
    %更新隸屬度矩陣X_num*K
    for i=1:X_num
        for j=1:K
            if distant(i,j)==1
                responsivity(i,j)=0;
            elseif distant(i,j)==0
                responsivity(i,j)=1./sum(responsivity(i,:)==0);
            else
                R_up(i,j)=distant(i,j).^(-1/(alpha-1));  %隸屬度矩陣的分子部分
                responsivity(i,j)= R_up(i,j)./sum( R_up(i,:),2);
            end
        end
    end
    %目標函數值
    fitness(t)=sum(sum(distant.*(responsivity.^(alpha))));
     %更新聚類中心K*X_dim
    miu_up=(responsivity‘.^(alpha))*X;  %μ的分子部分
    para_miu=miu_up./((sum(responsivity.^(alpha)))‘*ones(1,X_dim));
    if t>1  %改成while不行
        if abs(fitness(t)-fitness(t-1))<eps
            break;
        end
    end
end
%iter=t;  %實際叠代次數
[~,label_1]=max(responsivity,[],2);

succeed.m

function accuracy=succeed(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_col
num=zeros(1,p_col);  %與真實聚類結果一樣的個數
real_label=dlmread(‘E:\www.cnblogs.comkailugaji\data\iris\iris_id.txt‘);
%將訓練結果全排列為N*p_col的矩陣,每一列為一種可能性
for i=1:N
    for j=1:p_col
        for k=1:K
            if id(i)==k
                new_label(i,j)=p(j,k)-1;  %加一減一看情況
            end
        end
    end
end
%與真實結果比對,計算精確度
for j=1:p_col
    for i=1:N
        if new_label(i,j)==real_label(i)
                num(j)=num(j)+1;
        end
    end
end
accuracy=max(num)/N;

Eg_FCM.m

function ave_acc_FCM=Eg_FCM(K,max_iter)
%輸入K:聚的類,max_iter是最大叠代次數
%輸出ave_acc_FCM:叠代max_iter次之後的平均準確度
s=0;
for i=1:max_iter
    label_1=My_FCM2(K);
    accuracy=succeed(K,label_1);
    s=s+accuracy;
end
ave_acc_FCM=s/max_iter;

3.結果

>> ave_acc_FCM=Eg_FCM(3,50)

ave_acc_FCM =

   0.893333333333333

4.註意

此算法是一個大眾化的算法,先初始化聚類中心,再進行叠代,對隸屬函數進行分情況討論,將距離為0的情況考慮進去,但是計算速度慢。而在“FCM算法的matlab程序”是先初始化模糊隸屬函數,再進行叠代,這樣就避免分母為零的情況,而且計算速度快。對於嚴謹性大眾性,可以采用本文的算法,對於時間性,可以采用“FCM算法的matlab程序”算法。

FCM算法的matlab程序2