FuzzyCMeans算法
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>nX=X';[n,D]=size(X);
end
if nargin==2m=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:nF(index(f),f)=1;
end
if D>2X=zscore(X); %數據標準化[~,~,latent]=pca(X); %PCA降維[~,b]=sort(latent,'descend');X=X(:,b(1:2)); %取前兩維繪圖PlotClusterinResult(X,index);
end
if D==2PlotClusterinResult(X,index);
end
function A=oneness(A,n)
for i=1:n %模糊矩陣概率歸一A(:,i)=A(:,i)/sum(A(:,i));
end
endfunction V=updataV(A)
V=zeros(D,C);
for i=1:CV(:,i)=(A(i,:).^m*X)'/sum(A(i,:).^m);
end
endfunction A=updataA(X,V)
A=zeros(C,n);
for i=1:Cfor j=1:nA(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)]; elseStyle = 'o';MarkerSize = 6; Color = [0 0 0]; if ~isempty(Xi) Legends{end+1} = 'Noise'; endendif ~isempty(Xi) plot(Xi(:,1),Xi(:,2),Style,'MarkerSize',MarkerSize,'Color',Color); endhold on;
end
hold off;
axis equal;
grid on;
legend(Legends);
legend('Location', 'NorthEastOutside');
end
測試Matlab自帶fisheriris數據集。
FSC(meas,3)
結果如下圖:
總結
以上是生活随笔為你收集整理的FuzzyCMeans算法的全部內容,希望文章能夠幫你解決所遇到的問題。