1. 全面歸納距離和相似度計算方法
距離(distance,差異程度)、相似度(similarity,相似程度)方法可以看作是以某種的距離函數計算元素間的距離,這些方法作為機器學習的基礎概念,廣泛應用於如:Kmeans聚類、協同過濾推薦演算法、相似度演算法、MSE損失函數等等。本文對常用的距離計算方法進行歸納以及解析,分為以下幾類展開:
對於點x=(x1,x2...xn) 與點y=(y1,y2...yn) , 閔氏距離可以用下式表示:
閔氏距離是對多個距離度量公式的概括性的表述,p=1退化為曼哈頓距離;p=2退化為歐氏距離;切比雪夫距離是閔氏距離取極限的形式。
曼哈頓距離 公式:
歐幾里得距離公式:
如下圖藍線的距離即是曼哈頓距離(想像你在曼哈頓要從一個十字路口開車到另外一個十字路口實際駕駛距離就是這個「曼哈頓距離」,此即曼哈頓距離名稱的來源,也稱為城市街區距離),紅線為歐幾里得距離:
切比雪夫距離起源於國際象棋中國王的走法,國際象棋中國王每次只能往周圍的8格中走一步,那麼如果要從棋盤中A格(x1,y1)走到B格(x2,y2)最少需要走幾步?你會發現最少步數總是max(|x2-x1|,|y2-y1|)步。有一種類似的一種距離度量方法叫切比雪夫距離。
切比雪夫距離就是當p趨向於無窮大時的閔氏距離:
距離函數並不一定是距離度量,當距離函數要作為距離度量,需要滿足:
由此可見,閔氏距離可以作為距離度量,而大部分的相似度並不能作為距離度量。
閔氏距離也是Lp范數(如p==2為常用L2范數正則化)的一般化定義。
下圖給出了一個Lp球( ||X||p = 1 )的形狀隨著P的減少的可視化圖:
距離度量隨著空間的維度d的不斷增加,計算量復雜也逐增,另外在高維空間下,在維度越高的情況下,任意樣本之間的距離越趨於相等(樣本間最大與最小歐氏距離之間的相對差距就趨近於0),也就是維度災難的問題,如下式結論:
對於維度災難的問題,常用的有PCA方法進行降維計算。
假設各樣本有年齡,工資兩個變數,計算歐氏距離(p=2)的時候,(年齡1-年齡2)² 的值要遠小於(工資1-工資2)² ,這意味著在不使用特徵縮放的情況下,距離會被工資變數(大的數值)主導, 特別當p越大,單一維度的差值對整體的影響就越大。因此,我們需要使用特徵縮放來將全部的數值統一到一個量級上來解決此問題。基本的解決方法可以對數據進行「標准化」和「歸一化」。
另外可以使用馬氏距離(協方差距離),與歐式距離不同其考慮到各種特性之間的聯系是(量綱)尺度無關 (Scale Invariant) 的,可以排除變數之間的相關性的干擾,缺點是誇大了變化微小的變數的作用。馬氏距離定義為:
馬氏距離原理是使用矩陣對兩兩向量進行投影後,再通過常規的歐幾里得距離度量兩對象間的距離。當協方差矩陣為單位矩陣,馬氏距離就簡化為歐氏距離;如果協方差矩陣為對角陣,其也可稱為正規化的歐氏距離。
根據向量x,y的點積公式:
我們可以利用向量間夾角的cos值作為向量相似度[1]:
餘弦相似度的取值范圍為:-1~1,1 表示兩者完全正相關,-1 表示兩者完全負相關,0 表示兩者之間獨立。餘弦相似度與向量的長度無關,只與向量的方向有關,但餘弦相似度會受到向量平移的影響(上式如果將 x 平移到 x+1, 餘弦值就會改變)。
另外,歸一化後計算歐氏距離,等價於餘弦值:兩個向量x,y, 夾角為A,歐氏距離D=(x-y)^2 = x 2+y 2-2|x||y|cosA = 2-2cosA
協方差是衡量多維數據集中,變數之間相關性的統計量。如下公式X,Y的協方差即是,X減去其均值 乘以 Y減去其均值,所得每一組數值的期望(平均值)。
如果兩個變數之間的協方差為正值,則這兩個變數之間存在正相關,若為負值,則為負相關。
皮爾遜相關系數數值范圍也是[-1,1]。皮爾遜相關系數可看作是在餘弦相似度或協方差基礎上做了優化(變數的協方差除以標准差)。它消除每個分量標准不同(分數膨脹)的影響,具有平移不變性和尺度不變性。
卡方檢驗X2,主要是比較兩個分類變數的關聯性、獨立性分析。如下公式,A代表實際頻數;E代表期望頻數:
Levenshtein 距離是 編輯距離 (Editor Distance) 的一種,指兩個字串之間,由一個轉成另一個所需的最少編輯操作次數。允許的編輯操作包括將一個字元替換成另一個字元,插入一個字元,刪除一個字元。
像hallo與hello兩個字元串編輯距離就是1,我們通過替換」a「 為 」e「,就可以完成轉換。
漢明距離為兩個等長字元串對應位置的不同字元的個數,也就是將一個字元串變換成另外一個字元串所需要替換的字元個數。例如:1011101 與 1001001 之間的漢明距離是 2,「toned」 與 「roses」 之間的漢明距離是 3
另外的,對於字元串距離來說,不同字元所佔的份量是不一樣的。比如」我樂了「 與【「我怒了」,」我樂了啊」 】的Levenshtein 距離都是1,但其實兩者差異還是很大的,因為像「啊」這種語氣詞的重要性明顯不如「樂」,考慮字元(特徵)權重的相似度方法有:TF-IDF、BM25、WMD演算法。
Jaccard 取值范圍為0~1,0 表示兩個集合沒有重合,1 表示兩個集合完全重合。
但Dice不滿足距離函數的三角不等式,不是一個合適的距離度量。
基礎地介紹下信息熵,用來衡量一個隨機變數的不確定性程度。對於一個隨機變數 X,其概率分布為:
互信息用於衡量兩個變數之間的關聯程度,衡量了知道這兩個變數其中一個,對另一個不確定度減少的程度。公式為:
如下圖,條件熵表示已知隨機變數X的情況下,隨機變數Y的信息熵,因此互信息實際上也代表了已知隨機變數X的情況下,隨機變數Y的(信息熵)不確定性的減少程度。
JS 散度解決了 KL 散度不對稱的問題,定義為:
群體穩定性指標(Population Stability Index,PSI), 可以看做是解決KL散度非對稱性的一個對稱性度量指標,用於度量分布之間的差異(常用於風控領域的評估模型預測的穩定性)。
psi與JS散度的形式是非常類似的,如下公式:
PSI的含義等同P與Q,Q與P之間的KL散度之和。
DTW 距離用於衡量兩個序列之間的相似性,適用於不同長度、不同節奏的時間序列。DTW採用了動態規劃DP(dynamic programming)的方法來進行時間規整的計算,通過自動warping扭曲 時間序列(即在時間軸上進行局部的縮放),使得兩個序列的形態盡可能的一致,得到最大可能的相似度。(具體可參考[5])
圖結構間的相似度計算,有圖同構、最大共同子圖、圖編輯距離、Graph Kernel 、圖嵌入計算距離等方法(具體可參考[4][6])。
度量學習的對象通常是樣本特徵向量的距離,度量學習的關鍵在於如何有效的度量樣本間的距離,目的是通過訓練和學習,減小或限制同類樣本之間的距離,同時增大不同類別樣本之間的距離,簡單歸類如下[2]:
最後,附上常用的距離和相似度度量方法[3]:
2. 距離測量的方法主要有哪些
1.根據測量條件分為
(1)等精度測量:用相同儀表與測量方法對同一被測量進行多次重復測量
(2)不等精度測量:用不同精度的儀表或不同的測量方法, 或在環境條件相差很大時對同一被測量進行多次重復測量
2.根據被測量變化的快慢分為
(1)靜態測量
(2)動態測量
1.直接測量法:不必測量與被測量有函數關系的其他量,而能直接得到被測量值的測量方法。
2.間接測量法:通過測量與被測量有函數關系的其他量來得到被測量值的測量方法。
3.定義測量法:根據量的定義來確定該量的測量方法。
4.靜態測量方法:確定可以認為不隨時間變化的量值的測量方法。
5.動態測量方法:確定隨時間變化量值的瞬間量值的測定方法。
6.直接比較測量法:將被測量直接與已知其值的同種量相比較的測量方法。
7.微差測量法:將被測量與只有微小差別的已知同等量相比較,通過測量這兩個量值間的差值來確定被測量值的測量方法。
在簡易測繪中測量距離最為重要,方法也最多。揀些最簡單實用的講一講。
1.步測
每人都有一副靈便的尺子,隨時帶在身邊,使用起來十分方便。這副尺子就是我們的雙腳。用雙腳測量距離,首先要知道自己的步子有多大?走的快慢有個譜。不然,也是測不準確的。《隊列條令》上對步子的大小有個規定,齊步走時,一單步長七十五厘米,走兩單步為一復步,一復步長一米五;行進速度每分鍾一百二十單步。
為啥規定步長一米五,步速每分鍾一百二十單步呢?這是根據經驗得來的。無數次測驗的結果說明:一個成年人的步長,大約等於他眼睛距離地面高度的一半,例如某人從腳根到眼睛的高度是150厘米,他的步長就是75厘米。如果你有興趣的話,不妨自己量量看。
還有一個經驗:我們每小時能走的公里數,恰與每三秒鍾內所邁的步數相同。例如,你平均三秒鍾能走五單步,那每小時你就可以走五公里。不信,也可以試一試。
這兩個經驗,只是個大概數,對每個人來說,不會一點不差,這里有個步長是否均勻,快慢能否保持一致的問題。要想准確地測定距離,就要經常練習自己的步長和步速。
怎麼練習呢?連隊不是天天出操、練步法嗎?這就是練習步長和步速的極好機會。
還有個練習的辦法,在公路上,每隔一公里就有一塊里程碑,你可以經常用步子走一走,算算步數,看看時間,反復體會自己的步長和速度。
掌握了自己的步長和步速,步測就算學會了。步測時,只要記清復步數或時間,就能算出距離。例如,知道自己的復步長1.5米,數得某段距離是540復步,這段距離就是:540×1.5米=810米。若知道自己的步速是每分鍾走54復步,走了10分鍾,也可以算出這段距離是:54×10=540復步,540×1.5米=810米。根據復步與米數的關系,我們把這個計算方法簡化為一句話:"復步數加復步數之半,等於距離。"就能很快地算出距離來。
2.目測
人的眼睛是天生的測量"儀器",它既可以看近,近到自己的鼻子尖,又能看遠,遠到宇宙太空的天體。用眼睛測量距離,雖然不能測出非常准確的數值,但是,只要經過勤學苦練,還是可以測得比較准確的。在我軍炮兵部隊中,有許多同志練出了一手過硬的目測本領,他們能在幾秒鍾內,准確地目測出幾千米以內的距離,活象是一部測距機。
怎樣用眼睛測量物體的距離呢?
人的視力是相對穩定的,隨著物體的遠近不同,視覺也不斷地起變化,物體的距離近,視覺清楚,物體的距離遠,視覺就模糊。
而物體的形狀都有一定規律的,各種不同物體的遠近不同,它們的清晰程度也不一樣。我們練習目測,就是要注意觀察、體會各種物體在不同距離上的清晰程度。觀察的多了,印象深了,就可以根據所觀察到的物體形態,目測出它的距離來。例如當一個人從遠處走來,離你2000米時,你看他只是一個黑點;離你1000米時,你看他身體上下一般粗;500米時,能分辨出頭、肩和四肢;離200米時,能分辯出他們的面孔、衣服顏色和裝具。
這種目測距離的本領,主要得*自己親身去體會才能學到手。別人的經驗,對你並不是完全適用的,下面這個表裡列的數據,是在一般情況下,正常人眼力觀察的經驗,只能供同志們參考。
不同距離上不同目標的清晰程度
距離(米)分辨目標清晰程度
100人臉特徵、手關節、步兵火器外部零件。
150-170衣服的紐扣、水壺、裝備的細小部分。
200房頂上的瓦片、樹葉、鐵絲。
250-300牆可見縫,瓦能數溝;人臉五官不清;衣服、輕機槍、步槍的顏色可分。
400人臉不清,頭肩可分。
500門見開關,窗見格,瓦溝條條分不清;人頭肩不清,男女可分。
700瓦面成絲;窗見襯;行人邁腿分左右,手肘分不清。
1000房屋輪廓清楚,瓦片亂,門成方塊窗襯消;人體上下一般粗。
1500瓦面平光,窗成洞;行人似蠕動,動作分不清。
2000窗是黑影,門成洞;人成小黑點,停、動分不清。
3000房屋模糊,門難辨,房上煙囪還可見。
你覺得根據目標的清晰程度判斷距離沒有把握時,還可以利用與現地的已知距離,相互進行比較,有比較才能判定。比如,兩電線桿之間的距離,一般為五十米,如果觀測目標附近有電線桿,就可以將觀測的物體與電引桿間隔比較,然後再判定。現地沒有距離比較時,就用平時自己較熟悉的50米、100米、200米、500米等基本距離,經過反復回憶比較後再判定。如果要測的距離較長,可以分段比較,爾後推算全長。
由於天候、陽光、物體顏色和觀察位置、角度的不同,眼睛的分辨力常會受到影響,目測的距離就會產生誤差。
晴天:面向陽光觀測,眼睛受到光線的刺激,視力會減弱,容易把物體測遠了;如背向陽光觀測,眼睛不受光線刺激,物體被陽光照射得清晰明亮,容易把物體測近了。
陰天或早晚天色較暗時:能見度減弱,物體顯得模糊,容易把目標測遠了。
雨後:空氣清新,物體顏色鮮明,又容易把目標測近了。
在開闊地形上目測,或隔著水面、溝谷觀察,或從高處往低處觀察,都容易把目標測近了。
應根據各種具體情況,經過艱苦練習,反復體會,摸出自己的經驗。俗話說:"熟能生巧",練得多,體會深,經驗豐富了,就能比較准確地目測出物體的距離來。
3.用步槍測
我們手中的半自動步槍、沖鋒槍、輕機槍等,都是消滅敵人的武器;可是在簡易測繪上又有它的新用途,它既是武器又是一具出色的測距"儀器",使用起來迅速方便。在你對敵人射擊,進行瞄準的同時,就能測出距離來,這對於選定標尺分劃和瞄準點來說,是非常及時適用的。
武器怎麼還能測量距離呢?
這是根據準星的寬度能遮蓋目標的情況計算出來的,所以叫準星覆蓋法。工廠里製造武器,都是有一定尺寸的,如準星的寬度是2毫米,瞄準時眼睛到準星的距離,各種武器都可以直接量出(如半自動步槍為74厘米)。目標(主要是人體)的寬度一般是50厘米。這樣,根據相似三角形成比例的道理,就可以計算出各種武器在不同距離上準星寬度與目標(人體)寬度的關系。根據計算,當準星寬度恰好能遮住一個人體時,各咱武器的距離分別是:半自動步槍200米,沖鋒槍160米,輕機槍170米;若遮住半個人體,就是它們距離的一半,即100米、80米和85米;若準星的一半就能遮住一個人體,那就是它們距離的一倍,即400米、320米和340米了。所以,只要記住準星遮蓋目標的情況,就能立即估出距離來。
4.用指北針測
指北針不但能給東西南北方向,還能告訴你到目標的距離。
工廠在設計製造指北針時,就已經考慮到用它測量距離的問題了。打開指北針,你馬上就能發現有準星、照門。準星座兩側尖端的寬度恰好是準星座到照門距離的十分之一。準星座就是估計判定距離的,所以叫"距離估定器"。
測量距離時,將指北針放平,用右眼通過照門、準星觀察目標,記住距離估定器照準現地的寬度,然後目測現地的寬度,並將該寬度乘以10,就是到目標的距離。若目標太窄也可以用估定器的一半照準,則應乘以20。
例如,測得敵坦克約為估定器的一半,已知敵坦克長約7米,則可以算出到坦克的距離為:7米×20=140米。
5.用臂長尺測
人都有一雙胳臂,如果問他:你的臂有多長?他可能搖頭說沒量過。若要再問"臂長尺"是怎麼回事?恐怕就更無法回答了。這是因為他還不知道自己的胳臂還能測距離。其實,說開了,臂長尺就是一支刻有分劃的鉛筆(或木條)。可是和手臂一結合起來,就變成一具非常靈活方便的測距"儀器"了。
鉛筆上的分劃,是按每個人臂長(手臂向前平伸,從眼睛到拇指虎口的距離)的百分之一為一個分劃刻畫的,所以叫臂長尺。比如,某人的臂長是60厘米,那麼臂長尺上的一個分劃就是6毫米。有了臂長尺,只要事先知道目標的大小,就可以用臂長尺測出距離。
那麼距離是怎樣計算的呢?前面已經說過,臂長尺上的每個分劃是臂長的百分之一,如果目標的高度(或寬度)佔一個分劃時,也正好是距離的百分之一,占兩個分劃,就是百分之二。這樣,根據相似三角形成比例的道理,距離:目標高度(間隔)=100(臂長)∶分劃數(臂長尺),就可以得出求距離的公式:
距離=高度(間隔)×100分劃數
例如:測得前方電話線桿的一個間隔,約5個分劃,我們知道一般電話線桿間隔是50米,那麼到電線桿的距離是:
50米×100=1000米。