首頁 後端開發 Python教學 距離度量以及python實現

距離度量以及python實現

Apr 04, 2018 pm 03:50 PM
python 實現

本篇文章給大家分享的內容是距離度量以及python實現,有需要的朋友可以參考一下文章中的內容



轉自:http://www.cnblogs.com/denny402/p/7027954.html

          https://www.cnblogs.com/denny402/p /7028832.html

1. 歐氏距離(Euclidean Distance)
       歐氏距離是最容易理解的一種距離計算方法,源自歐氏空間中兩點間的距離公式。
(1)二維平面上兩點a(x1,y1)與b(x2,y2)間的歐氏距離:

(2)三維空間兩點a(x1 ,y1,z1)與b(x2,y2,z2)間的歐氏距離:

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

(4)也可以用表示成向量運算的形式:

python中的實作:

方法一:


距離度量以及python實現

import numpy as np
x=np.random.random(10)
y=np.random.random(10)#方法一:根据公式求解d1=np.sqrt(np.sum(np.square(x-y)))#方法二:根据scipy库求解from scipy.spatial.distance import pdistX=np.vstack([x,y])
d2=pdist(X)
登入後複製

距離度量以及python實現






#2. 曼哈頓距離(Manhattan Distance)


       從名字就可以猜出這種距離的計算方法了。想像你在曼哈頓要從一個十字路口開車到另一個十字路口,駕駛距離是兩點間的直線距離嗎?顯然不是,除非你能穿越大樓。實際駕駛距離就是這個「曼哈頓距離」。而這也是曼哈頓距離名稱的來源, 曼哈頓距離也稱為

城市街區距離(City Block distance)


(1)二維平面兩點a(x1,y1)與b(x2,y2)間的曼哈頓距離

(2)兩個n維向量a(x11,x12 ,…,x1n)與b(x21,x22,…,x2n)間的曼哈頓距離距離度量以及python實現

python中的實作:距離度量以及python實現



import numpy as np
x=np.random.random(10)
y=np.random.random(10)#方法一:根据公式求解d1=np.sum(np.abs(x-y))#方法二:根据scipy库求解from scipy.spatial.distance import pdistX=np.vstack([x,y])
d2=pdist(X,'cityblock')
登入後複製



#3. 切比雪夫距離( Chebyshev Distance )
        西洋棋玩過麼?國王走一步能夠移動到相鄰的8個方格中的任一個。那麼國王從格子(x1,y1)走到格子(x2,y2)最少需要多少步呢?自己走走試試。你會發現最少步數總是max( | x2-x1 | , | y2-y1 | ) 步 。有一種類似的一種距離度量方法叫切比雪夫距離。
(1)二維平面兩點a(x1,y1)與b(x2,y2)間的切比雪夫距離


(2)兩個n維向量a(x11,x12,…,x1n)與b(x21,x22,…,x2n)間的切比雪夫距離

  這個公式的另一種等價形式是距離度量以及python實現

       看不出兩個公式是等價的?提示:試試用放縮法和夾逼法則來證明。

python中的實作:距離度量以及python實現

###################
import numpy as np
x=np.random.random(10)
y=np.random.random(10)#方法一:根据公式求解d1=np.max(np.abs(x-y))#方法二:根据scipy库求解from scipy.spatial.distance import pdistX=np.vstack([x,y])
d2=pdist(X,'chebyshev')
登入後複製
############################################# #####

4. 闵可夫斯基距离(Minkowski Distance)
闵氏距离不是一种距离,而是一组距离的定义。
(1) 闵氏距离的定义
       两个n维变量a(x11,x12,…,x1n)与 b(x21,x22,…,x2n)间的闵可夫斯基距离定义为:

也可写成


其中p是一个变参数。
当p=1时,就是曼哈顿距离
当p=2时,就是欧氏距离
当p→∞时,就是切比雪夫距离
       根据变参数的不同,闵氏距离可以表示一类的距离。
(2)闵氏距离的缺点
  闵氏距离,包括曼哈顿距离、欧氏距离和切比雪夫距离都存在明显的缺点。
  举个例子:二维样本(身高,体重),其中身高范围是150~190,体重范围是50~60,有三个样本:a(180,50),b(190,50),c(180,60)。那么a与b之间的闵氏距离(无论是曼哈顿距离、欧氏距离或切比雪夫距离)等于a与c之间的闵氏距离,但是身高的10cm真的等价于体重的10kg么?因此用闵氏距离来衡量这些样本间的相似度很有问题。
       简单说来,闵氏距离的缺点主要有两个:(1)将各个分量的量纲(scale),也就是“单位”当作相同的看待了。(2)没有考虑各个分量的分布(期望,方差等)可能是不同的。

python中的实现:


距離度量以及python實現

