⑴ 怎麼用Matlab計算聚類演算法的正確率問題
我把K-mediods的matlab代碼貼出來,你好好學習一下
function label = kmedoids( data,k,start_data )
% kmedoids k中心點演算法函數
% data 待聚類的數據集,每一行是一個樣本數據點
% k 聚類個數
% start_data 聚類初始中心值,每一行為一個中心點,有cluster_n行
% class_idx 聚類結果,每個樣本點標記的類別
% 初始化變數
n = length(data);
dist_temp1 = zeros(n,k);
dist_temp2 = zeros(n,k);
last = zeros(n,1);
a = 0;
b = 0;
if nargin==3
centroid = start_data;
else
centroid = data(randsample(n,k),:);
end
for a = 1:k
temp1 = ones(n,1)*centroid(a,:);
dist_temp1(:,a) = sum((data-temp1).^2,2);
end
[~,label] = min(dist_temp1,[],2);
while any(label~=last)
for a = 1:k
temp2 = ones(numel(data(label==a)),1);
temp3 = data(label==a);
for b = 1:n
temp4 = temp2*data(b,:);
temp5 = sum((temp3-temp4).^2,2);
dist_temp2(b,a) = sum(temp5,1);
end
end
[~,centry_indx] = min(dist_temp2,[],1);
last = label;
centroid = data(centry_indx,:);
for a = 1:k
temp1 = ones(n,1)*centroid(a,:);
dist_temp1(:,a) = sum((data-temp1).^2,2);
end
[~,label] = min(dist_temp1,[],2);
end
end
⑵ 怎樣用matlab作聚類分析啊求操作T_T T_T
展示如何使用MATLAB進行聚類分析
分別運用分層聚類、K均值聚類以及高斯混合模型來進行分析,然後比較三者的結果
生成隨機二維分布圖形,三個中心
% 使用高斯分布(正態分布)
% 隨機生成3個中心以及標准差
s = rng(5,'v5normal');
mu = round((rand(3,2)-0.5)*19)+1;
sigma = round(rand(3,2)*40)/10+1;
X = [mvnrnd(mu(1,:),sigma(1,:),200); ...
mvnrnd(mu(2,:),sigma(2,:),300); ...
mvnrnd(mu(3,:),sigma(3,:),400)];
% 作圖
P1 = figure;clf;
scatter(X(:,1),X(:,2),10,'ro');
title('研究樣本散點分布圖')
K均值聚類
% 距離用傳統歐式距離,分成兩類
[cidx2,cmeans2,sumd2,D2] = kmeans(X,2,'dist','sqEuclidean');
P2 = figure;clf;
[silh2,h2] = silhouette(X,cidx2,'sqeuclidean');
從輪廓圖上面看,第二類結果比較好,但是第一類有部分數據表現不佳。有相當部分的點落在0.8以下。
分層聚類
eucD = pdist(X,'euclidean');
clustTreeEuc = linkage(eucD,'average');
cophenet(clustTreeEuc,eucD);
P3 = figure;clf;
[h,nodes] = dendrogram(clustTreeEuc,20);
set(gca,'TickDir','out','TickLength',[.002 0],'XTickLabel',[]);
可以選擇dendrogram顯示的結點數目,這里選擇20 。結果顯示可能可以分成三類
重新調用K均值法
改為分成三類
[cidx3,cmeans3,sumd3,D3] = kmeans(X,3,'dist','sqEuclidean');
P4 = figure;clf;
[silh3,h3] = silhouette(X,cidx3,'sqeuclidean');
圖上看,比前面的結果略有改善。
將分類的結果展示出來
P5 = figure;clf
ptsymb = {'bo','ro','go',',mo','c+'};
MarkFace = {[0 0 1],[.8 0 0],[0 .5 0]};
hold on
for i =1:3
clust = find(cidx3 == i);
plot(X(clust,1),X(clust,2),ptsymb{i},'MarkerSize',3,'MarkerFace',MarkFace{i},'MarkerEdgeColor','black');
plot(cmeans3(i,1),cmeans3(i,2),ptsymb{i},'MarkerSize',10,'MarkerFace',MarkFace{i});
end
hold off
運用高斯混合分布模型進行聚類分析
分別用分布圖、熱能圖和概率圖展示結果 等高線
% 等高線
options = statset('Display','off');
gm = gmdistribution.fit(X,3,'Options',options);
P6 = figure;clf
scatter(X(:,1),X(:,2),10,'ro');
hold on
ezcontour(@(x,y) pdf(gm,[x,y]),[-15 15],[-15 10]);
hold off
P7 = figure;clf
scatter(X(:,1),X(:,2),10,'ro');
hold on
ezsurf(@(x,y) pdf(gm,[x,y]),[-15 15],[-15 10]);
hold off
view(33,24)
熱能圖
cluster1 = (cidx3 == 1);
cluster3 = (cidx3 == 2);
% 通過觀察,K均值方法的第二類是gm的第三類
cluster2 = (cidx3 == 3);
% 計算分類概率
P = posterior(gm,X);
P8 = figure;clf
plot3(X(cluster1,1),X(cluster1,2),P(cluster1,1),'r.')
grid on;hold on
plot3(X(cluster2,1),X(cluster2,2),P(cluster2,2),'bo')
plot3(X(cluster3,1),X(cluster3,2),P(cluster3,3),'g*')
legend('第 1 類','第 2 類','第 3 類','Location','NW')
clrmap = jet(80); colormap(clrmap(9:72,:))
ylabel(colorbar,'Component 1 Posterior Probability')
view(-45,20);
% 第三類點部分概率值較低,可能需要其他數據來進行分析。
% 概率圖
P9 = figure;clf
[~,order] = sort(P(:,1));
plot(1:size(X,1),P(order,1),'r-',1:size(X,1),P(order,2),'b-',1:size(X,1),P(order,3),'y-');
legend({'Cluster 1 Score' 'Cluster 2 Score' 'Cluster 3 Score'},'location','NW');
ylabel('Cluster Membership Score');
xlabel('Point Ranking');
通過AIC准則尋找最優的分類數
高斯混合模型法的最大好處是給出分類好壞的標准
AIC = zeros(1,4);
NlogL = AIC;
GM = cell(1,4);
for k = 1:4
GM{k} = gmdistribution.fit(X,k);
AIC(k)= GM{k}.AIC;
NlogL(k) = GM{k}.NlogL;
end
[minAIC,numComponents] = min(AIC);
按AIC准則給出的最優分類數為: 3 對應的AIC值為: 8647.63
後記
(1)pluskid指出K均值演算法的初值對結果很重要,但是在運行時還沒有發現類似的結果。也許Mathworks對該演算法進行過優化。有時間會仔細研究下代碼,將結果放上來。
分享:
56
喜歡
4
贈金筆
閱讀(21209)┊ 評論 (4)┊ 收藏(1) ┊轉載原文 ┊ 喜歡▼ ┊列印┊舉報
前一篇:[轉載]拉普拉斯矩陣
後一篇:[轉載]用matlab做聚類分析
⑶ 聚類演算法matlab語言怎麼敘述
聚類演算法1. 劃分法(partitioning methods):給定一個有N個元組或者紀錄的數據集,分裂法將構造K個分組,每一個分組就代表一個聚類,K<N。而且這K個分組滿足下列條件:(1) 每一個分組至少包含一個數據紀錄;(2)每一個數據紀錄屬於且僅屬於一個分組(注意:這個要求在某些模糊聚類演算法中可以放寬);對於給定的K,演算法首先給出一個初始的分組方法,以後通過反復迭代的方法改變分組,使得每一次改進之後的分組方案都較前一次好,而所謂好的標准就是:同一分組中的記錄越近越好,而不同分組中的紀錄越遠越好。使用這個基本思想的演算法有:K-MEANS演算法、K-MEDOIDS演算法、CLARANS演算法; 2. 層次法(hierarchical methods):這種方法對給定的數據集進行層次似的分解,直到某種條件滿足為止。具體又可分為「自底向上」和「自頂向下」兩種方案。例如在「自底向上」方案中,初始時每一個數據紀錄都組成一個單獨的組,在接下來的迭代中,它把那些相互鄰近的組合並成一個組,直到所有的記錄組成一個分組或者某個條件滿足為止。代表演算法有:BIRCH演算法、CURE演算法、CHAMELEON演算法等;
⑷ matlab 聚類演算法silhouette
~的意思的無視這個項,僅生成h。
snapnaw,拍攝圖像快照以包括在發布文檔中。代碼中沒有涉及發布文檔,所以沒有顯示。
參考網頁網頁鏈接
⑸ matlab中聚類演算法
建議你直接使用命令clusterdata()
程序如下:
x=[1 2 3 34 44 78 5 6 3 0.2 34 56 67 ]';
>> T=clusterdata(x,'maxclust',2)
T =
1
1
1
2
2
2
1
1
1
1
2
2
2
結果解釋:T值為1的表示為第一類,2的表示為第二類;即1 2 3 5 6 3 0.2為第一類,其餘的為第二類。
⑹ 如何在matlab中進行圖像的網格劃分。
可以使用meshgrid函數
meshgrid是MATLAB中用於生成網格采樣點的函數。在使用MATLAB進行3-D圖形繪制方面有著廣泛的應用,函數效果如下圖所示:
函數功能:
生成繪制3-D圖形所需的網格數據。在計算機中進行繪圖操作時, 往往需要一些采樣點,然後根據這些采樣點來繪制出整個圖形。在進行3-D繪圖操作時,涉及到x、y、z三組數據,而x、y這兩組數據可以看做是在Oxy平面內對坐標進行采樣得到的坐標對(x, y)
例如, 要在「3<=x<=5,6<=y<=9,z不限制區間」 這個區域內繪制一個3-D圖形,如果只需要整數坐標為采樣點的話。可能需要下面這樣一個坐標構成的矩陣:
(3,9),(4,9),(5,9);
(3,8),(4,8),(5,8);
(3,7),(4,7),(5,7);
(3,6),(4,6),(5,6);
在matlab中可以這樣描述這個坐標矩陣:
把各個點的x坐標獨立出來,得:
3,4,5;
3,4,5;
3,4,5;
3,4,5;
再把各個點的y坐標也獨立出來:
9,9,9;
8,8,8;
7,7,7;
6,6,6;
這樣對應的x、y結合,便表示了上面的坐標矩陣。meshgrid就是產生這樣兩個矩陣,來簡化我們的操作。然後根據(x, y)計算獲得z,並繪制出三維圖形。
在Matlab命令窗口中鍵入type meshgrid可以查看該函數的源代碼(由此可以理解meshgrid的演算法思想), 鍵入doc meshgrid或者help meshgrid可以獲得幫助文檔。
語法
[X,Y] =meshgrid(x,y)
meshgrid返回的兩個矩陣X、Y必定是行數、列數相等的,且X、Y的行數都等於輸入參數y中元素的總個數,X、Y的列數都等於輸入參數x中元素總個數(這個結論可以通過查看meshgrid的源代碼得到,可以通過示常式序得到驗證)。
[X,Y]=meshgrid(x)與[X,Y]=meshgrid(x,x)是等同的
[X,Y,Z]=meshgrid(x,y,z)生成三維數組,可用來計算三變數的函數和繪制三維立體圖
相關函數: plot3、mesh、surf、automesh、ndgrid
⑺ 求MATLAB實現canopy-kmeans聚類演算法的完整代碼
canopy聚類演算法的MATLAB程序
⑻ 有誰用matlab做過聚類演算法
分類演算法,參數分別為G(相似度矩陣),r(鄰居門限),lambda(類門限),返回值A,一個cell數組,每個元素是一個向量,包含了一個類的所有元素。
function A=BFSN_Algorithm(G,r,lambda)
%廣度優先搜索鄰居的聚類演算法實現
%G為相似度矩陣
%r和lambda為參數
%r為鄰居門限,相似度大於r即為鄰居
%lambda門限
%未分類元素對於某類的所有元素,如果是鄰居則令X(i)=1,否則為0.i為類元素的下標
%對X求和並除以類元素個數,若此值大於lambda門限,則該未分類元素屬於這類
%打開計時器
tic
%A為聚類結果
A={};
%k為分類計數
k=1;
%n為待分類元素個數
n=size(G,1);
%構建元素向量
member=1:n;
%只要member中還有未分類的元素就繼續循環
while numel(member)~=0
%從member中取出一個元素a
a=member(1);
%新建空類A並將a送入Ak類
Ak=a;
%從member中刪除a
member(1)=[];
%掃描member中的所有元素
%queue為廣度優先搜索使用的隊列
%將a送入queue中
queue=a;
%已訪問過的元素
visited=zeros(1,n);
%如果隊列非空說明還有沒有檢驗過的鄰居
while numel(queue)~=0
%一個元素出隊
p=queue(1);
queue(1)=[];
%掃描member中所有元素
for count=1:numel(member)
%用member(count)作為待分類的元素
%p是從queue中取出,找到p的所有未訪問鄰居
if G(p,member(count))>r && visited(member(count))==0
%滿足if的member(count)是未訪問過的鄰居
%放入queue中
queue=[queue member(count)];
%member(count)已經訪問過了
visited(member(count))=1;
if sum(G(member(count),Ak)>r)/numel(Ak)>=lambda
%滿足if的元素屬於Ak類,根據lambda門限判斷
Ak=[Ak member(count)];
member(count)=-1;
end
end
end
%刪除member中已分類的元素
member(member==-1)=[];
end
%將Ak保存在cell數組A的第k個位置
A{k}=Ak;
%k指向下一個分類
k=k+1;
end
%關閉計時器
toc
由於編寫的時候比較倉促,應該有很大的優化的餘地。
plotAllClass.m
繪制已分類數據的圖形,參數:data元素數據,A分類表,一個cell數組,調用BFSN_Algorithm得到。
function plotAllClass(data,A)
%data:m行2列的矩陣,m行代表m個元素,
%第一列為每個元素的橫坐標
%第二列為每個元素的縱坐標
%A為分類列表,
%有c個元素的cell數組
%每個元素是一個向量
%包含了一個分類的所有元素在data中的行
%n=類別數
n=numel(A);
%繪圖圖案列表
style=['r*';'g*';'b*';'c*';'m*';'y*';'k*';...
'r+';'g+';'b+';'c+';'m+';'y+';'k+';...
'rs';'gs';'bs';'cs';'ms';'ys';'ks';...
'rp';'gp';'bp';'cp';'mp';'yp';'kp';...
'rh';'gh';'bh';'ch';'mh';'yh';'kh';...
'rd';'gd';'bd';'cd';'md';'yd';'kd';...
'ro';'go';'bo';'co';'mo';'yo';'ko';...
'rx';'gx';'bx';'cx';'mx';'yx';'kx';...
'rv';'gv';'bv';'cv';'mv';'yv';'kv';...
'r<';'g<';'b<';'c<';'m<';'y<';'k<';...
'r>';'g>';'b>';'c>';'m>';'y>';'k>';...
'r^';'g^';'b^';'c^';'m^';'y^';'k^';...
'r.';'g.';'b.';'c.';'m.';'y.';'k.'];
figure;
hold on;
for count=1:n
plot(data(A{count},1),data(A{count},2),style(count,:));
end
hold off;
這個函數最多能夠繪制91個類別,如果有超過91個類,函數會出錯。
show.m
包含了一個完整的流程,包括數據生成,相似度矩陣生成,分類,類別繪制。
%show.m
data=rand(200,2);
figure;
plot(data(:,1),data(:,2),'+');
G=createSimiR(data);
A=BFSN_Algorithm(G,0.95,0.95);
plotAllClass(data,A);
⑼ matlab圖像聚類分割演算法 求大神告知以下代碼是用了什麼方法還有怎麼把圖像分割和聚類演算法結合在一起。
用了K均值聚類演算法,即求特徵點到兩個聚類中心的距離,哪個小就將他歸於哪一類中,即D1和D2
⑽ 怎麼跑ap聚類演算法的matlab程序
在聚類分析中,K-均值聚類演算法(k-means algorithm)是無監督分類中的一種基本方法,其也稱為C-均值演算法,其基本思想是:通過迭代的方法,逐次更新各聚類中心的值,直至得到最好的聚類結果.\x0d假設要把樣本集分為c個類別,演算法如下:\x0d(1)適當選擇c個類的初始中心;\x0d(2)在第k次迭代中,對任意一個樣本,求其到c個中心的距離,將該樣本歸到距離最短的中心所在的類,\x0d(3)利用均值等方法更新該類的中心值;\x0d(4)對於所有的c個聚類中心,如果利用(2)(3)的迭代法更新後,值保持不變,則迭代結束,否則繼續迭代.\x0d下面介紹作者編寫的一個分兩類的程序,可以把其作為函數調用.\x0d%% function [samp1,samp2]=kmeans(samp); 作為調用函數時去掉注釋符\x0dsamp=[11.1506 6.7222 2.3139 5.9018 11.0827 5.7459 13.2174 13.8243 4.8005 0.9370 12.3576]; %樣本集\x0d[l0 l]=size(samp);\x0d%%利用均值把樣本分為兩類,再將每類的均值作為聚類中心\x0dth0=mean(samp);n1=0;n2=0;c1=0.0;c1=double(c1);c2=c1;for i=1:lif samp(i)<th0\x0dc1=c1+samp(i);n1=n1+1;elsec2=c2+samp(i);n2=n2+1;endendc1=c1/n1;c2=c2/n2; %初始聚類中心t=0;cl1=c1;cl2=c2;\x0dc11=c1;c22=c2; %聚類中心while t==0samp1=zeros(1,l);\x0dsamp2=samp1;n1=1;n2=1;for i=1:lif abs(samp(i)-c11)<abs(samp(i)-c22)\x0dsamp1(n1)=samp(i);\x0dcl1=cl1+samp(i);n1=n1+1;\x0dc11=cl1/n1;elsesamp2(n2)=samp(i);\x0dcl2=cl2+samp(i);n2=n2+1;\x0dc22=cl2/n2;endendif c11==c1 && c22==c2t=1;endcl1=c11;cl2=c22;\x0dc1=c11;c2=c22;\x0dend %samp1,samp2為聚類的結果.\x0d初始中心值這里採用均值的辦法,也可以根據問題的性質,用經驗的方法來確定,或者將樣本集隨機分成c類,計算每類的均值.\x0dk-均值演算法需要事先知道分類的數量,這是其不足之處.