上個月對一個小項目的效果進行改進,時間緊,隻有不到一周的時間,是以思考了一下就用了最簡單的方法來做,效果針對上一版提升了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
由此可得,部落格園與知乎的競品相似度是不相同的,也符合常理
總結:一開始我想到了很多方法來做,但是時間緊,又要有效果提升,是以嘗試對最簡單的計算公式做改進達到提升效果的目的,針對每一次計算的結果,結合常識,再來進行一步步改進,最後取得了不錯的效果。其實最後的方案還可以做一些改進,如:如何設定權重,如何設定計算公式、是否可以用線性模型拟合、以及最後乘以的權重如果影響太大,是夠可以改成根據位置進行指數衰減等等,都可以去嘗試,有興趣的也可以去試一試。如果大家有更好的方法,也可以一起讨論一下:)