相似度的本質(zhì)
推薦系統(tǒng)中,推薦算法分為兩個(gè)門(mén)派,一個(gè)是機(jī)器學(xué)習(xí)派,另一個(gè)就是相似度門(mén)派。機(jī)器學(xué)習(xí)派是后起之秀,而相似度派則是泰山北斗,以致?lián)纹饋?lái)推薦系統(tǒng)的半壁江山。
近鄰?fù)扑]顧名思義就是在地理位置上住得近。如果用戶(hù)有個(gè)鄰居,那么社交軟件上把鄰居推薦給他在直觀上就很合理,當(dāng)然,如果鄰居姓王的話(huà),就不要推薦了。
這里說(shuō)的近鄰,并不一定只是在三維空間下的地理位置的近鄰,在任意高維空間都可以找到近鄰,尤其是當(dāng)用戶(hù)和物品的特征維度都很高時(shí),要找到用戶(hù)隔壁的鄰居,就不是那么直觀,需要選擇好用適合的相似度度量辦法。
近鄰?fù)扑]的核心就是相似度計(jì)算方法的選擇,由于近鄰?fù)扑]并沒(méi)有采用最優(yōu)化思路,所以效果通常取決于矩陣的量化方式和相似度的選擇。
相似度,與之配套的還有另一個(gè)概念就是距離,兩者都是用來(lái)量化兩個(gè)物體在高維空間中的親疏程度的,它們是硬幣的兩面。
推薦算法中的相似度門(mén)派,實(shí)際上有這么一個(gè)潛在假設(shè):如果兩個(gè)物體很相似,也就是距離很近,那么這兩個(gè)物體就很容易產(chǎn)生一樣的動(dòng)作。
如果兩篇新聞很相似,那么他們很容易被同一個(gè)人先后點(diǎn)擊閱讀,如果兩個(gè)用戶(hù)很相似,那么他們就很容易點(diǎn)擊同一個(gè)新聞。這種符合直覺(jué)的假設(shè),大部分時(shí)候很奏效。
其實(shí)屬于另一門(mén)派的推薦算法——機(jī)器學(xué)習(xí)中,也有很多算法在某種角度看做是相似度度量。
例如,邏輯回歸或者線(xiàn)性回歸中,一邊是特征向量,另一邊是模型參數(shù)向量,兩者的點(diǎn)積運(yùn)算,就可以看做是相似度計(jì)算,只不過(guò)其中的模型參數(shù)向量值并不是人肉指定的,而是從數(shù)據(jù)中由優(yōu)化算法自動(dòng)總結(jié)出來(lái)的。
在近鄰?fù)扑]中,最常用的相似度是余弦相似度。然而可以選用的相似度并不只是余弦相似度,還有歐氏距離、皮爾遜相關(guān)度、自適應(yīng)的余弦相似度、局部敏感哈希等。使用場(chǎng)景各不相同,今天,我會(huì)分別一一介紹如下。
相似度的計(jì)算方法
數(shù)據(jù)分類(lèi)
在真正開(kāi)始巡視相似度計(jì)算方法前,我先給你把度量對(duì)象做個(gè)簡(jiǎn)單分類(lèi)。相似度計(jì)算對(duì)象是向量,或者叫做高維空間下的坐標(biāo),一個(gè)意思。那表示這個(gè)向量的數(shù)值就有兩種:
- 實(shí)數(shù)值;
- 布爾值,也就是 0 或者 1。
下面介紹的不同計(jì)算方法適用于不同的數(shù)據(jù)種類(lèi)。
1 歐氏距離
歐氏距離,如名字所料,是一個(gè)歐式空間下度量距離的方法。兩個(gè)物體,都在同一個(gè)空間下表示為兩個(gè)點(diǎn),假如叫做 p 和 q,分別都是 n 個(gè)坐標(biāo)。那么歐式距離就是衡量這兩個(gè)點(diǎn)之間的距離,從 p 到 q 移動(dòng)要經(jīng)過(guò)的距離。歐式距離不適合布爾向量之間。
計(jì)算方式可以表示如下,我在文稿中放了一個(gè)公式,你可以點(diǎn)擊查看。

