導航:首頁 > 源碼編譯 > matlab圖像聚類演算法

matlab圖像聚類演算法

發布時間:2023-06-11 09:34:18

⑴ 如何編寫求K-均值聚類演算法的Matlab程序

在聚類分析中,K-均值聚類演算法(k-means
algorithm)是無監督分類中的一種基本方法,其也稱為C-均值演算法,其基本思想是:通過迭代的方法,逐次更新各聚類中心的值,直至得到最好的聚類結果。
假設要把樣本集分為c個類別,演算法如下:
(1)適當選擇c個類的初始中心;
(2)在第k次迭代中,對任意一個樣本,求其到c個中心的距離,將該樣本歸到距離最短的中心所在的類,
(3)利用均值等方法更新該類的中心值;
(4)對於所有的c個聚類中心,如果利用(2)(3)的迭代法更新後,值保持不變,則迭代結束,否則繼續迭代。
下面介紹作者編寫的一個分兩類的程序,可以把其作為函數調用。
%%
function
[samp1,samp2]=kmeans(samp);
作為調用函數時去掉注釋符
samp=[11.1506
6.7222
2.3139
5.9018
11.0827
5.7459
13.2174
13.8243
4.8005
0.9370
12.3576];
%樣本集
[l0
l]=size(samp);
%%利用均值把樣本分為兩類,再將每類的均值作為聚類中心
th0=mean(samp);n1=0;n2=0;c1=0.0;c1=double(c1);c2=c1;for
i=1:lif
samp(i)<th0
c1=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;
c11=c1;c22=c2;
%聚類中心while
t==0samp1=zeros(1,l);
samp2=samp1;n1=1;n2=1;for
i=1:lif
abs(samp(i)-c11)<abs(samp(i)-c22)
samp1(n1)=samp(i);
cl1=cl1+samp(i);n1=n1+1;
c11=cl1/n1;elsesamp2(n2)=samp(i);
cl2=cl2+samp(i);n2=n2+1;
c22=cl2/n2;endendif
c11==c1
&&
c22==c2t=1;endcl1=c11;cl2=c22;
c1=c11;c2=c22;
end
%samp1,samp2為聚類的結果。
初始中心值這里採用均值的辦法,也可以根據問題的性質,用經驗的方法來確定,或者將樣本集隨機分成c類,計算每類的均值。
k-均值演算法需要事先知道分類的數量,這是其不足之處。

⑵ MATLAB高手請幫幫小弟 現有MATLAB難題如下:

對圖像加入高斯白雜訊,參考以下函數:
AWGN:在某一信號中加入高斯白雜訊
y = awgn(x,SNR) 在信號x中加入高斯白雜訊。信噪比SNR以dB為單位。x的強度假定為0dBW。如果x是復數,就加入復雜訊。
y = awgn(x,SNR,SIGPOWER) 如果SIGPOWER是數值,則其代表以dBW為單位的信號強度;如果SIGPOWER為'measured',則函數將在加入雜訊之前測定信號強度。
y = awgn(x,SNR,SIGPOWER,STATE) 重置RANDN的狀態。
y = awgn(…,POWERTYPE) 指定SNR和SIGPOWER的單位。POWERTYPE可以是'dB'或'linear'。辯搏如果POWERTYPE是'頃灶喚dB',那麼SNR以dB為單位,而SIGPOWER以dBW為單位。如果POWERTYPE是'linear',那麼SNR作為比值來度量,而SIGPOWER以瓦特為單位。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%自編的均值濾波函數。x是需要濾波的圖像,n是模板大小(即n×n)
function d=avefilt(x,n)
a(1:n,1:n)=1; %a即n×n模板,元素全是1
p=size(x); %輸入圖像是p×q的,且p>n,q>n
x1=double(x);
x2=x1;
%A(a:b,c:d)表示A矩陣的第a到b行,第c到d列的所有元素
for i=1:p(1)-n+1
for j=1:p(2)-n+1
c=x1(i:i+(n-1),j:j+(n-1)).*a; %取出x1中從(i,j)開始的n行n列元素與模板相乘
s=sum(sum(c)); %求c矩陣(即模板)中各元素之和
x2(i+(n-1)/2,j+(n-1)/2)=s/(n*n); %將模板各元素的均值賦給模板中心位置的元素
end
end
%未被賦值的元素取原值
d=uint8(x2);

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
HCM是硬C均值演算法,FCM為模糊C均值演算法,由HCM發展而來。雀凱
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [center, U, obj_fcn] = FCMClust(data, cluster_n, options)
% FCMClust.m 採用模糊C均值對數據集data聚為cluster_n類
%
% 用法:
% 1. [center,U,obj_fcn] = FCMClust(Data,N_cluster,options);
% 2. [center,U,obj_fcn] = FCMClust(Data,N_cluster);
%
% 輸入:
% data ---- nxm矩陣,表示n個樣本,每個樣本具有m的維特徵值
% N_cluster ---- 標量,表示聚合中心數目,即類別數
% options ---- 4x1矩陣,其中
% options(1): 隸屬度矩陣U的指數,>1 (預設值: 2.0)
% options(2): 最大迭代次數 (預設值: 100)
% options(3): 隸屬度最小變化量,迭代終止條件 (預設值: 1e-5)
% options(4): 每次迭代是否輸出信息標志 (預設值: 1)
% 輸出:
% center ---- 聚類中心
% U ---- 隸屬度矩陣
% obj_fcn ---- 目標函數值
% Example:
% data = rand(100,2);
% [center,U,obj_fcn] = FCMClust(data,2);
% plot(data(:,1), data(:,2),'o');
% hold on;
% maxU = max(U);
% index1 = find(U(1,:) == maxU);
% index2 = find(U(2,:) == maxU);
% line(data(index1,1),data(index1,2),'marker','*','color','g');
% line(data(index2,1),data(index2,2),'marker','*','color','r');
% plot([center([1 2],1)],[center([1 2],2)],'*','color','k')
% hold off;

