教程 | matlab實現kmeans聚類算法

2021-02-13 數學建模公會

kmeans聚類算法是一種簡單實用的聚類算法,matlab自帶函數kmeans可直接對數據進行kmeans聚類。為了方便更好地掌握kmeans聚類算法,今天我們自己來實現一個弱化的版本mykmeans。mykmeans輸入包含三項,分別為聚類所使用的數據data,data每一行代表一個樣本,每一列代表一個特徵;聚類中心數量numclass;第三項為所使用的距離的定義,默認情況下為歐式距離。
function [cluster,clusterhistory]=mykmeans(data,numclass,varargin)% kmeans聚類。% 聚類過程動畫顯示% INPUTS:% data:每一行代表一個樣本,每一列代表一個特徵% numclass:聚類中心的數量% varargin{1}: 距離定義。支持euclidean(默認)、hamming% OUTPUT:% cluster: numsample行的列向量,代表每個樣本的分類歸屬% clusterhistory{i}.cluster第i次迭代的聚類% clusterhistory{i}.core第i次迭代的聚類中心%% 公眾號【數學建模公會】,HCLO4,20190902
if nargin==2 method='euclidean';else method=varargin{1};end% 初始化聚類中心坐標,在數據點中隨機選擇numclass個點作為初始聚類中心。numsample=size(data,1);temp=randperm(numsample);core=data(temp(1:numclass),:);dis=caldis(data,core,method); %存儲每個樣本到當前聚類中心的距離

% 執行迭代過程maxIter=20; % 最大迭代次數numiter=1;clusterhistory=cell(1,maxIter);while 1 newcore=zeros(size(core)); % 迭代聚類中心 [~,ind]=min(dis,[],2); %計算每個sample歸屬於哪個聚類中心,如果某個聚類中心沒有一個點? for i=1:numclass newcore(i,:)=mean(data(ind==i,:)); end clusterhistory{numiter}.cluster=ind; clusterhistory{numiter}.core=core; if all(newcore(:)==core(:))||numiter>=maxIter % 迭代終止條件,聚類中心不再改變 cluster=ind; break end core=newcore; dis=caldis(data,core,method); numiter=numiter+1; end
clusterhistory=clusterhistory(1:numiter);

end % mykmeans


function dis=caldis(data,core,method)%計算每個樣本到當前聚類中心的距離numsample=size(data,1);numclass=size(core,1);dis=zeros(numsample,numclass);switch method case 'euclidean' for i=1:numclass dis(:,i)=sqrt(sum((data-repmat(core(i,:),numsample,1)).^2,2)); end case 'hamming' for i=1:numclass dis(:,i)=mean(data~=repmat(core(i,:),numsample,1),2); endend

下面一段代碼用於測試mykmeans和kmeans的運行結果。生成兩組服從二維高斯分布的數據,作為兩個數據類別,分別使用mykmeans和matlab自帶的kmeans函數進行聚類分析。
%%%%%%%%%%%%%%%%%%%%%%% 測試mykmeans函數  %%%%%%%%%%%%%%%%%%%%%%%%% 公眾號【數學建模公會】,HCLO4,20190902
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% 生成模擬數據,平面上的兩組點,均服從二維高斯分布mu1=[2,8];sigma1=[2,2];mu2=[8,2];sigma2=[3,3];
numsample1=100;numsample2=200;data1=zeros(numsample1,2);data1(:,1)=normrnd(mu1(1),sigma1(1),numsample1,1);data1(:,2)=normrnd(mu1(2),sigma1(2),numsample1,1);
data2=zeros(numsample2,2);data2(:,1)=normrnd(mu2(1),sigma2(1),numsample2,1);data2(:,2)=normrnd(mu2(2),sigma2(2),numsample2,1);
data=[data1;data2];
tic,[cluster1,clusterhistory]=mykmeans(data,2);tocM=getFrame_Kmeans(data,clusterhistory); % 生成聚類動圖
tic,cluster2=kmeans(data,2);toc

