如何在聚類時對特徵加權重

kmeans的計算公式,其中n表示特徵的數量,uj表示第j個質心;

如果我們希望對特徵進行加權,基本上開源的工具無法實現,不過其實有一個很簡單的方法可以進行設定,我們只需要對重要的特徵進行乘法計算就可以了。

kmeans之前,一般我們是將所有特徵放縮到0~1之間,類別特徵進行onehot或其他編碼方法,這裡面有兩個嚴重的問題:

1 如果我們人為知道哪些特徵對於聚類更重要,根據現有的演算法實現介面無法對特徵進行賦權,麻煩的做法就是手動修改原始碼;

2 共線性會非常嚴重影響聚類的結果,極端的情況,假設我們的特徵有10位,我們對某個特徵A複製100次,則最終的聚類結果基本上是由特徵A這類高度相似甚至完全相同的特徵決定,如果透過降維的方式來消除共線性,解釋性又會非常差。

但是其實根據距離計算公式,我們可以發現對特徵進行放縮就可以,假設我們有一個矩陣:

feature1 feature2

user1 0。5 0。75

user2 0。3 0。74

假設我們希望feature1的權重為1,feature2的權重為2,則進行0~1標準化之後,我們將feature2的值乘根號2就可以了,這樣在進行歐幾里得距離計算的時候,

如何在聚類時對特徵加權重

feature2對應的歐幾里得計算公式(注意sklearn kmeans是直接用平方沒開根號)的計算結果會增大2倍,從而簡單快速的實現權重的賦權。

如果類別特徵進行embedding之後比如embedding為256維,則我們對embedding的結果進行0~1標準化之後,每個embedding維度都乘以 根號1/256,從而將這個類別全部的距離計算貢獻規約為1,避免embedding size太大使得kmeans的聚類結果非常依賴於embedding這個本質上是單一類別維度的特徵。