kmeans是最簡單的聚類演算法之一,但是運用十分廣泛。最近在工作中也經常遇到這個演算法。kmeans一般在資料分析前期使用,選取適當的k,將資料分類後,然後分類研究不同聚類下資料的特點。
kmeans的計算方法如下:
1.隨機選取k個中心點 2.遍歷所有資料,將每個資料劃分到最近的中心點中 3.計算每個聚類的平均值,並作為新的中心點 4.重複2-3,直到這k個中線點不再變化(收斂了),或執行了足夠多的迭代
時間複雜度:o(inkm) 空間複雜度:o(nm)
其中m為每個元素字段個數,n為資料量,i為迭代個數。一般i,k,m均可認為是常量,所以時間和空間複雜度可以簡化為o(n),即線性的。
從kmeans的演算法可以發現,sse其實是乙個嚴格的座標下降(coordinate decendet)過程。設目標函式sse。
kmeans的每一次迭代過程一樣。所以,這樣保證sse每一次迭代時,都會減小,最終使sse收斂。
由於sse是乙個非凸函式(non-convex function),所以sse不能保證找到全域性最優解,只能確保區域性最優解。但是可以重複執行幾次kmeans,選取sse最小的一次作為最終的聚類結果。
輪廓係數(silhouette coefficient)結合了聚類的凝聚度(cohesion)和分離度(separation),用於評估聚類的效果。該值處於-1~1之間,值越大,表示聚類效果越好。具體計算方法如下:
對於第i個元素x_i,計算x_i與其同乙個簇內的所有其他元素距離的平均值,記作a_i,用於量化簇內的凝聚度。
選取x_i外的乙個簇b,計算x_i與b中所有點的平均距離,遍歷所有其他簇,找到最近的這個平均距離,記作b_i,用於量化簇之間分離度。
對於元素x_i,輪廓係數s_i = (b_i – a_i)/max(a_i,b_i)
計算所有x的輪廓係數,求出平均值即為當前聚類的整體輪廓係數 從上面的公式,不難發現若s_i小於0,說明x_i與其簇內元素的平均距離小於最近的其他簇,表示聚類效果不好。如果a_i趨於0,或者b_i足夠大,那麼s_i趨近與1,說明聚類效果比較好。
在實際應用中,由於kmean一般作為資料預處理,或者用於輔助分類貼標籤。所以k一般不會設定很大。可以通過列舉,令k從2到乙個固定值如10,在每個k值上重複執行數次kmeans(避免區域性最優解),並計算當前k的平均輪廓係數,最後選取輪廓係數最大的值對應的k作為最終的集群數目。
如何選擇K Means中K的值
k means需要設定乙個簇心個數的引數,現實中,最常用於確定k數的方法,其實還是人手工設定。例如,當我們決定將衣服做成幾個碼的時候,其實就是在以 人的衣服的長和寬為為特徵進行聚類。所以,弄清楚我們更在意的是什麼,能夠 引導選擇更合適的k值。有種方法能自動決定k值,也就是所謂的elbow metho...
機器學習 K means如何選擇k值?
k means聚類是我們在無監督學習中常用的一種演算法,但有乙個很讓人頭疼的問題就是如何選擇k值。在實際業務中,如果根據業務場景明確知道要得到的類數,那就好辦了,但很多時候不知道k怎麼辦呢?下面有三種方法可以用來確定k值,其基本思想還是最小化類內距離,最大化類間距離,使同一簇內樣本盡可能相似,不同簇...
kmeans聚類選擇最優K值python實現
kmeans演算法中k值的確定是很重要的。下面利用python中sklearn模組進行資料聚類的k值選擇 資料集自製資料集,格式如下 手肘法 手肘法的核心指標是sse sum of the squared errors,誤差平方和 其中,ci是第i個簇,p是ci中的樣本點,mi是ci的質心 ci中所...