這個(gè)公式就是,每一個(gè)坐標(biāo)上的取值相減,求平方和,最后輸出方根。
顯然,歐式距離得到的值是一個(gè)非負(fù)數(shù),最大值是正無(wú)窮。通常相似度計(jì)算度量結(jié)果希望是[-1,1]或者[0,1]之間,所以歐式距離要么無(wú)法直接使用到這個(gè)場(chǎng)景中,要么需要經(jīng)過(guò)二次轉(zhuǎn)化得到,我在文稿中放了一個(gè)最常用的轉(zhuǎn)化公式,你可以點(diǎn)擊查看。

距離加一后取倒數(shù)。這個(gè)公式能夠把范圍為 0 到正無(wú)窮的歐式距離轉(zhuǎn)換為 0 到 1 的相似度。
歐式距離度量的是空間中兩個(gè)點(diǎn)的絕對(duì)差異,適用于分析用戶(hù)能力模型之間的差異,比如消費(fèi)能力、貢獻(xiàn)內(nèi)容的能力等。
當(dāng)然,雖然歐式距離計(jì)算兩個(gè)點(diǎn)的距離,實(shí)際上,點(diǎn)的坐標(biāo)表示和我們常說(shuō)的向量表示是同一回事,希望這句話(huà)是廢話(huà),你早已懂得。
2 余弦相似度
大名鼎鼎的余弦相似度,度量的是兩個(gè)向量之間的夾角,其實(shí)就是用夾角的余弦值來(lái)度量,所以名字叫余弦相似度。當(dāng)兩個(gè)向量的夾角為 0 度時(shí),余弦值為 1,當(dāng)夾角為 90 度時(shí),余弦值為 0,為 180 度時(shí),余弦值則為 -1。
余弦相似度在度量文本相似度、用戶(hù)相似度、物品相似度的時(shí)候都較為常用;但是在這里需要提醒你一點(diǎn),余弦相似度的特點(diǎn):它與向量的長(zhǎng)度無(wú)關(guān)。因?yàn)橛嘞蚁嗨贫扔?jì)算需要對(duì)向量長(zhǎng)度做歸一化:

經(jīng)過(guò)向量長(zhǎng)度歸一化后的相似度量方式,背后潛藏著這樣一種思想:兩個(gè)向量,只要方向一致,無(wú)論程度強(qiáng)弱,都可以視為“相似”。
這簡(jiǎn)直就是:招聘人才時(shí)只看價(jià)值觀,不考核代碼能力,只要肯干,搬磚嘛,誰(shuí)搬不是搬。這樣做錯(cuò)不錯(cuò)呢?很顯然,有非常大的合理性。
比如,我用 140 字的微博摘要了一篇 5000 字的博客內(nèi)容,兩者得到的文本向量可以認(rèn)為方向一致,詞頻等程度不同,但是余弦相似度仍然認(rèn)為他們是相似的。
在協(xié)同過(guò)濾中,如果選擇余弦相似度,某種程度上更加依賴(lài)兩個(gè)物品的共同評(píng)價(jià)用戶(hù)數(shù),而不是用戶(hù)給予的評(píng)分多少。這就是由于余弦相似度被向量長(zhǎng)度歸一化后的結(jié)果。
余弦相似度對(duì)絕對(duì)值大小不敏感這件事,在某些應(yīng)用上仍然有些問(wèn)題。
舉個(gè)小例子,用戶(hù) A 對(duì)兩部電影評(píng)分分別是 1 分和 2 分,用戶(hù) B 對(duì)同樣這兩部電影評(píng)分是 4 分和 5 分。用余弦相似度計(jì)算出來(lái),兩個(gè)用戶(hù)的相似度達(dá)到 0.98。這和實(shí)際直覺(jué)不符,用戶(hù) A 明顯不喜歡這兩部電影。
針對(duì)這個(gè)問(wèn)題,對(duì)余弦相似度有個(gè)改進(jìn),改進(jìn)的算法叫做調(diào)整的余弦相似度(Adjusted Cosine Similarity)。調(diào)整的方法很簡(jiǎn)單,就是先計(jì)算向量每個(gè)維度上的均值,然后每個(gè)向量在各個(gè)維度上都減去均值后,再計(jì)算余弦相似度。
前面這個(gè)小例子,用調(diào)整的余弦相似度計(jì)算得到的相似度是 -0.1,呈現(xiàn)出兩個(gè)用戶(hù)口味相反,和直覺(jué)相符。
3 皮爾遜相關(guān)度
皮爾遜相關(guān)度,實(shí)際上也是一種余弦相似度,不過(guò)先對(duì)向量做了中心化,向量 p 和 q 各自減去向量的均值后,再計(jì)算余弦相似度。

