?? 遺傳算法改進的模糊c-均值聚類matlab源碼.txt
字號:
【原創】遺傳算法改進的模糊C-均值聚類MATLAB源碼
模糊C-均值算法容易收斂于局部極小點,為了克服該缺點,將遺傳算法應用于模糊C-均值算法(FCM)的優化計算中,由遺傳算法得到初始聚類中心,再使用標準的模糊C-均值聚類算法得到最優分類結果。本源碼由GreenSim團隊原創,轉載請注明,有意購買源碼或代寫相關程序,請與GreenSim團隊聯系。
function [BESTX,BESTY,ALLX,ALLY]=GAFCM(K,N,Pm,LB,UB,D,c,m)
%% 此函數實現遺傳算法,用于模糊C-均值聚類
% GreenSim團隊原創作品,轉載請注明
% Email:greensim@163.com
% GreenSim團隊主頁:[url=http://blog.sina.com.cn/greensim]http://blog.sina.com.cn/greensim[/url]
%% 輸入參數列表
% K 迭代次數
% N 種群規模,要求是偶數
% Pm 變異概率
% LB 決策變量的下界,M×1的向量
% UB 決策變量的上界,M×1的向量
% D 原始樣本數據,n×p的矩陣
% c 分類個數
% m 模糊C均值聚類數學模型中的指數
%% 輸出參數列表
% BESTX K×1細胞結構,每一個元素是M×1向量,記錄每一代的最優個體
% BESTY K×1矩陣,記錄每一代的最優個體的評價函數值
% ALLX K×1細胞結構,每一個元素是M×N矩陣,記錄全部個體
% ALLY K×N矩陣,記錄全部個體的評價函數值
%% 第一步:
M=length(LB);%決策變量的個數
%種群初始化,每一列是一個樣本
farm=zeros(M,N);
for i=1:M
x=unifrnd(LB(i),UB(i),1,N);
farm(i,:)=x;
end
%輸出變量初始化
ALLX=cell(K,1);%細胞結構,每一個元素是M×N矩陣,記錄每一代的個體
ALLY=zeros(K,N);%K×N矩陣,記錄每一代評價函數值
BESTX=cell(K,1);%細胞結構,每一個元素是M×1向量,記錄每一代的最優個體
BESTY=zeros(K,1);%K×1矩陣,記錄每一代的最優個體的評價函數值
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);
a=[A(1:P0,:);B((P0+1):end,:)];%產生子代a
b=[B(1:P0,:);A((P0+1):end,:)];%產生子代b
newfarm(:,2*N-1)=a;%加入子代種群
newfarm(:,2*N)=b;
for i=1:(N-1)
A=farm(:,Ser(i));
B=farm(:,Ser(i+1));
P0=unidrnd(M-1);
a=[A(1:P0,:);B((P0+1):end,:)];
b=[B(1:P0,:);A((P0+1):end,:)];
newfarm(:,2*i-1)=a;
newfarm(:,2*i)=b;
end
FARM=[farm,newfarm];
%% 選擇復制
SER=randperm(3*N);
FITNESS=zeros(1,3*N);
fitness=zeros(1,N);
for i=1:(3*N)
Beta=FARM(:,i);
FITNESS(i)=FIT(Beta,D,c,m);
end
for i=1:N
f1=FITNESS(SER(3*i-2));
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));
elseif f2<=f1&&f2<=f3
farm(:,i)=FARM(:,SER(3*i-1));
fitness(:,i)=FITNESS(:,SER(3*i-1));
else
farm(:,i)=FARM(:,SER(3*i));
fitness(:,i)=FITNESS(:,SER(3*i));
end
end
%% 記錄最佳個體和收斂曲線
X=farm;
Y=fitness;
ALLX{k}=X;
ALLY(k,:)=Y;
minY=min(Y);
pos=find(Y==minY);
BESTX{k}=X(:,pos(1));
BESTY(k)=minY;
%% 變異
for i=1:N
if Pm>rand&&pos(1)~=i
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);
posY=find(TempY==minTempY);
BESTY2(k)=minTempY;
BESTX2{k}=BESTX{posY(1)};
end
BESTY=BESTY2;
BESTX=BESTX2;
plot(BESTY,'-ko','MarkerEdgeColor','k','MarkerFaceColor','k','MarkerSize',2)
ylabel('函數值')
xlabel('迭代次數')
grid on
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -