最近做用戶畫像,用到了KL散度,發現效果還是不錯的,現跟大家分享一下,為了文章的易讀性,不具體講公式的計算,主要講應用,不過公式也不復雜,具體可以看鏈接。
首先先介紹一下KL散度是啥。KL散度全稱Kullback–Leibler divergence,也稱為相對熵,信息增益,它是度量兩個概率分布P與Q之間差異的一種不對稱度量,可以看做是概率分布P到目標概率Q之間距離。一般情況下,P表示數據的真是分布,Q表示數據的理論分布,也可以理解為影響P分布的一種因素。計算公式為:
DKL(P||Q) =ΣP(i)log(P(i)/Q(i)) (1)
從字面意思來看呢,是一種距離,但是實際上和我們理解的“距離”並不一樣。我們常規理解的距離一般來說有幾點性質:
1.非負:距離是絕對值,非負好理解。
2.對稱:從A到B的距離 = 從B到A的距離
3.勾股定理:兩邊之和大於第三邊
而KL的性質只滿足第一點非負性,不滿足對稱性和勾股定理。
1.非負:當P(x) = Q(x)幾乎處處成立時,才有DKL(P||Q) = 0. 證明可利用詹森不等式
2.非對稱性:根據定義可知,如果要弄成對稱的,可以定義
DSKL(P||Q) = (DKL(P||Q)+DKL(Q||P))/2 (2)
為什么是非對稱的呢,其實很簡單,如果P(i)大,Q(i)小,那么log是一個增函數,P(i)/Q(i) > Q(i)/P(i),則log(P(i)/Q(i)) > log(Q(i)/P(i)),因此DKL(P||Q) > DKL(Q||P),如果想要DKL(P||Q) = DKL(Q||P),那么P(i)大,Q的分布應該盡量和P接近一致,P(i)小,P和Q的差別對KL影響較小。
舉例:
1.假設現在有兩個用戶群體A和B,在“女裝”這個商品類別下面,A和B的消費總金額分別是11W和2W,是不是就能說明A群體相對於B群體就一定更偏好女裝呢?不一定。因為A的人數可能比B的多,如果A和B的人數比例是10:1,那么可能A和B群體對於“女裝的”偏好是一樣的,簡單來算的話,你可以只算人均價格,如果A和B在“女裝”下的人均消費相似,可以說明偏好相同,但是這一點沒有什么理論支撐,我們可以把A和B群體在“女裝”下的消費情況分布作為P(真實分布),A群體和B群體的人數比例作為Q(擬合分布),那么
P= [11/13,2/13] Q =[10/11,1/11]
DKL(P||Q) =Σi=1,2P(i)log(P(i)/Q(i)) = 0.02023101833433108
計算得出KL散度約為0.02,接近0,說明A和B在女裝下的消費情況分布基本相同,即,兩者對“女裝”的偏好並沒有明顯差異,喜歡“女裝”的程度為1:1
貼上KL散度的代碼:
1 #P和Q是兩個概率分布,np.array格式 2 P = np.array() 3 Q = np.array() 4 def KL(P,Q): 5 sum = P*(log(P/Q))#計算KL散度 6 all_value= [x for x in sum if str(x) != 'nan' and str(x)!= 'inf']#除去inf值 7 return np.sum(all_value)#計算總和,要用np.sum,不能直接用sum 8 9 KL(P,Q)#得出KL散度值
具體在用戶畫像里有什么用呢?舉個例子,我在做用戶畫像的時候,根據消費金額,分出了8個用戶群體,這八個群體的人均消費Top10的重疊性很大,很多人都集中在“女裝”,“淑女裝”,“商務休閑”,“運動戶外”等這幾類,看起來沒有什么區分度,只能根據金額的高低來區分這些群體的消費能力,但並不能區分這些群體對某類商品的偏好。在計算了各商品類型下不同群體的消費金額的KL散度后,可以發現,這寫消費比較集中的幾類商品(“女裝”,“淑女裝”,“商務休閑”,“運動戶外”等)的KL散度幾乎等於0,或者0.1等,我取閾值為0.5的話,進行過濾一下,可以提取出對用戶有偏好區分的商品,我做的實際情況中過濾掉了1/3的商品,再根據不同商品類型下的8個用戶群體的消費金額百分比來進行排名,就可以看出各用戶群對商品類型的真是偏好了。
簡單來說,從表格上看,可以看到明顯效果:
圖1是沒有計算KL散度之前的用戶偏好,圖2是計算KL散度之后的用戶偏好。行:用戶群體消費偏好的商品類型 列:8個用戶群體
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |
| 1 | 少女裝 | 少女裝 | 少女 | 淑女裝 | 淑女裝 | 黃金飾品 | 淑女裝 | 少女裝 |
| 2 | 時尚 | 時尚 | 時尚 | 少女裝 | 少女裝 | 少女裝 | 商務休閑 | 時尚 |
| 3 | 黃金飾品 | 淑女裝 | 黃金飾品 | 黃金飾品 | 黃金飾品 | 淑女裝 | 黃金飾品 | 黃金飾品 |
| 4 | 淑女裝 | 黃金飾品 | 淑女裝 | 鑲嵌 | 鑲嵌 | 時尚 | 少女裝 | 商務休閑 |
| 5 | 商務休閑 | 商務休閑 | 商務休閑 | 時尚 | 商務休閑 | 商務休閑 | 鑲嵌 | 淑女裝 |
圖1 原始用戶偏好
|
|
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
| 1 |
護膚 |
玻璃飾品 |
玻璃飾品 |
玉石 |
飾品 |
經典 |
女裝 |
玻璃飾品 |
| 2 |
經典 |
廚具 |
鉑金飾品 |
黃金擺件 |
皮包 |
綜合 |
保健品 |
布藝 |
| 3 |
玩具 |
滋補保健 |
工藝金條 |
文教 |
國際名品 |
雜飾品 |
美健 |
滋補保健 |
| 4 |
彩妝 |
禮品 |
國際流行 |
運動配品 |
禮品 |
女士手袋 |
家居生活 |
香水 |
| 5 |
家居生活 |
嬰童、用品 |
投資金條 |
旅行箱包 |
羽絨 |
女飾品 |
銀飾品 |
陶瓷 |
圖2 計算KL散度后的用戶偏好
從圖2可以很明顯看出,各用戶群體已經有了明顯的偏好了,第一類的用戶群體可能偏好女性護膚,對象可能是18-30歲的時尚愛美女性;第二類用戶群體可能是25-40的居家帶娃女性;第三類用戶群體可能是偏好貴金屬投資的土豪群體;第四類可能是愛好旅游的文藝青年;第五類可能是偏好大牌的富人群體;第六類可能是鍾愛寶寶的白富美;第七類可能是熱愛運動的女青年;第八類可能是熱衷手工和養身的動手達人。(媽呀,編不下去了 = =)
這個粒度還是比較粗的,因為同一個商品類別里面的商品的價格和風格也不一樣,經常買LV的和買coach的人明顯不是一個消費水平的,買coach的和買達芙妮的也不是一個消費水平。如果是以品牌為維度的話,再加上年齡、性別、其他的消費幾率等等,因該就可以很容易看出各類用戶群體的偏好了,這里寫KL散度在用戶畫像中的應用只是一個引子,其實KL散度還有很多其他的應用,例如文檔之間的相似度計算,推薦系統之間的應用等等,具體的怎么應用可以結合實際業務可以把KL散度的價值發揮的更好。
