1. 程式人生 > >常用距離演算法和相關係數及其Python實現

常用距離演算法和相關係數及其Python實現

在機器學習的過程中,經常會遇到需要考察具有某些特徵的兩個樣本之間相似程度的情況。計相似程度的計算可以使用距離演算法或是相關係數,直觀來說,距離和相關係數的變化呈負相關,距離越小,相關係數越大,越相似,反之亦然。

接下來記錄幾種簡單實用的距離演算法和相關係數,以n維空間中的兩個點x(x1,x2,...,xn), y(y1,y2,...,yn) 為例,並給出python實現。

距離演算法

歐幾里得距離(Euclidean Distance)

公式

dist(x,y)=i=1n(xiyi)2

定義:歐幾里得距離是歐氏空間中兩點間“普通”(即直線)距離。沒什麼好說的。

#輸入:x,y為維度相同的包含各特徵值的list
#輸出:輸入值x,y的歐幾里得距離
def dis_euc(x, y):
    return sum([(x[i]-y[i])**2 for i in range(len(x))])**0.5

曼哈頓距離(Manhattan distance)

公式

dist(x,y)=i=1n|xiyi|

定義:曼哈頓距離的正式意義為L1-距離或城市區塊距離,也就是在歐幾里得空間的固定直角座標系上兩點所形成的線段對軸產生的投影的距離總和。

曼哈頓距離的命名原因是從規劃為方型建築區塊的城市(如曼哈頓)間,最短的行車路徑而來。一張圖可以直觀的說明它與歐氏距離的關係:

曼哈頓距離
圖中的綠線為歐幾里得距離,即為兩點之間的直線長度;紅、黃、藍三條線均為兩點之間的城市區塊路徑,三條線的長度相等,即為曼哈頓距離。