下面的函數實現mykmeans聚類過程的可視化,僅針對二維數據和三維數據類型。
function M=getFrame_Kmeans(data,clusterhistory)% kmeans聚類過程可視化程序。只能對二維和三維數據可視化!%% INPUTS: % data: 聚類用的數據,每行代表一個樣本,每列代表一個特徵% clusterhistory: mykmeans函數輸出的聚類過程數據%% OUTPUT:% kmeans聚類過程的動畫。
dimension=size(data,2);if dimension>3 % 若三維以上,只能通過pca降維處理 error('無法實現高於三維的數據的聚類可視化')end
colorset=cell(1,1000);colorset(1:8)={'r','g','b','k','c','m','y','k'};for i=9:1000 %如果聚類中心數量大於8,就使用隨機的顏色。 colorset{i}=rand(1,3);end
numcore=length(unique(clusterhistory{1}.cluster));numiter=length(clusterhistory);
for k=1:numiter figure hold on switch dimension case 2 for i=1:numcore ind=clusterhistory{k}.cluster==i; scatter(data(ind,1),data(ind,2),6,colorset{i}) core=clusterhistory{k}.core; plot(core(i,1),core(i,2),[colorset{i},'.'],'MarkerSize',20) end case 3 for i=1:numcore ind=clusterhistory{k}.cluster==i; scatter3(data(ind,1),data(ind,2),data(ind,3),6,colorset{i}) core=clusterhistory{k}.core; plot3(core(i,1),core(i,2),core(i,3),colorset{i},'MarkerSize',6) end end M(k)=getframe(gcf); frame = getframe(gcf); im = frame2im(frame); %將影片動畫轉換為編址圖像,因為圖像必須是index索引圖像 imshow(im); [I,map] = rgb2ind(im,20); %將真彩色圖像轉化為索引圖像 if k==1 imwrite(I,map,'kmeans.gif','gif','Loopcount',inf,'DelayTime',0.3); %Loopcount只是在i==1的時候才有用 else imwrite(I,map,'kmeans.gif','gif','WriteMode','append','DelayTime',1);%DelayTime:幀與幀之間的時間間隔 end close(gcf); end

