1. 程式人生 > >【Python】歐氏距離和餘弦距離

【Python】歐氏距離和餘弦距離

一、歐幾里得距離(Euclidean Distance)

   歐氏距離是最常見的距離度量,衡量的是多維空間中各個點之間的絕對距離。公式如下:

Euclidean Distance

  因為計算是基於各維度特徵的絕對數值,所以歐氏度量需要保證各維度指標在相同的刻度級別,比如對身高(cm)和體重(kg)兩個單位不同的指標使用歐式距離可能使結果失效。

        Python實現如下:

import numpy as np

x=np.random.random(10)
y=np.random.random(10)

# solution1
dist1 = np.linalg.norm( x - y )

# solution2
dist2 = np.sqrt(np.sum(np.square(x - y)))  

print('x',x)
print('y',y)
print('dist1',dist1)
print('dist2',dist2)
          執行結果:


二、餘弦距離

         餘弦相似度用向量空間中兩個向量夾角的餘弦值作為衡量兩個個體間差異的大小。相比距離度量,餘弦相似度更加註重兩個向量在方向上的差異,而非距離或長度上。公式如下:

Cosine Similarity

              Python實現如下:

import numpy as np
from scipy.spatial.distance import pdist

x=np.random.random(10)
y=np.random.random(10)

# solution1
dist1 = 1 - np.dot(x,y)/(np.linalg.norm(x)*np.linalg.norm(y))

# solution2
dist2 = pdist(np.vstack([x,y]),'cosine')

print('x',x)
print('y',y)
print('dist1',dist1)
print('dist2',dist2)
            執行結果:

三、歐氏距離和餘弦距離的區別

        餘弦距離使用兩個向量夾角的餘弦值作為衡量兩個個體間差異的大小。相比歐氏距離,餘弦距離更加註重兩個向量在方向上的差異。

        藉助三維座標系來看下歐氏距離和餘弦距離的區別:

clip_image009

           從上圖可以看出,歐氏距離衡量的是空間各點的絕對距離,跟各個點所在的位置座標直接相關;而餘弦距離衡量的是空間向量的夾角,更加體現在方向上的差異,而不是位置。如果保持A點位置不變,B點朝原方向遠離座標軸原點,那麼這個時候餘弦距離 clip_image011 是保持不變的(因為夾角沒有發生變化),而A、B兩點的距離顯然在發生改變,這就是歐氏距離和餘弦距離之間的不同之處。

           歐氏距離和餘弦距離各自有不同的計算方式和衡量特徵,因此它們適用於不同的資料分析模型:

歐氏距離能夠體現個體數值特徵的絕對差異,所以更多的用於需要從維度的數值大小中體現差異的分析,如使用使用者行為指標分析使用者價值的相似度或差異。

餘弦距離更多的是從方向上區分差異,而對絕對的數值不敏感,更多的用於使用使用者對內容評分來區分興趣的相似度和差異,同時修正了使用者間可能存在的度量標準不統一的問題(因為餘弦距離對絕對數值不敏感)。

相關推薦

Python距離餘弦距離

一、歐幾里得距離(Euclidean Distance)    歐氏距離是最常見的距離度量,衡量的是多維空間中各個點之間的絕對距離。公式如下:   因為計算是基於各維度特徵的絕對數值,所以歐氏度量需要保證各維度指標在相同的刻度級別,比如對身高(cm)和體重(kg)

python time模塊datetime模塊詳解

-a cond .com ima 封裝 基本 sta times %d 一、time模塊 time模塊中時間表現的格式主要有三種:   a、timestamp時間戳,時間戳表示的是從1970年1月1日00:00:00開始按秒計算的偏移量   b、struct_time時間

python第一日 python2python3區別 命名方式 三種結構

一、python2和python3區別 1)print 語句區別   python2:print是個class,所以可以不用加括號,print 1,2+3   python3:print是個內建函式,必須加括號,print(1,2+3,end=" ") 2)input區別   python2:inp

Pythonsplit,stripjoin的使用

文章目錄 split才是切割... 值得注意的是,split只能切割字串..不能切割列表,但是切割字元串出來的結果卻是列表... join的使用 join()函式 對字串的操作

pythonnumpy.datetime64( ) 時間 datetime.datetime 互轉

首先定義幾個時間變數datetime、Timestamp、numpy.datetime64: import datetime import numpy as np import pandas as p