import numpy as np
x=np.random.random(10)
y=np.random.random(10)#方法一:根据公式求解,p=2d1=np.sqrt(np.sum(np.square(x-y)))#方法二:根据scipy库求解from scipy.spatial.distance import pdistX=np.vstack([x,y])
d2=pdist(X,'minkowski',p=2)
登入後複製

距離度量以及python實現

5. 标准化欧氏距离 (Standardized Euclidean distance )
(1)标准欧氏距离的定义
  标准化欧氏距离是针对简单欧氏距离的缺点而作的一种改进方案。标准欧氏距离的思路:既然数据各维分量的分布不一样,好吧!那我先将各个分量都“标准化”到均值、方差相等吧。均值和方差标准化到多少呢?这里先复习点统计学知识吧,假设样本集X的均值(mean)为m,标准差(standard deviation)为s,那么X的“标准化变量”表示为:

  标准化后的值 =  ( 标准化前的值  - 分量的均值 ) /分量的标准差
  经过简单的推导就可以得到两个n维向量a(x11,x12,…,x1n)与 b(x21,x22,…,x2n)间的标准化欧氏距离的公式:

  如果将方差的倒数看成是一个权重,这个公式可以看成是一种加权欧氏距离(Weighted Euclidean distance)

python中的实现:


距離度量以及python實現

import numpy as np
x=np.random.random(10)
y=np.random.random(10)

X=np.vstack([x,y])#方法一:根据公式求解sk=np.var(X,axis=0,ddof=1)
d1=np.sqrt(((x - y) ** 2 /sk).sum())#方法二:根据scipy库求解from scipy.spatial.distance import pdistd2=pdist(X,'seuclidean')
登入後複製

距離度量以及python實現

6. 马氏距离(Mahalanobis Distance)
(1)马氏距离定义
       有M个样本向量X1~Xm,协方差矩阵记为S,均值记为向量μ,则其中样本向量X到u的马氏距离表示为:

       而其中向量Xi与Xj之间的马氏距离定义为:

       若协方差矩阵是单位矩阵(各个样本向量之间独立同分布),则公式就成了:

       也就是欧氏距离了。
  若协方差矩阵是对角矩阵,公式变成了标准化欧氏距离。
python 中的实现:


距離度量以及python實現

import numpy as np
x=np.random.random(10)
y=np.random.random(10)#马氏距离要求样本数要大于维数,否则无法求协方差矩阵#此处进行转置,表示10个样本,每个样本2维X=np.vstack([x,y])
XT=X.T#方法一:根据公式求解S=np.cov(X)   #两个维度之间协方差矩阵SI = np.linalg.inv(S) #协方差矩阵的逆矩阵#马氏距离计算两个样本之间的距离,此处共有10个样本,两两组合,共有45个距离。n=XT.shape[0]
d1=[]for i in range(0,n):    for j in range(i+1,n):
        delta=XT[i]-XT[j]
        d=np.sqrt(np.dot(np.dot(delta,SI),delta.T))
        d1.append(d)        
#方法二:根据scipy库求解from scipy.spatial.distance import pdist
d2=pdist(XT,'mahalanobis')
登入後複製

距離度量以及python實現

马氏优缺点:

1)马氏距离的计算是建立在总体样本的基础上的,这一点可以从上述协方差矩阵的解释中可以得出,也就是说,如果拿同样的两个样本,放入两个不同的总体中,最后计算得出的两个样本间的马氏距离通常是不相同的,除非这两个总体的协方差矩阵碰巧相同;

2)在计算马氏距离过程中,要求总体样本数大于样本的维数,否则得到的总体样本协方差矩阵逆矩阵不存在,这种情况下,用欧式距离计算即可。

3)还有一种情况,满足了条件总体样本数大于样本的维数,但是协方差矩阵的逆矩阵仍然不存在,比如三个样本点(3,4),(5,6)和(7,8),这种情况是因为这三个样本在其所处的二维空间平面内共线。这种情况下,也采用欧式距离计算。

4)在实际应用中“总体样本数大于样本的维数”这个条件是很容易满足的,而所有样本点出现3)中所描述的情况是很少出现的,所以在绝大多数情况下,马氏距离是可以顺利计算的,但是马氏距离的计算是不稳定的,不稳定的来源是协方差矩阵,这也是马氏距离与欧式距离的最大差异之处。



优点:它不受量纲的影响,两点之间的马氏距离与原始数据的测量单位无关;由标准化数据和中心化数据(即原始数据与均值之差)计算出的二点之间的马氏距离相同。马氏距离还可以排除变量之间的相关性的干扰。缺点:它的缺点是夸大了变化微小的变量的作用。

7. 夹角余弦(Cosine)

       也可稱為餘弦相似度。 幾何中夾角餘弦可用來衡量兩個向量方向的差異,機器學習中藉用這個概念來衡量樣本向量之間的差異。
