常用的相似性度量算法(原理箱沦,實(shí)現(xiàn),優(yōu)缺點(diǎn)雇庙,適用場景) 更新ing

對相似性算法的了解起源于最近在做使用協(xié)同過濾原理的推薦系統(tǒng)中谓形,基于鄰域的推薦算法(User-Based CF和 和 Item-Based CF)需要估算不同樣本之間的相似性度量(Similarity Measurement),這也是機(jī)器學(xué)習(xí)中在做分類的時候的一個常見場景状共。

相似度通常采用的方法就是計(jì)算樣本間的“距離”(Distance)套耕。采用什么樣的方法計(jì)算距離是很講究,甚至關(guān)系到分類的正確與否峡继。

本文的目的在于對當(dāng)下常見的相似度度量方法的原理冯袍,實(shí)現(xiàn),優(yōu)缺點(diǎn),改進(jìn)版本康愤,適用場景等幾個方面做一個總結(jié)

一儡循、歐氏距離(EuclideanDistance)

歐氏距離歐幾里得距離的簡稱,是最易于理解的一種距離計(jì)算方法征冷,其實(shí)就是空間中兩點(diǎn)間的距離公式择膝。

  1. 二維平面上兩點(diǎn)a(x1,y1)與b(x2,y2)間的歐氏距離(拓展到n維同理)


  1. 兩個n維向量a(x11,x12,…,x1n)與 b(x21,x22,…,x2n)間的歐氏距離


  2. 向量運(yùn)算的形式:


  3. 就其意義而言,歐氏距離越小检激,兩個用戶相似度就越大肴捉,歐氏距離越大,兩個用戶相似度就越小叔收。而在日常使用中齿穗,一般習(xí)慣于將相似度與1類比,對越相似的人給出越大的值饺律,相似度在數(shù)值上反映為0<=sim_distance(x,y)<=1窃页,越接近1,相似度越高复濒。所以我們需要進(jìn)行歸一化處理脖卖,可以通過將其函數(shù)值加1(避免除以0),并取其倒數(shù)的方法來構(gòu)造歐幾里得相似度函數(shù):

  4. 用 python實(shí)現(xiàn)計(jì)算歐幾里得距離巧颈,并構(gòu)造相似度函數(shù):

# @Author  : XZP
# @Email   : pcxzp@live.com
# @File    : EuclideanDistanceSimilarity.py

from math import sqrt

# 找到二者相同評分項(xiàng)
def get_same_Item(prefs, person1, person2):
    si = {}
    for item in prefs[person1]:
        if item in prefs[person2]:
            si[item] = 1
    return si

# 歐幾里得相似度算法
def sim_euclid(prefs, p1, p2):
    si = get_same_Item(prefs, p1, p2)
    if len(si) == 0:
        return 0
    sum_of_squares = sum([pow(prefs[p1][item] - prefs[p2][item], 2) for item in si])
    return 1 / (1 + sqrt(sum_of_squares))

if __name__ == '__main__':
    critics = {'Lisa Rose': {'Lady in the Water': 2.5, 'Snakes on a Plane': 3.5,
                             'Just My Luck': 3.0, 'Superman Returns': 3.5, 'You, Me and Dupree': 2.5,
                             'The Night Listener': 3.0},
               'Gene Seymour': {'Lady in the Water': 3.0, 'Snakes on a Plane': 3.5,
                                'Just My Luck': 1.5, 'Superman Returns': 5.0, 'The Night Listener': 3.0,
                                'You, Me and Dupree': 3.5}}

    print(sim_euclid(critics, 'Lisa Rose', 'Gene Seymour')) # 0.29429805508554946
  1. 缺點(diǎn):當(dāng)數(shù)據(jù)集出現(xiàn)異常值(即數(shù)據(jù)不是很規(guī)范)的時候畦木,歐幾里德距離表現(xiàn)不"穩(wěn)定",另除了異常值外砸泛,當(dāng)這種情況:例如A馋劈、B明明都喜歡這個電影,品味相似晾嘶,但是B對電影的評分向來比較苛刻(評分都不太高)妓雾,所以導(dǎo)致這時候用歐氏距離得出二者不相似的結(jié)論,這顯然不是我們所期望的結(jié)果垒迂。

二械姻、標(biāo)準(zhǔn)化歐氏距離

三、曼哈頓距離

四机断、切比雪夫距離

五楷拳、 夾角余弦距離