Pythonvirtualenvwrapper 的安裝使用

virtualenvwrapper是用來管理virtualenv的擴充套件包,用著很方便。 1. 安裝: #安裝virtualenv (sudo) pip install virtualenv #安裝virtualenvwrapper (sudo) pip insta

pythonmap、reducefilter

map函式 map(func, Iterable) 接收一個func函式和一個序列Iterable,將Iterable的每個元素經過func函式處理後,返回一個新的Iterable。 類似列表推導式:[func(item) for item in iterable] #

pythonThreading快速使用執行緒鎖的理解及.join()用法詳說

0X0:在開始之前先理解一下threading的意義,我們知道寫一個程式,之後程式執行完畢,得到想要的結果。這就是我對一個軟體的理解。 那麼有時候就出現了一個問題,如果這個程式在執行過程中要實現多個功能,即先執行第一個功能,同時執行第二個功能,最後執行第三個功

pythonlist轉置前後反轉

list/tuple轉置: 以二維grid[][]為例: grid = [[row[i] for row in grid] for i in range(len(grid[0]))] 效果如圖:                                        

Python類的屬性方法的引數加不加self的區別

先看一段程式碼 class Test(object): ID = 1 def __init__(self): pass def prtID(self): print(self.ID) def cl

Python獲取當前目錄子目錄下所有檔案或指定檔案的方法

###Date: 2018.5.23================================================================方法一:os.listdir()get

numpy距離餘弦相似度

兩者相同的地方,就是在機器學習中都可以用來計算相似度,但是兩者的含義有很大差別,以我的理解就是: 前者是看成座標系中兩個點,來計算兩點之間的距離; 後者是看成座標系中兩個向量,來計算兩向量之間的夾角。 前者因為是點,所以一般指位置上的差別,即距離; 後者因為是

距離餘弦相似度

兩者相同的地方,就是在機器學習中都可以用來計算相似度,但是兩者的含義有很大差別,以我的理解就是: 前者是看成座標系中兩個點,來計算兩點之間的距離; 後者是看成座標系中兩個向量,來計算兩向量之間的夾角。 前者因為是點,所以一般指位置上的差別,即距離; 後者因為是向量,所以

python(第一章)1.4 數字表達式

python以下內容是我學習《Python基礎教程》第2版 這本書所寫的筆記 轉載請註明出處1.>>> 2.75%.50.25【不同】C語言中取余運算必須為整數,不能是浮點型2.>>>(-3)**29【不同】C語言中pow (double x,double n);(將返回

Python格式化字符串format函數

blog 結構 位置 傳遞 color 格式 數據結構 格式符 -- ## 本文基於Python3,可能存在部分內容不適配Python2 1. 最簡單的字符串的輸出: str1 = ‘popma is so cool‘ print(str1) 輸出: popma is

pythontime datetime類型轉換,字符串型變量轉成日期型變量

-h with ptime 世紀 represent 字符串轉換 代碼 mes ear s1=‘20120125‘; 6 s2=‘20120216‘; 7 a=time.strptime(s1,‘%Y%m%d‘); 8 b=time.st

Python 文件目錄比較工具filecmpdifflib

返回 我沒 直接 既然 hash this 上下 direct 不同   在一些運維場景中,常常需要比較兩個環境中的應用目錄結構(是否有文件/目錄層面上的增刪)以及比較兩個環境中同名文件內容的不同(即文件層面上的改)。Python自帶了兩個內建模塊可以很好地完成這個工作,f

Python元編程動態屬性特性

class join write msg pen mut quest pin sys #19.1 使用動態屬性轉換數據"""#栗子19-2 osconfeed.py:下載 osconfeed.jsonfrom urllib.request import urlopenimp

Python創建使用類

自動運行 over 多個實例 引用 bottom color ack 小寫 運行 面向對象編程是最有效的軟件編寫方法之一 創建Dog類 class Dog(): ‘‘‘一次模擬小狗的簡單測試‘‘‘ def __init__(self,name,age

pythonpython值傳遞問題內存管理機制

python1)值傳遞問題python中到底是"值傳遞"還是"引用傳遞",主要取決於對象是否是可變的. 1)函數傳參: ·基本數據類型:int、float、str;元祖屬於不可變對象;傳遞的是"原值"的拷貝 ·列表、字典、類、類實例屬於可變對象;傳遞的是"值引用" 2)