上個月對一個小項目的效果進行改進,時間緊,只有不到一周的時間,所以思考了一下就用了最簡單的方法來做,效果針對上一版提升了5%左右,跟大家分享一下(項目場景用的類似的場景)
項目場景:分析一個產品的競品,譬如app的競品、網站的競品等等
項目分析:簡單來說就是競品分析,競品分析有很多比較成熟的方法,但是我認為,競品分析其實和推薦有着很大的相關性。譬如我要分析一個技術網站的競品有哪些,通俗點說,就是看一個用戶經常訪問哪些網站、不同類的用戶訪問網站的偏好是什么、在同類技術網站里與之定位想進,用戶人群相似的網站有哪些等等。抽象來看,即可得出兩個關鍵詞:用戶和物品(或者說物品和競品)。這個關鍵詞是不是很熟悉?在推薦里我們經常會遇到item和user之間的相似度,那么競品分析其實也可以同類化於相似度的計算問題。
具體做法:提到相似度計算,會想到很多方法,常見的歐幾里得距離,余弦計算,皮爾遜距離等等,對於不同的距離計算,有不同的適用條件,之前總結過一個關於相似度計算的文章,只不過覺得不是很完善,所以一直沒有發出來。這次做競品分析的時候突然想起了Jaccard相似度。那么Jaccard相似度是什么呢?簡單說下公式:
給定兩個集合A和B,A和B的Jaccard相似度 = |A與B的交集元素個數| / |A與B的並集元素個數|
那么這樣一個公式是來應用到競品分析中的呢?我們假設一個場景:
喜歡博客園的用戶也喜歡瀏覽知乎、CSDN、Github等,喜歡知乎的用戶也喜歡瀏覽Github、InfoQ、V2EX、SegmentDefault、博客園等,假設我們根據瀏覽次數來進行排序,得到兩個集合,那么我們可以簡化為博客園和知乎的競品分別為:
博客園=[知乎、CSDN、Github]
知乎=[Github、InfoQ、V2EX、SegmentDefault、博客園]
此時,第一版計算結果:博客園與知乎的Jaccard相似度為= 1 / 7=0.14
這是最簡單的Jaccard相似度計算,然而我們發現,逛博客園的經常逛知乎,且知乎權重很高,但是他們倆的相似度卻很低,只有0.14,看起來好像並不符合常理,於是,我做了點修改,將需要計算的競品本身也加入集合,即:
博客園=[博客園、知乎、CSDN、Github]
知乎=[知乎、Github、InfoQ、V2EX、SegmentDefault、博客園]
這樣我們再來計算,得到第二版計算結果:博客園與知乎的Jaccard相似度 = 3 / 7 = 0.42
為什么我們要將競品本身考慮進去呢?其實很簡單,以博客園為例,我們的目的是找到博客園的競品,分析出經常瀏覽博客園的用戶還會經常瀏覽哪些同類技術網站,那么博客園的用戶肯定是經常瀏覽博客園的,這點顯而易見,一個物品本身也是自身的競品。將要分析的競品本身加入集合后就可避免我們第一次計算時出現的不符合常識的結果。
但是,還得思考一個問題,博客園對知乎的Jaccard相似度與知乎對博客園的Jaccard相似度應該是一樣的嗎?按照前兩次計算,我們認為是一樣的,因為只是考慮的交集的個數,並沒有考慮集合中元素所處的位置因素。然而實際上,集合中的元素位置其實是有先后之分的,按降序排列,即競品相關度是越來越低的。此時未考慮元素的位置因素似乎也有悖嘗試。舉個例子:一個經常看博客園的用戶,也會經常看知乎,那么一個經常看知乎的用戶是否也代表也會經常看博客園呢?這個結論與我們給出的條件是相悖的:一個經常看知乎的用戶,相比於博客園,更偏好於Github。所以我們得到結論:兩個競品A和B,A對B的重要性不一定等於B對A的重要性。
所以,我們對此進行進一步改進
博客園=[博客園、知乎、CSDN、Github] ====》博客園 = [1.0,0.6,0.3,0.1]
知乎=[知乎、Github、InfoQ、V2EX、SegmentDefault、博客園] ====》知乎 = [1.0,0.55,0.15,0.14,0.11,0.05]
(注:競品本身加入集合我設定權重為1,其他競品元素總分為1)
此時,計算得到第三版計算結果:
博客園對知乎的Jaccard相似度 = ( 兩者交集的權重得分和/ 兩者權重總和 ) * 知乎在博客園集合中所占的權重 = ( 1+0.6+0.1+1+0.55+0.05 / (2+2) )* 0.6 = ( 3.3 /4 )* 0.6 = 0.495
知乎對博客園的Jaccard相似度 = ( 兩者交集的權重得分和/ 兩者權重總和 ) * 博客園在知乎集合中所占的權重 =( 1+0.6+0.1+1+0.55+0.05 / (2+2) )* 0.05 = ( 3.3 /4 )*0.05 = 0.04
由此可得,博客園與知乎的競品相似度是不相同的,也符合常理
總結:一開始我想到了很多方法來做,但是時間緊,又要有效果提升,所以嘗試對最簡單的計算公式做改進達到提升效果的目的,針對每一次計算的結果,結合常識,再來進行一步步改進,最后取得了不錯的效果。其實最后的方案還可以做一些改進,如:如何設定權重,如何設定計算公式、是否可以用線性模型擬合、以及最后乘以的權重如果影響太大,是夠可以改成根據位置進行指數衰減等等,都可以去嘗試,有興趣的也可以去試一試。如果大家有更好的方法,也可以一起討論一下:)