皮爾遜相關(guān)度計(jì)算結(jié)果范圍在 -1 到 1。-1 表示負(fù)相關(guān),1 比表示正相關(guān)。皮爾遜相關(guān)度其實(shí)度量的是兩個(gè)隨機(jī)變量是不是在同增同減。
如果同時(shí)對(duì)兩個(gè)隨機(jī)變量采樣,當(dāng)其中一個(gè)得到較大的值另一也較大,其中一個(gè)較小時(shí)另一個(gè)也較小時(shí),這就是正相關(guān),計(jì)算出來(lái)的相關(guān)度就接近 1,這種情況屬于沆瀣一氣,反之就接近 -1。
由于皮爾遜相關(guān)度度量的時(shí)兩個(gè)變量的變化趨勢(shì)是否一致,所以不適合用作計(jì)算布爾值向量之間相關(guān)度,因?yàn)閮蓚€(gè)布爾向量也就是對(duì)應(yīng)兩個(gè) 0-1 分布的隨機(jī)變量,這樣的隨機(jī)變量變化只有有限的兩個(gè)取值,根本沒(méi)有“變化趨勢(shì),高低起伏”這一說(shuō)。
4 杰卡德(Jaccard)相似度
杰卡德相似度,是兩個(gè)集合的交集元素個(gè)數(shù)在并集中所占的比例。由于集合非常適用于布爾向量表示,所以杰卡德相似度簡(jiǎn)直就是為布爾值向量私人定做的。對(duì)應(yīng)的計(jì)算方式是:
- 分子是兩個(gè)布爾向量做點(diǎn)積計(jì)算,得到的就是交集元素個(gè)數(shù);
- 分母是兩個(gè)布爾向量做或運(yùn)算,再求元素和。
余弦相似度適用于評(píng)分?jǐn)?shù)據(jù),杰卡德相似度適合用于隱式反饋數(shù)據(jù)。例如,使用用戶(hù)的收藏行為,計(jì)算用戶(hù)之間的相似度,杰卡德相似度就適合來(lái)承擔(dān)這個(gè)任務(wù)。
總結(jié)
今天,我介紹了常用的幾種相似度計(jì)算方法,以及其各自的使用場(chǎng)景。
這里的場(chǎng)景是按照數(shù)據(jù)形式劃分的,按照向量維度取值是否是布爾值來(lái)看,杰卡德相似度就只適合布爾值向量,余弦相似度彈性略大,適合兩種向量。歐式距離度量的是絕對(duì)差異,余弦相似度度量的是方向差異,但是調(diào)整的余弦相似度則可以避免這個(gè)弱點(diǎn)。
現(xiàn)在留給你一個(gè)問(wèn)題:如果在一個(gè)社交網(wǎng)絡(luò)中,要計(jì)算好友的相似度,你會(huì)選擇哪種相似度來(lái)做?
