市場內分門別類的產品 原則上 K-means分群 是 EM算法 (expectation-maximization algorithm) 的一個特例,相較於EM從似然函數 (likelihood) 的方式出發並導出不同資料點對不同群 (或稱聚類、簇,cluster) 的貢獻度,K-means單純用歐氏距離來分類,雖然這加快了K-means算法的計算效率,但顯然的這麼naïve的方法會產生明顯的缺陷。但仍讓我們會先從簡單的K-means開始,並探討K-means算法的結果在某些情況下和人類肉眼辨識的結論會產生明顯的歧義,接著再推進到通用的EM算法,除了 python 的demo外,我也會證明在數學上如何從EM得到K-means的極限 (僅限高斯混合的情況),而在這個part內,讓我們先從數學理論的角度來面。 一、K-means分群 今天如果我有一大坨資料共120個點如圖1所示,從資料的散佈趨勢來看,很明顯的分成兩群,那我們是不是可以有一個演算法來自動化將資料點如同我們臆測的一樣分成兩袋?一個最簡單的發法便是使用K-means分群,而這個大寫K表示群的數量,以圖1而言,我們猜測K=2,所以是個2-means分群問題。 圖1. 資料散佈圖 (普魯士藍) 與初始化的紅綠兩點 所以為了達成分群,我們需要先初始化兩個點,這兩個點代表兩群的中心。事實上,初始化的位置不必要一定剛好在兩群的中心,可以是任意挑選的地方,但為了計算方便,我們會將起始化的兩點開始在靠近資料點的平均值附近,如同圖1中紅綠兩點。我們將這兩個初始化的點叫作\(p_k\)其中\(k=1,2\)表示第\(k\)群。另外將資料點的集合用\(\mathbf{D}=\{d_1,d_2\cdots d_n \cdots d_{120}\}\)表示,所以我們計算每個點\(d_n=(x_{d_n},y_{d_n})\)和\(p_k=(x_{p_k},y_{p_k})\)的歐氏距離 \[ \ell_{n,k}=\sqrt{(x_{d_n}-x_{p_k})^2+(y_{d_n}-y_{p_k})^2}. \tag{1} \] 若該點和\(p_1\)的距離小於和\(p_2\)的距離 (\(\ell_{n,1}<\ell_{n,2}\)),則我們說\(d_n\)比較靠近\(p_1\)且應該
留言
張貼留言