1. 程式人生 > >面試題:請描述K-means的原理,說明選擇聚類中心的方法 引發的回顧

面試題:請描述K-means的原理,說明選擇聚類中心的方法 引發的回顧

聚類

  常見的無監督學習任務有密度估計、異常檢測、聚類等,本問主要記錄聚類演算法及相關知識。

  在無監督學習中,訓練樣本的標記資訊是未知的,訓練的過程就是要找出資料中的內在性質和規律。
  聚類既可作為一個單獨的過程,也能夠作為其他學習任務的前驅過程,如分類,由於事先不知道樣本的類別,我們可以先對樣本進行聚類,根據聚類結果將每個簇(類)定義為一個類別,然後再基於這些類別訓練分類模型,來判別新的樣本。

聚類的兩個基本問題:效能度量距離計算

1.效能度量
   聚類的目的是把相似的樣本聚到一起,而將不相似的樣本分開,類似於“物以類聚”,很直觀的想法是同一個簇中的相似度要儘可能高,而簇與簇之間的相似度要儘可能的低。
   效能度量大概可分為兩類: 一是外部指標, 而是內部指標


   a:外部指標將聚類結果和某個“參考模型”進行比較,
   b:內部指標不利用任何參考模型,直接考察聚類結果。
效能指標公式可參考西瓜書

2.距離計算
  距離度量常用 閔可夫斯基距離, 適用於有序屬性(別的屬性有離散屬性)
  公式中當p=1時,即曼哈頓距離;
     當p=2時,即歐式距離(街區距離);
  對於無序屬性,可用VDM(value difference metric)公式

幾種聚類演算法:
1.K-Means聚類
演算法虛擬碼:

輸入:樣本集D={x1, x2, x3,…,xm},聚類簇數k
輸出:簇劃分C={C1,C2,…,Ck}
從D中隨機選取k個樣本作為初始向量;
repeat:
  初始化所有Ci為空集;
  對於樣本集裡每個樣本x:
   計算x與k個初始向量的距離,選擇距離最小的初始向量的簇標記j作為x的簇標記,將x加入Cj中;
  對於每個簇:
   計算新的均值向量,如果新的均值向量與上一步的不同,則更新;否則保持當前均值向量 不變;
until 當前均值向量均未更新;

2.高斯混合聚類(未看)

3.密度聚類
密度聚類從樣本密度的角度來考察樣本之間的可連線性,基於可連線樣本不斷擴充套件類簇以獲得最終的聚類結果;用一組鄰域引數(d,minPts)來刻畫樣本分佈的緊密程度;
密度聚類涉及幾個重要概念,領域、核心物件、密度直達、密度可達,密度相連
虛擬碼:

輸入:樣本集D, 鄰域引數(d, minPts)
輸出:簇劃分C={C1,C2,…,Ck}
初始核心物件集合A為空集;
對於樣本集中每個樣本x:
  確定樣本x的鄰域,如果鄰域中樣本個數大於等於minPts,則將x加入A;
初始化聚類個數k=0;
初始化未訪問樣本集合B=D;
while A 不為空,do:
  記錄當前未訪問樣本集合 Bold= B;#Bold記錄的是處理當前核心物件前未訪問的集合,B記錄的是處理完當前核心物件後剩下的未訪問集合;
  從A中隨機選一個核心物件y,初始化佇列Q=[y];
  B = B - y;
  while Q 不為空,do:
    取出Q中隊首樣本q;如果q的鄰域中樣本個數大於等於minPts,則求其鄰域與B的交集 I,並加入佇列Q中;B = B - I;
  k = k+1; 生成簇Ck=Bold-B;
  A = A-Ck;

4.層次聚類
  層次聚類試圖在不同的層次對資料集進行劃分,從而形成樹形的聚類結構;可分為“自頂向下”和“自底向上”兩種策略;在層次聚類中,關鍵是如何度量兩個簇的距離,由於簇是一個集合,因此要採用關於集合的某種距離;
  兩個集合的最小距離,定義為兩個集合中最近的樣本點的距離;
  兩個集合的最大距離,定義為兩個集合中最遠的樣本點的距離;
  平均距離,則是兩個集合中所有樣本對的距離的平均值;
演算法虛擬碼:

輸入:樣本集D,有m個樣本;距離度量函式d;聚類簇數k;
輸出:簇劃分C={C1,C2,…,Ck}
對於D中每個樣本Xi:
   Ci = {Xi}
初始化每兩個簇之間的距離矩陣;#是一個對稱矩陣
初始化當前聚類個數q=m;
while q > m, do
  找出距離最近的兩個聚類簇Ci*和Cj*;合併Ci*和Cj*,Ci*=Ci*UCj*;
  將從j*+1到q的簇的編號都減1;
  刪除矩陣中第j*行和j*列;
  for j = 1,2,…,q-1:
    更新Ci*和Cj的距離
  q = q - 1