(1)在二維空間中向量A(x1,y1)與向量B(x2,y2)的夾角餘弦公式:

(2) 兩個n維樣本點a(x11,x12,…,x1n)和b(x21,x22,…,x2n)的夾角餘弦
       類似的,對於兩個n維樣本點a(x11,x12,…,x1n)和b (x21,x22,…,x2n),可以使用類似夾角餘弦的概念來衡量它們間的相似程度。

  即:

       餘弦值範圍為[-1,1]。求得兩個向量的夾角,並得到夾角對應的餘弦值,此餘弦值就可以用來表徵這兩個向量的相似性。夾角越小,趨近於0度,餘弦值越接近1,它們的方向更吻合,則越相似。當兩個向量的方向完全相反夾角餘弦取最小值-1。當餘弦值為0時,兩向量正交,夾角為90度。因此可以看出,餘弦相似度與向量的振幅無關,只與向量的方向相關。


距離度量以及python實現

#########
import numpy as np
x=np.random.random(10)
y=np.random.random(10)#方法一:根据公式求解d1=np.dot(x,y)/(np.linalg.norm(x)*np.linalg.norm(y))#方法二:根据scipy库求解from scipy.spatial.distance import pdist
X=np.vstack([x,y])
d2=1-pdist(X,'cosine')
登入後複製

距離度量以及python實現

两个向量完全相等时,余弦值为1,如下的代码计算出来的d=1。

d=1-pdist([x,x],'cosine')
登入後複製

8. 皮尔逊相关系数(Pearson correlation)

(1) 皮尔逊相关系数的定义

前面提到的餘弦相似度只與向量方向有關,但它會受到向量的平移影響,在夾角餘弦公式中如果將x 平移到x+ 1, 餘弦值就會改變。怎樣才能實現平移不變性?這就要用到皮爾森相關係數(Pearson correlation),有時候也直接叫相關係數

如果將夾角餘弦公式寫成:

表示向量x與向量y之間的夾角餘弦,則皮爾遜相關係數則可表示為:

#

皮尔逊相关系数具有平移不变性和尺度不变性,计算出了两个向量(维度)的相关性。

 在python中的实现:


距離度量以及python實現

import numpy as np
x=np.random.random(10)
y=np.random.random(10)#方法一:根据公式求解x_=x-np.mean(x)
y_=y-np.mean(y)
d1=np.dot(x_,y_)/(np.linalg.norm(x_)*np.linalg.norm(y_))#方法二:根据numpy库求解X=np.vstack([x,y])
d2=np.corrcoef(X)[0][1]
登入後複製

距離度量以及python實現

相關係數是衡量隨機變數X與Y相關程度的一種方法,相關係數的值範圍為[-1,1]。相關係數的絕對值越大,表示X與Y相關度越高。當X與Y線性相關時,相關係數取值為1(正線性相關)或-1(負線性相關)。

9. 漢明距離(Hamming distance)
(1)漢明距離的定義
       兩個等長字串s1與s2之間的漢明距離定義為將其中一個變成另一個所需作的最小替換次數。例如字串“1111”與“1001”之間的漢明距離為2。
       應用:訊息編碼(為了增強容錯性,應使編碼間的最小漢明距離盡可能大)。

 在python中的實作:


距離度量以及python實現

import numpy as npfrom scipy.spatial.distance import pdist
x=np.random.random(10)>0.5y=np.random.random(10)>0.5x=np.asarray(x,np.int32)
y=np.asarray(y,np.int32)#方法一:根据公式求解d1=np.mean(x!=y)#方法二:根据scipy库求解X=np.vstack([x,y])
d2=pdist(X,'hamming')
登入後複製

距離度量以及python實現

10. 杰卡德相似系数(Jaccard similarity coefficient)
(1) 杰卡德相似系数
       两个集合A和B的交集元素在A,B的并集中所占的比例,称为两个集合的杰卡德相似系数,用符号J(A,B)表示。

  杰卡德相似系数是衡量两个集合的相似度一种指标。
(2) 杰卡德距离
       与杰卡德相似系数相反的概念是杰卡德距离(Jaccard distance)。杰卡德距离可用如下公式表示:

  杰卡德距离用两个集合中不同元素占所有元素的比例来衡量两个集合的区分度。
(3) 杰卡德相似系数与杰卡德距离的应用
       可将杰卡德相似系数用在衡量样本的相似度上。
  样本A与样本B是两个n维向量,而且所有维度的取值都是0或1。例如:A(0111)和B(1011)。我们将样本看成是一个集合,1表示集合包含该元素,0表示集合不包含该元素。

 在python中的实现:


距離度量以及python實現