#輸入:x,y為維度相同的包含各特徵值的list
#輸出:輸入值x,y的歐幾里得距離
def dis_man(x, y):
    return sum([abs(x[i]-y[i]) for i in range(len(x)])

明可夫斯基距離(minkowski distance)

公式

dist(x,y)=(i=1n|xiyi|p)1/p

定義:明氏距離是歐氏空間中的一種測度,被看做是歐氏距離和曼哈頓距離的一種推廣

p取1或2時的明氏距離是最為常用的,p=2即為歐氏距離,而p=1時則為曼哈頓距離。當p取無窮時的極限情況下,可以得到

切比雪夫距離

#輸入:x,y為維度相同的包含各特徵值的list,p為int
#輸出:輸入值x,y的明可夫斯基距離
def dis_man(x, y, p):
    return sum([(x[i]-y[i])**p for i in range(len(x)])**(1/p)

這樣求出來的距離值,越相似的樣本,距離值越小,完全一致則為0,相差越大則值越大。但在統計學中,用相關係數來考察兩個樣本的相關程度時有如下的約定

  • 當相關係數為0時,X和Y兩變數無關係。

  • 當X的值增大(減小),Y值增大(減小),兩個變數為正相關,相關係數在0.00與1.00之間。

  • 當X的值增大(減小),Y值減小(增大),兩個變數為負相關,相關係數在-1.00與0.00之間。

相關性
−0.09 to 0.0 0.0 to 0.09
−0.3 to −0.1 0.1 to 0.3
−0.5 to −0.3 0.3 to 0.5
−1.0 to −0.5 0.5 to 1.0

類比於上述約定,我們也可以將歐幾里得距離求出的值轉化為類似相關係數的形式,Python實現如下:

#輸入:x,y為維度相同的包含各特徵值的list
#輸出:輸入值x,y的歐幾里得距離評價

def sim_distance(x, y):
    dist = sum([(x[i]-y[i])**2 for i in range(len(x))])**0.5
    return 1 / (1+dist)

歐氏距離(或者說所有的明氏距離)都有兩個明顯的缺點

  1. 沒有考慮到各維度分量數值分佈的差別,數量級小的維度在數量級大的維度面前體現不出其差異性。

  2. 對於各維度的分量一視同仁,均將其視作單純的數值進行計算,沒有考慮到其代表的單位或是方向;

舉兩個栗子:

栗子一

Metacritic 是一家專門的對影視、遊戲、音樂做評分的網站,他的評分有兩套體系:1、Metascore:網站綜合各權威媒體評論文章做出的打分,數值從1-100; 2、Userscore:網站使用者評分的均值,數值從1-10。以兩個最近上市的遊戲為例:Watch Dogs 2的Metascore為74,Userscore為7.7;Planet Coaster的Metascore為84,Userscore為8.1。現在要考察媒體評分和使用者評價之間的差別,可以得到兩個樣本點M(74, 84),U(7.7, 8.1)。直觀的來看不難發現其實兩套評價體系對這兩款遊戲的評價是差不多的,但如果去計算M和U的歐氏距離,dist_euc(M, U)=100.78,大了去了!

那麼該如何解決數量級大的維度對結果具有絕對影響呢?很自然的想法就是對每個維度進行標準化,使每個維度差值對結果的貢獻(或者說權重)相差不多,這就是標準化歐式距離:

標準化歐幾里得距離(Standardized Euclidean Distance)

公式

dist(x,y)=i=1n(ximisiyimisi)2=i=1n(xiyisi)2 其中mi,si為每個維度上的均值和標準差

定義:對每個維度做標準化之後再求歐式距離,如果將標準差的倒數看成一個權重,也可稱之為加權歐氏距離(Weighted Euclidean distance)。

#輸入:x,y為維度相同的包含各特徵值的list
#輸出:輸入值x,y的標準化歐式距離
def dis_seuc(x, y):
    sd = [(((x[i]-(x[i]+y[i])/2)**2 + (y[i]-(x[i]+y[i])/2)**2 )/ 2)**0.5 for i in range(len(x))]
    return sum([((x[i]-y[i])/sd[i])**2 for i in range(len(x))])**0.2

再算一下, dist_seuc(M, U) = 1.5157165665103982,好像媒體和玩家的評分差別也沒那麼大 : )

栗子二

假如時代廣場街頭採訪路人關於資料探勘的話題,得到了下面三個回答:
1. A: “Yeah I like datamining, it’s so cool~”
2. B: “Datamining? Never heard of it.”
3. C: “I’m learning datamining. Datamining is more than just cool, it’s the coolest thing ever.”

對三個字串進行分詞、詞幹提取、去除stopwords後,得到三個list,取”like”, “datamining”, “never”, “cool”為特徵維度,以詞頻為權值可以得到下表:

name like datamining never cool
A 1 1 0 1
B 0 1 1 0
C 0 2 0 2

也就是三個向量:

A = [1, 1, 0, 1]
B = [0, 1, 1, 0]
C = [0, 2, 0, 2]

直觀的看句子我們能感覺到A和C的意思比較接近,A和B說的意思差遠了。這時如果我們使用曼哈頓距離來計算,則dist(A, B) = 3, dist(A, C) = 3。嗯……好像哪裡不太對勁吧。這就是因為距離函式無法表徵向量方向上的變化,解決這個問題的方法,就是使用餘弦相似度來衡量向量的距離。

相關係數

餘弦相似度(Cosine similarity)

公式

sim(x,y)=cos(θ)=xyxy=ni=1xi×yini=1x2i×ni=1y2i

定義:就是求兩個向量夾角的餘弦值。給出的相似性範圍從-1到1:-1意味著兩個向量指向的方向正好截然相反,1表示它們的指向是完全相同的,0通常表示它們之間是獨立的,而在這之間的值則表示中間的相似性或相異性。


            
           

相關推薦

常用距離演算法相關係數及其Python實現

在機器學習的過程中,經常會遇到需要考察具有某些特徵的兩個樣本之間相似程度的情況。計相似程度的計算可以使用距離演算法或是相關係數,直觀來說,距離和相關係數的變化呈負相關,距離越小,相關係數越大,越相似,反之亦然。 接下來記錄幾種簡單實用的距離演算法和相關係數,以

K近鄰(KNN)演算法、KD樹及其python實現

1、k近鄰演算法 1.1 KNN基本思想 k近鄰法是基本且簡單的分類與迴歸方法,即對於輸入例項,依據給定的距離度量方式(歐式距離),以及選擇合適的k值(交叉驗證),在樣本集中找到最近鄰新例項的k個樣例,通過k個最近鄰樣例的類別表決出新例項的類別(多數表決)。

常用algorithm及其Python實現

至少 圖片 gh值 com 下標 python 兩個 append exchange 冒泡排序 def bubble_sort(li): for i in range(len(li)-1): # i表示第幾趟 exchange = False

機器學習儲備(1):協方差相關係數

為了深刻理解機器學習演算法的原理,首先得掌握其中涉及到的一些基本概念和理論,比如概率,期望,標準差,方差。在這些基本概念上,又衍生出了很多重要概念,比如協方差,相關係數等。今天我們就來聊聊這些組成機器學習的基本概念。 1、概率 概率 P 是對隨機事件發生的可能性的度量。 例如,小明在期末

協方差矩陣相關係數矩陣(R語言)

一、協方差矩陣 1.協方差定義                                     &n

經典查詢演算法及其Python實現

寫在前面上一篇介紹了幾大排序演算法,從基本原理解釋到Python程式碼實現,平時有空的話還需要經常翻出來複習複習。今天就主要來看看另外一大類演算法:經典查詢演算法。本篇相關python程式碼已上傳至Github:使勁兒點!1.基本概念查詢就是根據給定的某個值,在查詢表中確定一

皮爾遜相關係數 定義+python程式碼實現 (與王印討論公式)

作者簡介 南京大學,簡稱南大,[1] 是一所源遠流長的高等學府。追溯學脈古為源自孫吳永安元年的南京太學,歷經多次變遷,1949年“國立中央大學”易名“國立南京大學”,翌年徑稱“南京大學”,沿用至今。南京大學是教育部與江蘇省共建的全國重點大學,國家首批“211工程”、“9

資料結構與演算法:常見排序演算法及其python實現

0、 綜合分析 0.1 排序演算法的種類及時間限制 常見排序演算法一般分為非線性時間比較類排序和線性時間非比較類排序。 比較類排序演算法時間複雜度的下限為O(nlog⁡n)O(n\log n)O(nlogn),非比較類排序演算法不受比較式排序演算法的時間下

深入學習主成分分析(PCA)演算法原理及其Python實現

一:引入問題   首先看一個表格,下表是某些學生的語文,數學,物理,化學成績統計:   首先,假設這些科目成績不相關,也就是說某一科目考多少分與其他科目沒有關係,那麼如何判斷三個學生的優秀程度呢?首先我們一眼就能看出來,數學,物理,化學這三門課的成績構成了這組資料的主成分(很顯然,數學作為第一主成分,

獲取頻繁項集關聯規則的Python實現【先驗演算法

# -*- coding: utf-8 -*- #引數設定 data_file = 'F:\\user_match_stat\\itemset.txt' #檔案格式csv,形如:item1,item2,item3 #每個事務佔一行 frequent_itemsets_sav

頻繁項集挖掘Apriori演算法及其Python實現

Apriori演算法是通過限制候選產生髮現頻繁項集。 Apriori演算法使用一種稱為逐層搜尋的迭代方法,其中k項集用於探索(k+1)項集。首先,通過掃描資料庫,累計每個項的計數,並收集滿足最小支援度的項,找出頻繁1項集的集合,記為L1。然後,使用L1找出頻繁

SMOTE演算法及其python實現

SMOTE(Synthetic Minority Oversampling Technique),合成少數類過取樣技術.它是基於隨機過取樣演算法的一種改進方案,由於隨機過取樣採取簡單複製樣本的策略來增加少數類樣本,這樣容易產生模型過擬合的問題,即使得模型學習到的

機器學習之深入理解神經網路理論基礎、BP演算法及其Python實現

  人工神經網路(Artificial Neural Networks,ANN)系統是 20 世紀 40 年代後出現的。它是由眾多的神經元可調的連線權值連線而成,具有大規模並行處理、分散式信 息儲存、良

字串匹配演算法(KMP、BMSunday),及Python實現

主要對三種字串匹配演算法(KMP、BM、Sunday)進行總結。這三種字串匹配演算法之間的主要區別在於:如果在匹配過程中遇到一個不匹配位,該用何種策略進行移位。例如,存在兩個字串,如下: 字串:      ABCADAB ABCDABCDABD 搜尋字串:ABCDA

高斯判別分析演算法及其python實現

高斯判別分析演算法(Gaussian discriminat analysis) 高斯判別演算法是一個典型的生成學習演算法(關於生成學習演算法可以參考我的另外一篇部落格)。在這個演算法中,我們假設p(x|y)服從多元正態分佈。 注:在判別學習演算法中,

統計學 決定係數(Coefficient of Determination) 相關係數 (Correlation of Coefficient )

在對資料進行線性迴歸計算之後,我們能夠得出相應函式的係數, 那麼我們如何知道得出的這個係數對方程結果的影響有強呢? 所以我們用到了一種方法叫 coefficient of determination

Fuzzy C Means 算法及其 Python 實現——寫得很清楚,見原文

少包 均值 平均值 劃分 gin 及其 end 5% 指數 Fuzzy C Means 算法及其 Python 實現 轉自:http://note4code.com/2015/04/14/fuzzy-c-means-%E7%AE%97%E6%B3%95%E5%8F%8A%E

最長公共子串子序列的Python實現,帶圖示。

code mage 數字 實現 max 記錄 子串和 abc 使用 使用矩陣來記錄兩個子串之間各個字符之間的對應關系。 最長子串:矩陣中數字最大的就是最長子串的長度。若對應位置字符相同,則c[i][j] = c[i-1][j-1] + 1 1 def longSu

神經網絡的相關知識(1.python 實現MLp)

技術分享 num pre func sin date 傳播 prop etime 轉載於:http://blog.csdn.net/miangangzhen/article/details/51281989 #!usr/bin/env python3 # -*- c

(轉)梯度下降法及其Python實現

radi 減少 fill 叠代 bbs 方法 風險 ews 展示 梯度下降法(gradient descent),又名最速下降法(steepest descent)是求解無約束最優化問題最常用的方法,它是一種叠代方法,每一步主要的操作是求解目標函數的梯度向量,將當前位置的負