如果高中正常畢業(yè), 參加過高考, 那么肯定會這么一個公式

cos<a, b> = a ? b / |a|?|b|

假設(shè)

a = (3, 1, 0),
b =  (2, -1, 2)

分子是a,b兩個向量的內(nèi)積, (3, 1, 0) ? (2, -1, 2) = 3?2 + 1?(-1) + 0?2 = 5
分母是兩個向量模(模指的是向量的長度)的乘積.

總之這個cos的計(jì)算不要太簡單

余弦距離(余弦相似度), 計(jì)算的是兩個向量在空間中的夾角大小, 值域?yàn)?code>[-1, 1]:
1代表夾角為, 完全重疊/完全相似;
-1代表夾角為180°, 完全相反方向/毫不相似.

余弦相似度的問題是: 其計(jì)算嚴(yán)格要求"兩個向量必須所有維度上都有數(shù)值", 比如:

v1 = (1, 2, 4), 
v2 = (3, -1, null), 

那么這兩個向量由于v2中第三個維度有null, 無法進(jìn)行計(jì)算.

然而, 實(shí)際我們做數(shù)據(jù)挖掘的過程中, 向量在某個維度的值常常是缺失的, 比如

v2=(3, -1, null)

v2數(shù)據(jù)采集或者保存中缺少一個維度的信息, 只有兩個維度.

那么, 我們一個很樸素的想法就是, 我們在這個地方填充一個值, 不就滿足了"兩個向量必須所有維度上都有數(shù)值"的嚴(yán)格要求了嗎?

在填充值的時候, 一般我們用這個向量已有數(shù)據(jù)的平均值, 所以v2填充后變成

v2=(3, -1, 2), 

接下來我們就可以計(jì)算cos<v1, v2>了.(由此引出皮爾遜距離)

七吏奸、皮爾遜相關(guān)系數(shù)

皮爾遜相關(guān)系數(shù)(Pearson Correlation Coefficient)是余弦相似度在維度值缺失情況下的一種改進(jìn)

  1. 首先我們來看皮爾森相似度的公式:
    假設(shè)有兩個變量X欢揖、Y,那么兩變量間的皮爾遜相關(guān)系數(shù)可通過以下公式計(jì)算:
    公式一:



    公式二:



    公式三:

    公式四:

以上列出的四個公式等價(jià)奋蔚,其中E是數(shù)學(xué)期望她混,cov表示協(xié)方差烈钞,N表示變量取值的個數(shù)。

  1. 再來看皮爾遜相關(guān)系數(shù)的思路:皮爾遜是比歐幾里德距離更加復(fù)雜的可以判斷人們興趣相似度的一種方法坤按。該相關(guān)系數(shù)通過將兩組數(shù)據(jù)與某一直線擬合的思想來求值毯欣,該值實(shí)際上就為該直線的斜率。其斜率的區(qū)間在[-1,1]之間臭脓,其絕對值的大小反映了兩者相似度大小酗钞,斜率越大,相似度越大来累,當(dāng)相似度為1時砚作,該直線為一條對角線。
    也被稱為“最佳擬合線”
  1. 再從余弦相似度的層面來理解皮爾遜相關(guān)系數(shù)嘹锁,我把這些null的維度都填上0, 然后讓所有其他維度減去這個向量各維度的平均值, 這樣的操作叫作中心化偎巢。中心化之后所有維度的平均值就是0了(妙哇!), 也滿足進(jìn)行余弦計(jì)算的要求. 然后再進(jìn)行我們的余弦計(jì)算得到結(jié)果. 這樣先中心化再余弦計(jì)得到的相關(guān)系數(shù)叫作皮爾遜相關(guān)系數(shù).由此再看計(jì)算皮爾遜相關(guān)系數(shù)的公式就明了了兼耀。

  2. 用 python實(shí)現(xiàn)計(jì)算皮爾森相似度:

# @Author  : XZP
# @Email   : pcxzp@live.com
# @File    : PersonSimilarity.py

from math import sqrt  
  
def sim_pearson(prefs, p1, p2):
    # Get the list of mutually rated items
    si = get_same_Item(prefs, p1, p2)
    n = len(si)

    # if they are no ratings in common, return 0
    if n == 0:
        return 0

    # Sums of all the preferences
    sum_x = sum([prefs[p1][it] for it in si])
    sum_y = sum([prefs[p2][it] for it in si])

    sum_x2 = sum([pow(prefs[p1][it], 2) for it in si])
    sum_y2 = sum([pow(prefs[p2][it], 2) for it in si])

    sum_xy = sum([prefs[p1][it] * prefs[p2][it] for it in si])

    # 計(jì)算系數(shù)
    num = sum_xy - (sum_x * sum_y / n)
    den = sqrt((sum_x2 - pow(sum_x, 2) / n) * (sum_y2 - pow(sum_y, 2) / n))
    if den == 0:
        return 0

    r = num / den

    return r

