您好,登錄后才能下訂單哦!
這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)?lái)有關(guān)怎樣正確使用K均值聚類,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
聚類算法中的第一門(mén)課往往是K均值聚類(K-means),因?yàn)槠浜?jiǎn)單高效。本文主要談幾點(diǎn)初學(xué)者在使用K均值聚類時(shí)需要注意的地方。
1. 輸入數(shù)據(jù)一般需要做縮放,如標(biāo)準(zhǔn)化。原因很簡(jiǎn)單,K均值是建立在距離度量上的,因此不同變量間如果維度差別過(guò)大,可能會(huì)造成少數(shù)變量“施加了過(guò)高的影響而造成壟斷”。
2. 如果輸入數(shù)據(jù)的變量類型不同,部分是數(shù)值型(numerical),部分是分類變量(categorical),需要做特別處理。方法1是將分類變量轉(zhuǎn)化為數(shù)值型,但缺點(diǎn)在于如果使用獨(dú)熱編碼(one hot encoding)可能會(huì)導(dǎo)致數(shù)據(jù)維度大幅度上升,如果使用標(biāo)簽編碼(label encoding)無(wú)法很好的處理數(shù)據(jù)中的順序(order)。方法2是對(duì)于數(shù)值型變量和分類變量分開(kāi)處理,并將結(jié)果結(jié)合起來(lái),具體可以參考Python的實(shí)現(xiàn)[1],如K-mode和K-prototype。
3. 輸出結(jié)果非固定,多次運(yùn)行結(jié)果可能不同。首先要意識(shí)到K-means中是有隨機(jī)性的,從初始化到收斂結(jié)果往往不同。一種看法是強(qiáng)行固定隨機(jī)性,比如設(shè)定sklearn中的random state為固定值。另一種看法是,如果你的K均值結(jié)果總在大幅度變化,比如不同簇中的數(shù)據(jù)量在多次運(yùn)行中變化很大,那么K均值不適合你的數(shù)據(jù),不要試圖穩(wěn)定結(jié)果 [2]。
我個(gè)人傾向于后者的看法,K均值雖然易懂,但效果一般,如果多次運(yùn)行的結(jié)果都不穩(wěn)定,不建議使用K均值。我做了一個(gè)簡(jiǎn)單的實(shí)驗(yàn),用K均值對(duì)某數(shù)據(jù)進(jìn)行了5次聚類:
km = MiniBatchKMeans(n_clusters=5)for i in range(5): labels = km.fit_predict(seg_df_norm) label_dist = np.bincount(labels)/seg_df_norm.shape[0]*100 print(label_dist)
打印出每次簇中的數(shù)據(jù)量占比如下,可以看出幾次運(yùn)行中每次簇中的數(shù)據(jù)比例都有很大差別。此處我們明白順序可以是隨機(jī)的,但占比應(yīng)該是相對(duì)固定的,因此K均值不適合當(dāng)前數(shù)據(jù)集。
[ 24.6071 5.414 25.4877 26.7451 17.7461][ 54.3728 19.0836 0.1314 26.3133 0.0988][ 12.9951 52.5879 4.6576 15.6268 14.1325][ 19.4527 44.2054 7.5121 24.9078 3.9221][ 21.3046 49.9233 2.1886 15.2255 11.358 ]
4. 運(yùn)行時(shí)間往往可以得到優(yōu)化,選擇最優(yōu)的工具庫(kù)。基本上現(xiàn)在的K均值實(shí)現(xiàn)都是K-means++,速度都不錯(cuò)。但當(dāng)數(shù)據(jù)量過(guò)大時(shí),依然可以使用其他方法,如MiniBatchKMeans [3]。上百萬(wàn)個(gè)數(shù)據(jù)點(diǎn)往往可以在數(shù)秒鐘內(nèi)完成聚類,推薦Sklearn的實(shí)現(xiàn)。
5. 高維數(shù)據(jù)上的有效性有限。建立在距離度量上的算法一般都有類似的問(wèn)題,那就是在高維空間中距離的意義有了變化,且并非所有維度都有意義。這種情況下,K均值的結(jié)果往往不好,而通過(guò)劃分子空間的算法(sub-spacing method)效果可能更好。
6. 運(yùn)行效率與性能之間的取舍。但數(shù)據(jù)量上升到一定程度時(shí),如>10萬(wàn)條數(shù)據(jù),那么很多算法都不能使用。最近讀到的一篇對(duì)比不同算法性能隨數(shù)據(jù)量的變化很有意思 [4]。在作者的數(shù)據(jù)集上,當(dāng)數(shù)據(jù)量超過(guò)一定程度時(shí)僅K均值和HDBSCAN可用。
作者還做了下圖以供參考對(duì)比。在他的實(shí)驗(yàn)中大部分算法如果超過(guò)了10萬(wàn)條數(shù)據(jù)后等待時(shí)長(zhǎng)就變得很高,可能會(huì)需要連夜運(yùn)行。在我的實(shí)驗(yàn)中,還會(huì)發(fā)現(xiàn)不少算法(SpectralClustering,AgglomerativeClustering等)面臨內(nèi)存不夠的問(wèn)題(memory error)。
File "C:\Users\xyz\AppData\Local\Continuum\anaconda3\lib\site-packages\scipy\spatial\distance.py", line 1652, in pdist dm = np.empty((m * (m - 1)) // 2, dtype=np.double) MemoryError
因此不難看出,K均值算法最大的優(yōu)點(diǎn)就是運(yùn)行速度快,能夠處理的數(shù)據(jù)量大,且易于理解。但缺點(diǎn)也很明顯,就是算法性能有限,在高維上可能不是最佳選項(xiàng)。
一個(gè)比較粗淺的結(jié)論是,在數(shù)據(jù)量不大時(shí),可以優(yōu)先嘗試其他算法。當(dāng)數(shù)據(jù)量過(guò)大時(shí),可以試試HDBSCAN。僅當(dāng)數(shù)據(jù)量巨大,且無(wú)法降維或者降低數(shù)量時(shí),再嘗試使用K均值。
一個(gè)顯著的問(wèn)題信號(hào)是,如果多次運(yùn)行K均值的結(jié)果都有很大差異,那么有很高的概率K均值不適合當(dāng)前數(shù)據(jù),要對(duì)結(jié)果謹(jǐn)慎的分析。
上述就是小編為大家分享的怎樣正確使用K均值聚類了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。