相關焦點

  • 基於matlab的RBFNN的kmeans算法研究
    摘要:在這個信息量爆炸的社會,高效的處理數據成為重中之重,所以聚類算法就為此提供了技術幫助。聚類解析是把數據進行分類匯總的重要手段,被廣泛應用於當今統計學,大數據運行,信號辨別等眾多行業。聚類算法有多種實現方法,其中kmeans算法是基於距離劃分 的方法來實現聚類。
  • 數學推導+純 Python 實現機器學習算法:Kmeans 聚類
    下面我們基於numpy按照前述算法流程來實現一個kmeans算法。回顧上述過程,我們可以先思考一下對算法每個流程該如何定義。首先要定義歐式距離計算函數,然後類中心初始化、根據樣本與類中心的歐式距離劃分類別並獲取聚類結果、根據新的聚類結果重新計算類中心點、重新聚類直到滿足停止條件。
  • Kmeans聚類算法
    我們之前遇到的所有機器學習算法都屬於帶標籤的監督算法,而實現生活中大部分數據是不帶標籤的,從今天起我們要學一些處理不帶標籤數據的非監督算法,先從Kmeans聚類算法開始,我們將從以下幾個方面來介紹Kmeans聚類算法什麼是聚類?
  • 【源碼】Kmeans聚類算法(超快速、簡潔的設計方法)
    這是一種超快速MATLAB實現的kmeans聚類算法。
  • 機器學習——詳解經典聚類算法Kmeans
    代碼實現Kmeans的原理以及牽引侯貴搞清楚了之後,用Python實現就變得很簡單了。我們可以使用dataset.make_blobs創造聚類數據。傳入樣本的數量和特徵的數量,真實類簇的坐標以及樣本的標準差,就可以得到一批相應的樣本。創建完數據之後,下面我們就可以開始算法的實現了。首先,我們先開發整個算法的基礎方法,來簡化後續的開發。
  • K_means聚類的matlab應用
    感謝關注matlab愛好者公眾號!如果公眾號文章對您有幫助,別忘了點擊分享和「在看」哦!
  • 機器學習之基於sklearn的KMeans聚類
    聚類算法,無監督學習的代表算法,又叫做「無監督分類」即在訓練的時候只需要特徵矩陣,不需要真實值標籤可以有效地幫助我們探索數據的自然分布一、KMeans算法的運行過程運行的流程如下:自動聚類時的質心點的每步驟變化如下:
  • 改良的kmeans與K近鄰算法特性分析
    kmeans聚類算法應用於對烤菸外觀的區域分類 [3] 。k近鄰算法本身是一種惰性的監督算法,相較於其他監督算法比如支持向量機、邏輯回歸、隨機樹等,具有算法簡單、易於理解、易於實現、無需估計參數的特性。kmeans算法由於對初始點選擇較敏感,不同的初始點將會導致不同的聚類結果。
  • R語言之實現K-mean聚類算法
    聚類算法作為無監督的學習方法,在不給出Y的情況下對所有的樣本進行聚類。以動態聚類為基礎的K均值聚類方法是其中最簡單而又有深度的一種方法。
  • 聚類算法之Kmeans
    聚類算法之Kmeans聚類算法其實有很多,包括層次聚類,密度聚類,譜聚類等等。那麼以上三種算法都是對於kmeans算法初值敏感問題的改進,進一步說,主要解決的是kmeans初始化k個簇心的問題。而對於kmeans其它的步驟,並不會產生影響,依然還是按原有流程繼續往下走。
  • k均值聚類算法原理和(TensorFlow)實現(無師自通)
    人是非常擅長分類的,聚類算法試圖讓計算機也具備這種類似的能力,聚類技術很多,例如層次法、貝葉斯法和劃分法。k 均值聚類屬於劃分聚類方法,將數據分成 k 個簇,每個簇有一個中心,稱為質心,k 值需要給定。k 均值聚類算法的工作原理如下:隨機選擇 k 個數據點作為初始質心(聚類中心)。
  • 不足 20 行 Python 代碼,高效實現 k-means 均值聚類算法!
    k-means均值算法雖然是聚類算法中比較簡單的一種,卻包含了豐富的思想內容,非常適合作為初學者的入門習題。關於 k-means 均值聚類算法的原理介紹、實現代碼,網上有很多,但運行效率似乎都有點問題。今天稍微有點空閒,寫了一個不足20行的 k-means 均值聚類算法,1萬個樣本平均耗時20毫秒(10次均值)。同樣的數據樣本,網上流行的算法平均耗時3000毫秒(10次均值)。
  • K-means 聚類算法及其代碼實現
    K-means算法是非監督學習(unsupervised learning)中最簡單也是最常用的一種聚類算法,具有的特點是:本文章介紹
  • python之kmeans數據聚類算法
    一 Kmeans原理kmeans是屬於無監督學習的數據聚類算法,根據點與點之間的距離推測每個點屬於哪個中心,常用計算距離的方式有:餘弦距離、歐式距離、曼哈頓距離等,本文以歐式距離為例。圖3kmeans實現邏輯:需要輸入待聚類的數據和欲聚類簇數k1.隨機生成k個初始點作為質心
  • Python實現KMeans算法
    「Python實現一個算法總是比你理解這個算法更簡單,這也是Python如此流行的原因之一。」在前面的文章中講過數據離散化和KMeans算法的理論理解。參見:數據離散化及其KMeans算法實現的理解這篇文章來看看怎樣用Python實現這個事。
  • 三種聚類方法的介紹及其R語言實現
    聚類分析的類型包括兩種Q型聚類(對樣品聚類)、R型聚類(對變量聚類)。一、聚類分析介紹聚類分析方法包括很多種,例如:系統聚類法、動態聚類法、模糊聚類法、密度聚類法等,本文主要介紹的是系統聚類法、動態聚類法與密度聚類法。
  • K-Means聚類講解:算法和Sklearn的實現(附代碼)
    K-Means聚類是機器學習領域中最強大的聚類算法之一。他的原因比較簡單,但得出的結果也非常準確。聚類是理解數據集的非常重要的方式,因此在本文中,我們將討論什麼是聚類,為什麼需要聚類以及什麼是k-means聚類。
  • ...分類與聚類:三大方向剖解機器學習算法的優缺點(附Python和R實現)
    選自EliteDataScience機器之心編譯參與:蔣思源、晏奇在本教程中,作者對現代機器學習算法進行一次簡要的實戰梳理。雖然類似的總結有很多,但是它們都沒有真正解釋清楚每個算法在實踐中的好壞,而這正是本篇梳理希望完成的。因此本文力圖基於實踐中的經驗,討論每個算法的優缺點。而機器之心也在文末給出了這些算法的具體實現細節。
  • K均值聚類算法-Matlab代碼
    一、K均值聚類算法算法步驟如下:1、初始化已知數據集合X,及事先指定聚類的總類數N,在X中隨機選取N個對象作為初始的聚類中心。5、重複步驟3~4,滿足步驟2中的迭代終止條件時,停止Matlab代碼見下圖:K均值聚類算法-Matlab代碼二、K均值聚類算法應用舉例1、隨機生成三組數據隨機生成的三組數據
  • 【他山之石】DBSCAN密度聚類算法(理論+圖解+python代碼)
    作者:風弦鶴CSDN博客地址:https://blog.csdn.net/huacha__/article/details/81094891本文主要內容:1、前言2、DBSCAN聚類算法3、參數選擇4、DBSCAN算法迭代可視化展示5、常用評估方法:輪廓係數