讀古今文學網 > 機器學習實戰 > 10.2 使用後處理來提高聚類性能 >

10.2 使用後處理來提高聚類性能

前面提到,在k均值聚類中簇的數目k是一個用戶預先定義的參數,那麼用戶如何才能知道k的選擇是否正確?如何才能知道生成的簇比較好呢?在包含簇分配結果的矩陣中保存著每個點的誤差,即該點到簇質心的距離平方值。下面會討論利用該誤差來評價聚類質量的方法。

考慮圖10-2中的聚類結果,這是在一個包含三個簇的數據集上運行k均值算法之後的結果,但是點的簇分配結果值沒有那麼準確。k均值算法收斂但聚類效果較差的原因是,k均值算法收斂到了局部最小值,而非全局最小值(局部最小值指結果還可以但並非最好結果,全局最小值是可能的最好結果)。

圖10-2 由於質心隨機初始化導致k均值算法效果不好的一個例子,這需要額外的後處理操作來清理聚類結果

一種用於度量聚類效果的指標是SSE(Sum of Squared Error,誤差平方和),對應程序清單10-2中clusterAssment矩陣的第一列之和。SSE值越小表示數據點越接近於它們的質心,聚類效果也越好。因為對誤差取了平方,因此更加重視那些遠離中心的點。一種肯定可以降低SSE值的方法是增加簇的個數,但這違背了聚類的目標。聚類的目標是在保持簇數目不變的情況下提高簇的質量。

那麼如何對圖10-2的結果進行改進?你可以對生成的簇進行後處理,一種方法是將具有最大SSE值的簇劃分成兩個簇。具體實現時可以將最大簇包含的點過濾出來並在這些點上運行k均值算法,其中的k設為2。

為了保持簇總數不變,可以將某兩個簇進行合併。從圖10-2中很明顯就可以看出,應該將圖下部兩個出錯的簇質心進行合併。可以很容易對二維數據上的聚類進行可視化,但是如果遇到40維的數據應該如何去做?

有兩種可以量化的辦法:合併最近的質心,或者合併兩個使得SSE增幅最小的質心。第一種思路通過計算所有質心之間的距離,然後合併距離最近的兩個點來實現。第二種方法需要合併兩個簇然後計算總SSE值。必須在所有可能的兩個簇上重複上述處理過程,直到找到合併最佳的兩個簇為止。接下來將討論利用上述簇劃分技術得到更好的聚類結果的方法。