一、k-means聚類演算法簡介
k-means演算法是典型的基於距離的聚類演算法,即對各個樣本集採用距離作為相似性的評價指標,若兩個樣本集的距離越近,其相似度就越大。按照樣本之間的距離大小,將樣本集劃分為k個簇。讓簇內的點盡量緊密的連在一起,且讓簇間的距離盡量的大。最後把得到緊湊且獨立的簇作為最終的目標。
二、相關知識點
1、距離度量:不同的距離量度會對距離的結果產生影響,常見的距離量度公式有很多。在該演算法中一般採用歐幾里得公式:
其中, 為點與點之間的距離;
但是歐幾里得距離度量會受指標不同單位刻度的影響,所以一般需要先進行標準化。距離越大,個體間差異越大;
2、聚類分析:聚類分析是在資料中發現資料物件之間的關係,將資料進行分組,組內的相似性越大,組間的差別越大,則聚類效果越好。
3、簇型別:用不同的簇型別劃分資料的結果是不同的,簇的型別有很多種。如:
3.1 基於中心的簇。就是每個點到其簇的距離比到任何其他簇的距離都近,這是最常見也是k-means聚類演算法優先選擇的簇型別。
3.2 分離明顯的簇。即每個點到其簇中任意乙個點的距離都小於到不同簇中的其他點的距離。
3.3 基於密度的簇。簇是被低密度區域分開的高密度區域。
3.4 概念簇。簇中的點具有由整個點集匯出的某種共同的性質。
三、k-means演算法過程
(1)隨機選取k個初始質心
(2)分別計算所有樣本到這k個質心的距離
(3)如果樣本離某質心ki最近,那麼這個樣本屬於ki點群;如果到多個質心的距離相等,則可劃分到任意組中
(4)按距離對所有樣本分完組之後,計算每個組的均值(最簡單的方法就是求樣本每個維度的平均值),作為新的質心
(5)重複(2)(3)(4)直到新的質心和原質心相等,演算法結束
如上圖所示,圖a表達了初始的樣本集,假設質心k=2。(上圖中用紅色×和綠色×表示兩個不同的質心)在圖b中隨機選擇兩個k類所對應的類別質心,即圖中的紅色質心和綠色質心,然後分別求樣本中所有點到這兩個質心的距離,並標記每個樣本的類別為和該樣本距離最小的質心的類別,如圖c所示,經過計算樣本和紅色質心和綠色質心的距離,我們得到了所有樣本點的第一輪迭代後的類別。此時我們對我們當前標記為紅色和綠色的點分別求其新的質心,如圖d所示,新的紅色質心和綠色質心的位置已經發生了變動。圖e和圖f重複了我們在圖c和圖d的過程,即將所有點的類別標記為距離最近的質心的類別並求新的質心。最終我們得到的兩個類別如圖f。
在實際k-means演算法中,多次執行圖c和圖d會達到最終的更優的類別。
四、**實現
實驗中給定質心數量k值為2,樣本資料為 , , , , , , , , , ,
執行結果:
完整**如下:
#include"五、總結1、對於k-means演算法,首先要注意的是k值的選擇,即簇數的選擇。上個例子中我對k值選擇是隨機選擇的,對如何選擇乙個合適的k值還不清楚!後面會繼續學習,也希望有知道的同學給予建議stdio.h
"#include
"stdlib.h
"#include
"math.h
"#include
using
namespace
std;
#define n 11
#define k 2typedef
struct
point;
point point[n] =, , , , ,
, , , , ,
};int
center[n];
point mean[k];
float
getdistance(point point1, point point2);
void
cluster();
float
gete();
void getmean(int
center[n]);
intmain()
printf(
"總的迭代次數為:%d次\n
", number);
system(
"pause");
return0;
}//計算距離函式,歐式距離
float
getdistance(point point1, point point2)
//聚類函式
void
cluster()
float min = 9999.0
;
for (int j = 0; j < k; j++)
}printf(
"(%.0f,%.0f)\t 屬於點群%d\n
", point[i].x, point[i].y, center[i] + 1
); }}//
聚類後誤差計算函式
float
gete()
}sum +=cnt;
}return
sum;}//
重新計算聚類中心
void getmean(int
center[n])
}mean[i].x = sum.x /count;
mean[i].y = sum.y /count;
}for (int i = 0; i < k; i++)
}
2、當確定了k值後,我們需要選擇k個初始化的質心,就像上圖b中的紅色質心和綠色質心。質心的確定也是隨機選擇的。值得注意的是k個初始化的質心的位置的選擇對最後的聚類結果和執行時間都有很大的影響,所有選擇合適的質心很重要,我個人總結的結論是這些質心最好不能隔太近,另外根據實際情況選擇合適的迭代次數也很重要。
3、演算法實現比較容易,原理也比較簡單,排程引數主要是簇數k值和迭代次數。、
六、演算法優化方案
通過實驗可知,質心位置的選擇對最後的聚類結果和執行時間都有很大的影響,因此需要選擇合適的k個質心。如果完全隨機的選擇,就很有可能導致演算法低效。通過上網查閱相關資料得知,k-means++演算法是對k-means隨機初始化質心的方法的優化。
k-means++演算法如下:
(1)從輸入的資料點集合中隨機選擇乙個點作為第乙個聚類中心μ1
(2)對於資料集中的每乙個點xi,計算它與已選擇的聚類中心中最近聚類中心的距離d(xi)
(3)選擇乙個新的資料點作為新的聚類中心,選擇的原則是:d(x)較大的點,被選取作為聚類中心的概率較大
(4)重複(2)和(3直到選擇出k個聚類質心
(5)利用這k個質心來作為初始化質心去執行標準的k-means演算法
參考**:
K Means聚類演算法
k means聚類演算法 intergret kmeans演算法的基本思想是初始隨機給定k個簇中心,按照最鄰近原則把待分類樣本點分到各個簇。然後按平均法重新計算各個簇的質心,從而確定新的簇心。一直迭代,直到簇心的移動距離小於某個給定的值。k means聚類演算法主要分為三個步驟 1 第一步是為待聚類...
聚類演算法 K means
演算法接受引數 k 然後將事先輸入的n個資料物件劃分為 k個聚類以便使得所獲得的聚類滿足 同一聚類中的物件相似度較高 而不同聚類中的物件相似度較小。聚類相似度是利用各聚類中物件的均值所獲得乙個 中心物件 引力中心 來進行計算的。k means演算法是最為經典的基於劃分的聚類方法,是十大經典資料探勘演...
k means聚類演算法
說到聚類,得跟分類區別開來,分類是按人為給定的標準將樣本歸到某個類別中去,在機器學習中多是監督學習,也就是訓練樣本要給標籤 正確的類別資訊 而聚類是在某種規則下自動將樣本歸類,在機器學習中是無監督學習,不需要提前給樣本打標籤。k means聚類演算法,就是在某種度量方式下,將樣本自動劃分到k個類別中...