if nargin ~= 2 & nargin ~= 3, %判斷輸入參數個數只能是2個或3個
error('Too many or too few input arguments!');
end

data_n = size(data, 1); % 求出data的第一維(rows)數,即樣本個數
in_n = size(data, 2); % 求出data的第二維(columns)數,即特徵值長度
% 默認操作參數
default_options = [2; % 隸屬度矩陣U的指數
100; % 最大迭代次數
1e-5; % 隸屬度最小變化量,迭代終止條件
1]; % 每次迭代是否輸出信息標志

if nargin == 2,
options = default_options;
else %分析有options做參數時候的情況
% 如果輸入參數個數是二那麼就調用默認的option;
if length(options) < 4, %如果用戶給的opition數少於4個那麼其他用默認值;
tmp = default_options;
tmp(1:length(options)) = options;
options = tmp;
end
% 返回options中是數的值為0(如NaN),不是數時為1
nan_index = find(isnan(options)==1);
%將denfault_options中對應位置的參數賦值給options中不是數的位置.
options(nan_index) = default_options(nan_index);
if options(1) <= 1, %如果模糊矩陣的指數小於等於1
error('The exponent should be greater than 1!');
end
end
%將options 中的分量分別賦值給四個變數;
expo = options(1); % 隸屬度矩陣U的指數
max_iter = options(2); % 最大迭代次數
min_impro = options(3); % 隸屬度最小變化量,迭代終止條件
display = options(4); % 每次迭代是否輸出信息標志

obj_fcn = zeros(max_iter, 1); % 初始化輸出參數obj_fcn

U = initfcm(cluster_n, data_n); % 初始化模糊分配矩陣,使U滿足列上相加為1,
% Main loop 主要循環
for i = 1:max_iter,
%在第k步循環中改變聚類中心ceneter,和分配函數U的隸屬度值;
[U, center, obj_fcn(i)] = stepfcm(data, U, cluster_n, expo);
if display,
fprintf('FCM:Iteration count = %d, obj. fcn = %f\n', i, obj_fcn(i));
end
% 終止條件判別
if i > 1,
if abs(obj_fcn(i) - obj_fcn(i-1)) < min_impro,
break;
end,
end
end

iter_n = i; % 實際迭代次數
obj_fcn(iter_n+1:max_iter) = [];

% 子函數
function U = initfcm(cluster_n, data_n)
% 初始化fcm的隸屬度函數矩陣
% 輸入:
% cluster_n ---- 聚類中心個數
% data_n ---- 樣本點數
% 輸出:
% U ---- 初始化的隸屬度矩陣
U = rand(cluster_n, data_n);
col_sum = sum(U);
U = U./col_sum(ones(cluster_n, 1), :);