import numpy as npfrom scipy.spatial.distance import pdist
x=np.random.random(10)>0.5y=np.random.random(10)>0.5x=np.asarray(x,np.int32)
y=np.asarray(y,np.int32)#方法一:根据公式求解up=np.double(np.bitwise_and((x != y),np.bitwise_or(x != 0, y != 0)).sum())
down=np.double(np.bitwise_or(x != 0, y != 0).sum())
d1=(up/down)           

#方法二:根据scipy库求解X=np.vstack([x,y])
d2=pdist(X,'jaccard')
登入後複製

距離度量以及python實現

11. 布雷柯蒂斯距离(Bray Curtis Distance)

Bray Curtis距离主要用于生态学和环境科学,计算坐标之间的距离。该距离取值在[0,1]之间。它也可以用来计算样本之间的差异。

 

樣本資料:

# 計算:


#在python中的實作:######## #################

距離度量以及python實現

import numpy as npfrom scipy.spatial.distance import pdist
x=np.array([11,0,7,8,0])
y=np.array([24,37,5,18,1])#方法一:根据公式求解up=np.sum(np.abs(y-x))
down=np.sum(x)+np.sum(y)
d1=(up/down)           
#方法二:根据scipy库求解X=np.vstack([x,y])
d2=pdist(X,'braycurtis')
登入後複製

距離度量以及python實現

 相关推荐:

python实现简单的图片文字识别脚本

python实现kMeans算法的详解

以上是距離度量以及python實現的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

PHP和Python:解釋了不同的範例 PHP和Python:解釋了不同的範例 Apr 18, 2025 am 12:26 AM

PHP主要是過程式編程,但也支持面向對象編程(OOP);Python支持多種範式,包括OOP、函數式和過程式編程。 PHP適合web開發,Python適用於多種應用,如數據分析和機器學習。

在PHP和Python之間進行選擇:指南 在PHP和Python之間進行選擇:指南 Apr 18, 2025 am 12:24 AM

PHP適合網頁開發和快速原型開發,Python適用於數據科學和機器學習。 1.PHP用於動態網頁開發,語法簡單,適合快速開發。 2.Python語法簡潔,適用於多領域,庫生態系統強大。

PHP和Python:深入了解他們的歷史 PHP和Python:深入了解他們的歷史 Apr 18, 2025 am 12:25 AM

PHP起源於1994年,由RasmusLerdorf開發,最初用於跟踪網站訪問者,逐漸演變為服務器端腳本語言,廣泛應用於網頁開發。 Python由GuidovanRossum於1980年代末開發,1991年首次發布,強調代碼可讀性和簡潔性,適用於科學計算、數據分析等領域。

Python vs. JavaScript:學習曲線和易用性 Python vs. JavaScript:學習曲線和易用性 Apr 16, 2025 am 12:12 AM

Python更適合初學者,學習曲線平緩,語法簡潔;JavaScript適合前端開發,學習曲線較陡,語法靈活。 1.Python語法直觀,適用於數據科學和後端開發。 2.JavaScript靈活,廣泛用於前端和服務器端編程。

vs code 可以在 Windows 8 中運行嗎 vs code 可以在 Windows 8 中運行嗎 Apr 15, 2025 pm 07:24 PM

VS Code可以在Windows 8上運行,但體驗可能不佳。首先確保系統已更新到最新補丁,然後下載與系統架構匹配的VS Code安裝包,按照提示安裝。安裝後,注意某些擴展程序可能與Windows 8不兼容,需要尋找替代擴展或在虛擬機中使用更新的Windows系統。安裝必要的擴展,檢查是否正常工作。儘管VS Code在Windows 8上可行,但建議升級到更新的Windows系統以獲得更好的開發體驗和安全保障。

sublime怎麼運行代碼python sublime怎麼運行代碼python Apr 16, 2025 am 08:48 AM

在 Sublime Text 中運行 Python 代碼,需先安裝 Python 插件,再創建 .py 文件並編寫代碼,最後按 Ctrl B 運行代碼,輸出會在控制台中顯示。

visual studio code 可以用於 python 嗎 visual studio code 可以用於 python 嗎 Apr 15, 2025 pm 08:18 PM

VS Code 可用於編寫 Python,並提供許多功能,使其成為開發 Python 應用程序的理想工具。它允許用戶:安裝 Python 擴展,以獲得代碼補全、語法高亮和調試等功能。使用調試器逐步跟踪代碼,查找和修復錯誤。集成 Git,進行版本控制。使用代碼格式化工具,保持代碼一致性。使用 Linting 工具,提前發現潛在問題。

vscode在哪寫代碼 vscode在哪寫代碼 Apr 15, 2025 pm 09:54 PM

在 Visual Studio Code(VSCode)中編寫代碼簡單易行,只需安裝 VSCode、創建項目、選擇語言、創建文件、編寫代碼、保存並運行即可。 VSCode 的優點包括跨平台、免費開源、強大功能、擴展豐富,以及輕量快速。

See all articles