總結(jié): 皮爾遜系數(shù)就是cos計(jì)算之前兩個向量都先進(jìn)行中心化(centered),余弦計(jì)算和皮爾遜相關(guān)系數(shù)計(jì)算就是一個東西兩個名字啊

  1. 優(yōu)點(diǎn):
  • 它在數(shù)據(jù)不是很規(guī)范的時候求冷,會傾向于給出更好的結(jié)果瘤运。
  • 修正了“夸大分值”的情況:二者有相對近似的偏好,但某人一般傾向于給出更高的分值匠题,而二者的分值之差又始終保持一致拯坟,則他們依然可能會存在很好的相關(guān)性(單純的用歐幾里得距離,相似度會偏低韭山,得出不相關(guān)的結(jié)論郁季,這顯然不是我們所期望的。)

八钱磅、漢明距離

pass

九梦裂、總結(jié)

其實(shí)你會發(fā)現(xiàn),選擇不同的相似性度量方法盖淡,對結(jié)果的影響是微乎其微的年柠。 ——《集體智慧編程》

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市褪迟,隨后出現(xiàn)的幾起案子冗恨,更是在濱河造成了極大的恐慌,老刑警劉巖味赃,帶你破解...
    沈念sama閱讀 211,348評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件掀抹,死亡現(xiàn)場離奇詭異,居然都是意外死亡心俗,警方通過查閱死者的電腦和手機(jī)傲武,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人谱轨,你說我怎么就攤上這事戒幔。” “怎么了土童?”我有些...
    開封第一講書人閱讀 156,936評論 0 347
  • 文/不壞的土叔 我叫張陵诗茎,是天一觀的道長。 經(jīng)常有香客問我献汗,道長敢订,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,427評論 1 283
  • 正文 為了忘掉前任罢吃,我火速辦了婚禮楚午,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘尿招。我一直安慰自己矾柜,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,467評論 6 385
  • 文/花漫 我一把揭開白布就谜。 她就那樣靜靜地躺著怪蔑,像睡著了一般。 火紅的嫁衣襯著肌膚如雪丧荐。 梳的紋絲不亂的頭發(fā)上缆瓣,一...
    開封第一講書人閱讀 49,785評論 1 290
  • 那天,我揣著相機(jī)與錄音虹统,去河邊找鬼弓坞。 笑死,一個胖子當(dāng)著我的面吹牛车荔,可吹牛的內(nèi)容都是我干的渡冻。 我是一名探鬼主播,決...
    沈念sama閱讀 38,931評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼忧便,長吁一口氣:“原來是場噩夢啊……” “哼菩帝!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起茬腿,我...
    開封第一講書人閱讀 37,696評論 0 266
  • 序言:老撾萬榮一對情侶失蹤呼奢,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后切平,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體握础,經(jīng)...
    沈念sama閱讀 44,141評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,483評論 2 327
  • 正文 我和宋清朗相戀三年悴品,在試婚紗的時候發(fā)現(xiàn)自己被綠了禀综。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片简烘。...
    茶點(diǎn)故事閱讀 38,625評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖定枷,靈堂內(nèi)的尸體忽然破棺而出孤澎,到底是詐尸還是另有隱情,我是刑警寧澤欠窒,帶...
    沈念sama閱讀 34,291評論 4 329
  • 正文 年R本政府宣布覆旭,位于F島的核電站,受9級特大地震影響岖妄,放射性物質(zhì)發(fā)生泄漏型将。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,892評論 3 312
  • 文/蒙蒙 一荐虐、第九天 我趴在偏房一處隱蔽的房頂上張望七兜。 院中可真熱鬧,春花似錦福扬、人聲如沸腕铸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽狠裹。三九已至,卻和暖如春亚茬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背浓恳。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工刹缝, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人颈将。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓梢夯,卻偏偏與公主長得像,于是被迫代替她去往敵國和親晴圾。 傳聞我的和親對象是個殘疾皇子颂砸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,492評論 2 348

推薦閱讀更多精彩內(nèi)容