% 子函數
function [U_new, center, obj_fcn] = stepfcm(data, U, cluster_n, expo)
% 模糊C均值聚類時迭代的一步
% 輸入:
% data ---- nxm矩陣,表示n個樣本,每個樣本具有m的維特徵值
% U ---- 隸屬度矩陣
% cluster_n ---- 標量,表示聚合中心數目,即類別數
% expo ---- 隸屬度矩陣U的指數
% 輸出:
% U_new ---- 迭代計算出的新的隸屬度矩陣
% center ---- 迭代計算出的新的聚類中心
% obj_fcn ---- 目標函數值
mf = U.^expo; % 隸屬度矩陣進行指數運算結果
center = mf*data./((ones(size(data, 2), 1)*sum(mf'))'); % 新聚類中心(5.4)式
dist = distfcm(center, data); % 計算距離矩陣
obj_fcn = sum(sum((dist.^2).*mf)); % 計算目標函數值 (5.1)式
tmp = dist.^(-2/(expo-1));
U_new = tmp./(ones(cluster_n, 1)*sum(tmp)); % 計算新的隸屬度矩陣 (5.3)式

% 子函數
function out = distfcm(center, data)
% 計算樣本點距離聚類中心的距離
% 輸入:
% center ---- 聚類中心
% data ---- 樣本點
% 輸出:
% out ---- 距離
out = zeros(size(center, 1), size(data, 1));
for k = 1:size(center, 1), % 對每一個聚類中心
% 每一次循環求得所有樣本點到一個聚類中心的距離
out(k, :) = sqrt(sum(((data-ones(size(data,1),1)*center(k,:)).^2)',1));
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
調用完FCM後,得到的U矩陣就是聚類結果,然後根據U矩陣對原圖像進行賦值,即可得到分割結果。

⑶ MATLAB中圖形輪廓提取的C均值聚類演算法FCM出錯,用其他圖片就可以出結果,換成醫學圖片就不行了

醫學圖片的數據結構與一般的圖片不一樣,須專門編程

⑷ matlab 聚類演算法silhouette

~的意思的無視這個項,僅生成h。

snapnaw,拍攝圖像快照以包括在發布文檔中。代碼中沒有涉及發布文檔,所以沒有顯示。

參考網頁網頁鏈接

⑸ 怎麼用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做過聚類演算法

分類演算法,參數分別為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中聚類演算法

建議你直接使用命令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語言怎麼敘述

聚類演算法1. 劃分法(partitioning methods):給定一個有N個元組或者紀錄的數據集,分裂法將構造K個分組,每一個分組就代表一個聚類,K<N。而且這K個分組滿足下列條件:(1) 每一個分組至少包含一個數據紀錄;(2)每一個數據紀錄屬於且僅屬於一個分組(注意:這個要求在某些模糊聚類演算法中可以放寬);對於給定的K,演算法首先給出一個初始的分組方法,以後通過反復迭代的方法改變分組,使得每一次改進之後的分組方案都較前一次好,而所謂好的標准就是:同一分組中的記錄越近越好,而不同分組中的紀錄越遠越好。使用這個基本思想的演算法有:K-MEANS演算法、K-MEDOIDS演算法、CLARANS演算法; 2. 層次法(hierarchical methods):這種方法對給定的數據集進行層次似的分解,直到某種條件滿足為止。具體又可分為「自底向上」和「自頂向下」兩種方案。例如在「自底向上」方案中,初始時每一個數據紀錄都組成一個單獨的組,在接下來的迭代中,它把那些相互鄰近的組合並成一個組,直到所有的記錄組成一個分組或者某個條件滿足為止。代表演算法有:BIRCH演算法、CURE演算法、CHAMELEON演算法等;

⑼ matlab圖像聚類分割演算法 求大神告知以下代碼是用了什麼方法還有怎麼把圖像分割和聚類演算法結合在一起。

用了K均值聚類演算法,即求特徵點到兩個聚類中心的距離,哪個小就將他歸於哪一類中,即D1和D2

閱讀全文

與matlab圖像聚類演算法相關的資料

熱點內容
dvd光碟存儲漢子演算法 瀏覽:758
蘋果郵件無法連接伺服器地址 瀏覽:963
phpffmpeg轉碼 瀏覽:672
長沙好玩的解壓項目 瀏覽:145
專屬學情分析報告是什麼app 瀏覽:564
php工程部署 瀏覽:833
android全屏透明 瀏覽:737
阿里雲伺服器已開通怎麼辦 瀏覽:803
光遇為什麼登錄時伺服器已滿 瀏覽:302
PDF分析 瀏覽:486
h3c光纖全工半全工設置命令 瀏覽:143
公司法pdf下載 瀏覽:383
linuxmarkdown 瀏覽:350
華為手機怎麼多選文件夾 瀏覽:683
如何取消命令方塊指令 瀏覽:350
風翼app為什麼進不去了 瀏覽:779
im4java壓縮圖片 瀏覽:362
數據查詢網站源碼 瀏覽:151
伊克塞爾文檔怎麼進行加密 瀏覽:893
app轉賬是什麼 瀏覽:163