k均值算法原理详细讲解以及matlab代码实现
生活随笔
收集整理的這篇文章主要介紹了
k均值算法原理详细讲解以及matlab代码实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
有研究生物電信號處理和機器學習的歡迎加我qq429500506共同交流學習進步。
最近更新文章的頻率太低了,主要原因是不想為了發(fā)文章而發(fā)文章,想潛心研究,寫好文章,順便想說一句開源萬歲,最近一個月雖然一直在研究腦電信號特征提取和分類的算法,雖然待在實驗室的時間不短,但是效率很低,歸根結底還是因為自己沒有明確的計劃,緊迫感不足,每研究透一點點就想休息一下犒勞一下自己,再加上出國留學的可能性比較大,陪女朋友的時間也更長了一些。總之這一個月過得不怎么樣。今天是周一,從今天開始,明確目標,緊迫感要強一些。合理的規(guī)劃時間,爭取最后學業(yè)愛情雙豐收。順便分享一下基礎得要命的算法K均值算法。
先說下原理:原理很簡單,就是隨機初始化幾個中心,你的數據集要分幾個類就有幾個中心,然后通過不斷的計算數據離設置的中心的歐式距離也就是初中學的兩點之間直線的距離公式。然后設定迭代次數,不斷的更新數據的中心,直到數據集離中心的距離為零或者達到設定的迭代次數為止。
附上matlab代碼(網上有很多但是可能解釋沒有那么詳細)
%%%K-meansclear all clc%% 構造隨機數據 mu1=[0 0 0]; S1=[0.23 0 0;0 0.87 0;0 0 0.56]; data1=mvnrnd(mu1,S1,100); %產生高斯分布數據%%第二類數據 mu2=[1.25 1.25 1.25]; S2=[0.23 0 0;0 0.87 0;0 0 0.56]; data2=mvnrnd(mu2,S2,100);%第三個類數據 mu3=[-1.25 1.25 -1.25]; S3=[0.23 0 0;0 0.87 0;0 0 0.56]; data3=mvnrnd(mu3,S3,100);mu4=[1.5 1.5 1.5]; S4=[0.23 0 0;0 0.87 0;0 0 0.56]; data4 =mvnrnd(mu4,S4,100);%顯示數據 figure; plot3(data1(:,1),data1(:,2),data1(:,3),'+'); title('原始數據'); hold on plot3(data2(:,1),data2(:,2),data2(:,3),'r+'); plot3(data3(:,1),data3(:,2),data3(:,3),'g+'); plot3(data4(:,1),data4(:,2),data3(:,3),'y+'); grid on;data=[data1;data2;data3;data4]; K = 4; max_iter = 300;%%迭代次數 min_impro = 0.1;%%%%最小步長 display = 1;%%%判定條件 [row,col]=size(data)%%求數據的行和列 center = zeros(K,col) U = zeros(K,col); %% 初始化聚類中心 mi = zeros(col,1) ma = zeros(col,1); for i = 1:colmi(i,1) = min(data(:,i));%%求構造的數據每一列的最小值ma(i,1) = max(data(:,i));%%求構造的數據每一列的最大值center(:,i) = ma(i,1) - (ma(i,1) - mi(i,1)) * rand(K,1);%%隨機初始化聚類中心 end%% 開始迭代 for o = 1:max_iter%% 計算歐氏距離,用norm函數for i = 1:Kdist{i} = [];for j = 1:rowdist{i} = [dist{i};data(j,:) - center(i,:)];%%dist為元胞數組計算數據離中心的幾何距離endendminDis = zeros(row,K);for i = 1:rowtem = [];for j = 1:Ktem = [tem norm(dist{j}(i,:))];end%%norm函數為矩陣范數,求矩陣每一列模的最大值[nmin,index] = min(tem);minDis(i,index) = norm(dist{index}(i,:));end%% 更新聚類中心for i = 1:Kfor j = 1:colU(i,j) = sum(minDis(:,i).*data(:,j)) / sum(minDis(:,i));endend%% 判定if displayendif o >1,if max(abs(U - center)) < min_impro;break;elsecenter = U;endend end%% 返回所屬的類別class = [];for i = 1:rowdist = [];for j = 1:Kdist = [dist norm(data(i,:) - U(j,:))];end[nmin,index] = min(dist);class = [class;data(i,:) index];end%% 顯示最后結果 [m,n] = size(class); figure; title('聚類結果'); hold on; for i=1:row if class(i,4)==1 plot3(class(i,1),class(i,2),class(i,3),'ro'); elseif class(i,4)==2plot3(class(i,1),class(i,2),class(i,3),'go'); elseif class(i,4) == 3plot3(class(i,1),class(i,2),class(i,3),'bo'); elseplot3(class(i,1),class(i,2),class(i,3),'yo'); end end grid on;?
總結
以上是生活随笔為你收集整理的k均值算法原理详细讲解以及matlab代码实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: cef 前进后台 实现_CefSpide
- 下一篇: mysql 手动执行event_MYSQ