常用的相似性度量算法(原理,實現,優缺點,適用場景...

2021-01-09 浮生偷閒

內容導讀

對相似性算法的了解起源於最近在做 使用協同過濾原理 的推薦系統中, 基於鄰域的推薦算法 (User-Based CF和 和 Item-Based CF)需要估算不同樣本之間的 相似性度量(Similarity Measurement) ,這也是機器學習中在做 分類 的時候的一個常見場景。而 相似度 通常採用的方法就是計算樣本間的 「距離」(Distance) 。採用什麼樣的方法計算距離是很講究,甚至關係到分類的正確與否。缺點: 當數據集出現異常值(即數據不是很規範)的時候,歐幾裡德距離表現不"穩定" ,另除了異常值外,當這種情況:例如A、B明明都喜歡這個電影,品味相似,但是B對電影的評分向來比較苛刻(評分都不太高),所以導致這時候用歐氏距離得出二者不相似的結論,這顯然不是我們所期望的結果。修正了 「誇大分值」 的情況:二者有相對近似的偏好,但某人一般傾向於給出更高的分值,而二者的分值之差又始終保持一致,則他們依然可能會存在很好的相關性(單純的用歐幾裡得距離,相似度會偏低,得出不相關的結論,這顯然不是我們所期望的。其實你會發現,選擇不同的相似性度量方法,對結果的影響是微乎其微的。

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

而相似度通常採用的方法就是計算樣本間的「距離」(Distance)。採用什麼樣的方法計算距離是很講究,甚至關係到分類的正確與否。

本文的目的在於對當下常見的相似度度量方法的原理,實現,優缺點,改進版本,適用場景等幾個方面做一個總結

一、歐氏距離(EuclideanDistance)

歐氏距離是歐幾裡得距離的簡稱,是最易於理解的一種距離計算方法,其實就是空間中兩點間的距離公式。

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

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

向量運算的形式:

就其意義而言,歐氏距離越小,兩個用戶相似度就越大,歐氏距離越大,兩個用戶相似度就越小。而在日常使用中,一般習慣於將相似度與1類比,對越相似的人給出越大的值,相似度在數值上反映為0

用 python實現計算歐幾裡得距離,並構造相似度函數:

# @Author : XZP# @Email : pcxzp@live.com# @File : EuclideanDistanceSimilarity.pyfrom math import sqrt# 找到二者相同評分項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

缺點:當數據集出現異常值(即數據不是很規範)的時候,歐幾裡德距離表現不"穩定",另除了異常值外,當這種情況:例如A、B明明都喜歡這個電影,品味相似,但是B對電影的評分向來比較苛刻(評分都不太高),所以導致這時候用歐氏距離得出二者不相似的結論,這顯然不是我們所期望的結果。

二、標準化歐氏距離

三、曼哈頓距離

四、切比雪夫距離

五、 夾角餘弦距離

如果高中正常畢業, 參加過高考, 那麼肯定會這麼一個公式

cos = a b / |a||b|

假設

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

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

總之這個cos的計算不要太簡單

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

餘弦相似度的問題是: 其計算嚴格要求"兩個向量必須所有維度上都有數值", 比如:

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

那麼這兩個向量由於v2中第三個維度有null, 無法進行計算.

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

v2=(3, -1, null)

v2數據採集或者保存中缺少一個維度的信息, 只有兩個維度.

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

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

v2=(3, -1, 2),

接下來我們就可以計算cos了.(由此引出皮爾遜距離)

七、皮爾遜相關係數

皮爾遜相關係數(Pearson Correlation Coefficient)是餘弦相似度在維度值缺失情況下的一種改進

首先我們來看皮爾森相似度的公式:假設有兩個變量X、Y,那麼兩變量間的皮爾遜相關係數可通過以下公式計算:公式一:

公式二:

公式三:

公式四:

以上列出的四個公式等價,其中E是數學期望,cov表示協方差,N表示變量取值的個數。

再來看皮爾遜相關係數的思路:皮爾遜是比歐幾裡德距離更加複雜的可以判斷人們興趣相似度的一種方法。該相關係數通過將兩組數據與某一直線擬合的思想來求值,該值實際上就為該直線的斜率。其斜率的區間在[-1,1]之間,其絕對值的大小反映了兩者相似度大小,斜率越大,相似度越大,當相似度為1時,該直線為一條對角線。

也被稱為「最佳擬合線」

再從餘弦相似度的層面來理解皮爾遜相關係數,我把這些null的維度都填上0, 然後讓所有其他維度減去這個向量各維度的平均值, 這樣的操作叫作中心化。中心化之後所有維度的平均值就是0了(妙哇!), 也滿足進行餘弦計算的要求. 然後再進行我們的餘弦計算得到結果. 這樣先中心化再餘弦計得到的相關係數叫作皮爾遜相關係數.由此再看計算皮爾遜相關係數的公式就明了了。

用 python實現計算皮爾森相似度:

# @Author : XZP# @Email : pcxzp@live.com# @File : PersonSimilarity.pyfrom 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]) # 計算係數 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

總結: 皮爾遜係數就是cos計算之前兩個向量都先進行中心化(centered),餘弦計算和皮爾遜相關係數計算就是一個東西兩個名字啊

優點:

它在數據不是很規範的時候,會傾向於給出更好的結果。

修正了「誇大分值」的情況:二者有相對近似的偏好,但某人一般傾向於給出更高的分值,而二者的分值之差又始終保持一致,則他們依然可能會存在很好的相關性(單純的用歐幾裡得距離,相似度會偏低,得出不相關的結論,這顯然不是我們所期望的。)

八、漢明距離

pass

九、總結

其實你會發現,選擇不同的相似性度量方法,對結果的影響是微乎其微的。 ——《集體智慧編程》

相關焦點

  • 機器學習算法之K-means算法
    K-means舉例shi'li1 K-means算法簡介k-means算法是一種聚類算法,所謂聚類,即根據相似性原則2 K-means算法原理k-means算法中的k代表類簇個數,means代表類簇內數據對象的均值(這種均值是一種對類簇中心的描述),因此,k-means算法又稱為k-均值算法。
  • 常用推薦算法介紹
    在本文中,作者主要是介紹了常見推薦算法的基本原理。0.基於內容的協同過濾(item-based CF),通過用戶對不同內容的評分來評測內容之間的相似性,基於內容之間的相似性做出推薦;最典型的例子是著名的「啤酒加尿布」,就是通過分析知道啤酒和尿布經常被美國爸爸們一起購買,於是在尿布邊上推薦啤酒,增加了啤酒銷量。需要計算用戶u對物品j的興趣,公式如下:
  • 從決策樹到隨機森林:樹型算法的原理與實現
    在本篇文章中,我們將會介紹決策樹的數學細節(以及各種 Python 示例)及其優缺點。你們將會發現它們很簡單,並且這些內容有助於理解。然而,與最好的監督學習方法相比,它們通常是沒有競爭力的。決策樹決策樹是一種監督學習算法。它適用於類別和連續輸入(特徵)和輸出(預測)變量。基於樹的方法把特徵空間劃分成一系列矩形,然後給每一個矩形安置一個簡單的模型(像一個常數)。從概念上來講,它們是簡單且有效的。首先我們通過一個例子來理解決策樹。然後用一種正規分析方法來分析創建決策樹的過程。考慮一個簡單的借貸公司顧客的數據集合。
  • 來複習一波,HashMap底層實現原理解析
    前言HashMa是Java中最常用的集合類框架,也是Java語言中非常典型的數據結構,同時也是我們需要掌握的數據結構,更重要的是進大廠面試必問之一。哈希表特點以上數組和鍊表,大家都知道各自優缺點。那麼我們能不能把以上兩種結合一起使用,從而實現查詢效率高和插入刪除效率也高的數據結構呢?
  • 商品推薦系統的類型與原理
    這個場景主要表現在新平臺的用戶只是過來看看上面的商品是否和自己的預期匹配,這個預期首先拋開產品功能上體驗,從商品角度來說包括商品的豐富程度,商品價格優惠程度;老平臺的用戶過來只是為了打發時間,看看平臺有沒有推薦自己感興趣的商品。比如各種秒殺活動、團購活動、搜熱、分類上熱門搜索、猜你喜歡等等。電商常用這些做法來表達自己平臺的主張,平臺想要用戶買什麼。2.
  • 漢語語音相似性編碼的研究
    在上面的例子中準確地將「here」和「so」這兩個單詞轉換為和它們語音上相似的正確對應的單詞需要一種單詞對之間語音相似性的魯棒的表示。大多數語音相似性算法是由英語的使用場景驅動的,並設計用於印歐語系。然而,許多語言,如漢語,有不同的語音結構。漢語的官方羅馬化系統拼音,用單音節來表示漢字的語音。
  • 聽說你了解深度學習最常用的學習算法:Adam優化算法?
    我們希望讀者在讀完兩部分後能了解掌握以下幾點:  Adam算法是什麼,它為優化深度學習模型帶來了哪些優勢。  Adam算法的原理機制是怎麼樣的,它與相關的AdaGrad和RMSProp方法有什麼區別。  Adam算法應該如何調參,它常用的配置參數是怎麼樣的。
  • 前沿|通用句子語義編碼器,谷歌在語義文本相似性上的探索
    這項工作中,我們希望通過給回答分類的方式學習語義相似性:給定一個對話輸入,我們希望從一批隨機選擇的回覆中分類得到正確的答案。但是,任務的最終目標是學習一個可以返回表示各種自然語言關係(包括相似性和相關性)的編碼模型。我們提出了另一預測任務(此處是指 SNLI 蘊含數據集),並通過共享的編碼層同時推進兩項任務。
  • 手勢交互方案、算法場景全解析
    工程師是如何用 AI 算法來優化識別效果的?常見的手勢識別應用場景都有哪些?接下來,就讓 Rokid R-Lab 算法工程師張兆輝為我們娓娓道來。手勢識別的三大硬體方案 手勢識別的原理並不複雜,它通過硬體捕獲自然信號,就像相機捕獲圖片信息那樣,然後通過軟體算法計算得到手的位置、姿態、手勢等,處理成計算機可以理解的信息。
  • 臺階法適用範圍及優缺點
    (1)適用範圍  臺階法是最基本、運用最廣泛的施工方法,而且是實現其它施工方法的重要手段。Ⅲ~Ⅳ圍巖可採用兩臺階法,Ⅴ~Ⅵ圍巖需採用多步開挖或者環形開挖留核心土法。斷面較高時可進行多臺階施工,每層臺階的高度常用3.5~4.5m,或以人站立方便操作選擇臺階高度。
  • IJCAI 2019 丨利用半參表示算法緩解推薦系統中的冷啟動問題
    一方面 I2I 是 feeds 瀑布流等用戶推薦場景的基礎, 另一方面,「為你推薦」、「猜你喜歡」等場景天然就是 I2I 的問題. I2I 在推薦系統中的作用至關重要。然而對很多新品較多的場景和應用上,例如優酷新視頻發現場景和閒魚這種二手電商社區,由於沒有歷史行為累計,商品的冷啟動問題異常嚴重,behavior-based 算法在這些商品上的效果較差。冷啟動一直以來都是推薦系統重要的挑戰之一, 常見的 content-based 方法是引入商品的內容信息,利用商品之間的文本、描述、類目等內容信息進行 I2I 相似度矩陣的計算。
  • 從數據結構到算法:圖網絡方法初探
    根據矩陣的性質不同適用於不同的分解策略。主要包括 Local Linear Embedding(LLE)[3]、Laplacian Eigenmaps[4]、SPE[5]、GraRep[6] 等。LLE 算法其實是流形學習的一種,LLE 算法認為每一個數據點都可以由其鄰域節點的線性加權組合構造得到。降維到低維空間後,這種線性關係仍然得到保留。
  • 數據科學家應該了解的5個圖算法
    在本文中,我將討論一些我們應該了解的重要的圖形算法,並且使用Python實現。1.連通分支有3個連通分支的圖我們都知道聚類的原理,可以將連通分支(Connected Components)視為一種硬聚類算法,然後在相關或連接的數據中查找聚類或孤島。舉一個具體的例子:假設您有世界上連接任何兩個城市的道路的數據,您需要找出世界上所有大洲及其所包含的城市。
  • 8種常見機器學習算法比較
    ,文中主要介紹了8種計算機算法及其優缺點,為大家進行算法選擇時提供一點意見。假如你在乎精度(accuracy)的話,最好的方法就是通過交叉驗證(cross-validation)對各個算法一個個地進行測試,進行比較,然後調整參數確保每個算法達到最優解,最後選擇最好的一個。但是如果你只是在尋找一個「足夠好」的算法來解決你的問題,或者這裡有些技巧可以參考,下面來分析下各個算法的優缺點,基於算法的優缺點,更易於我們去選擇它。
  • 單片機C語言實現求平方根算法
    在此,總結下網上常見的四種單片機常用開方根算法:對於擁有專門的乘除法指令的單片機,可採用以下兩種方法:1、二分法對於一個非負數n,它的平方根不會小於大於(n/2+1)(謝謝@linzhi-cs提醒)。在[0, n/2+1]這個範圍內可以進行二分搜索,求出n的平方根。
  • 機器學習十大算法都是何方神聖?
    大數據原本在工業界中就已經炙手可熱,而基於大數據的機器學習則更加流行,因為其通過對數據的計算,可以實現數據預測、為公司提供決策依據。跟我們生活息息相關的最常見機器學習算法包括電影推薦算法、圖書推薦算法。這些算法都是基於你的電影觀看記錄或圖書購買記錄來給你做推薦的。James Le在KDnuggets上發布了一篇文章,介紹了他是如何入門機器學習的。
  • 谷歌通過深度度量學習,提出新的語義實例分割方法
    雷鋒網了解到,谷歌研究院近日與UCLA合作,提出了一種新的語義實例分割方法:首先計算兩個像素屬於同一對象的可能性,然後將相似的像素分組在一起。其中,相似性度量是基於深度,完全卷積的嵌入模型,而分組方法是基於選擇所有與一組「種籽點」足夠相似的點,這個選擇模型是一個深度的、完全卷積的評分模型。
  • 性能提升30%以上,實時實例分割算法SOLOv2實現產業SOTA
    相較於目標檢測和語義分割,實例分割算法的構建和訓練難度是非常複雜、且具有挑戰性的。如果要同時兼顧精度和速度,難度又上了一個臺階。不過莫慌,本文不僅為大家準備了極其乾貨的實力分割算法原理和優化方法講解,還為大家準備了產業 SOTA 的實例分割算法在「實現機器人抓取」和「工業質檢」這兩個產業實踐中的案例解析。
  • 機器學習十大算法都是何方神聖?看完你就懂了
    大數據原本在工業界中就已經炙手可熱,而基於大數據的機器學習則更加流行,因為其通過對數據的計算,可以實現數據預測、為公司提供決策依據。跟我們生活息息相關的最常見機器學習算法包括電影推薦算法、圖書推薦算法。這些算法都是基於你的電影觀看記錄或圖書購買記錄來給你做推薦的。James Le 在 KDnuggets 上發布了一篇文章,介紹了他是如何入門機器學習的。
  • 輕鬆看懂3種電動汽車常用電機的優缺點
    電動機是電動汽車動力的源泉,電動汽車常用的動力電機按照工作原理分類一共有以下3種,分別是:串勵直流電動機、永磁直流電動機、三相交流電動機。下面就開始分析這3種動力電機的優缺點。串勵直流電機啟動時巨大的扭矩輸出特性,特別適用於陡坡工況,並且不需要變速機構,就能輸出燃油車無法達到的扭矩。