日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Kendall tau distance理解与分析

發布時間:2024/1/1 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Kendall tau distance理解与分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

簡介

? ??Kendall tau distance這個概念在平時如果不是專門接觸到相關工作的話會顯得比較陌生。它主要是一個用來比較兩個向量之間相似度的概念。在一些數據分析和搜索引擎的結果相似度ranking里會有很多的應用。這里針對它的定義和計算做一個總結。

?

概念分析

? ??Kendall tau distance這個概念似乎比較少見,在網上搜索也沒找到太多詳細的介紹。總的來說,它是用來量化的衡量幾組向量之間的偏差的。這樣粗看起來還是很難理解。怎么來定義一個偏差呢?我們總該有一個標準吧,比如說多少個元素不一樣,以及它們不一樣的位置如何等等。

? ? 舉例來說,比如說我們有這樣的一個數組[1, 2, 3, 4, 5]那么對于它來說,它就是一個標準順序排列的一個序列。這個序列里元素不重復而且所有元素都是遞增的。現在有另外一個數組,比如說[2, 3, 1, 5, 4]。對于它來說,它肯定和前面的數組不一樣,也就是說有偏差。該怎么來量化這種偏差呢?

? ? 我們看,對于前面這個標準序列,它里面每個元素都比排它后面到元素小。而對于后面這個序列來說,它卻不是這樣,比如說第一個元素是2,它后面有元素1比它小,對于3, 5也是。這樣,從數學的概念來說,它存在有3個逆序。所以說,逆序數量就相當于是它和基準序列的偏差。實際上Kendall tau distance雖然是描述兩個序列之間的偏差。它也就是一個序列相當于一個基準序列的逆序數。

? ? 關于逆序計算和分析可以參照我前面的一篇文章。

?

實現

? ? 現在,我們再進一步細化前面討論的過程。首先進行比較計算的兩個序列可以通過定義兩個數組來實現。為了使得問題簡化,可以定義兩個int數組。因為要計算它們的差異,所以它們每個元素都是唯一的而且兩個數組長度一樣。

? ? 在前面討論的地方,計算Kendall tau distance是一個序列針對基準序列來計算逆序數。但是要進行比較的兩個序列并不一定是我們前面提到的理想情況。它們可能沒有一個是基準序列。這個時候該怎么辦呢?

? ?我們先來看這樣一個數組a=[3, 4, 0, 1, 2]。由于這種序列的限制,它里面每個元素和下標都是唯一的。假設a[i]里有每個唯一的元素,那么對應的下標i就和這個元素形成一個唯一的映射。因此也可以說這是一種描述一個元素和它位置一一映射的關系:

? ? ?如果我們對map數據結構比較熟悉的話,會發現這相當于是一個特殊的map。通過它們的關系,既可以從某個元素得到它的索引位置,也可以從它的索引位置得到該元素。在前面數組里,從某個索引得到某個元素的時間很快,就是一個常量,可是如果要從某個元素得到它的索引,則比較復雜,需要去查詢整個數組。這樣,可以利用該數組的特性,建立一個反向映射,用一個數組來保存它們的關系。概括起來就是

ainv[a[i]] = i 。對于數組a[i]來說,i相當于是key,通過它可以常量時間內得到a[i]的值,而對于ainv[]來說,a[i]是key,通過它也可以常量時間內得到對應的索引i。

? ? 這樣,通過ainv[], a[]這兩個數組可以建立起一個數組元素和索引的雙向映射。

? ? 以上面數組為例,我們構造的ainv[]數組如下:

? ? ?在回到前面的問題中。我們這里建立了一個數組元素和索引的關系。如果對于兩個不同的數組,而且它們兩個都不是基準數組的話,就需要將它們做一個轉換才行。比如說,我們將一個數組轉換成基準數組。當然,既然一個要轉換的話,另外一個也需要對應的轉換。這個轉換該怎么做呢?

? ? 在上述的a[]和ainv[]數組中,如果我們從頭開始以i = 0開始去遍歷a[i],然后返回ainv[a[i]],得到的正好就是一個基準序列[0, 1, 2, 3, 4],這個序列表示a[]數組里所有元素的索引。如果我們取對應另外一個數組的元素,比如b[]來作為映射的key,則它返回的結果相當于經過ainv[]的一個轉換運算。我們的映射關系為

? ?bnew[i] = ainv[b[i]]; 一個對應的示例如下圖:

? ? 最終得出的數組bnew[]相當于數組b針對數組a 索引映射確定的索引順序,求這個序列的逆序則就可以確定它們之間最終的Kendall tau distance。

? ? 于是,我們最終得到如下的代碼:

?

public static long distance(int[] a, int[] b) {if(a.length != b.length)throw new IllegalArgumentException("Array dimensions disagree");int n = a.length;int[] ainv = new int[n];for(int i = 0; i < n; i++)ainv[a[i]] = i;int[] bnew = new int[n];for(int i = 0; i < n; i++)bnew[i] = ainv[b[i]];return Inversions.count(bnew); }

?

?

總結

? ? Kendall tau distance的問題比較繞。首先一個問題就是要確定一個衡量兩個數組差別的方式。這里是用一個數組相當于一個基準數組的逆序數來衡量它們的差別。逆序數越大說明差別越大。最麻煩的問題就是當兩個數組都不是基準數組的時候要將一個轉換成基準數組,而這個時候另外一個數組也要做對應的變化。該怎么來變化呢?通過一個數組的元素-->索引映射數組建立一個映射關系。這個關系如果應用到該數組上的時候相當于返回了一個基準數組。它相當于應用了一個數學函數。而將其應用到另外一個比較的數組時,相當于對應的數組也和該數組做了一個轉換成基準數組的運算。這樣得到的這個數組再來求逆序數就可以了。

?

參考材料

http://algs4.cs.princeton.edu/25applications/KendallTau.java.html

http://functionspace.com/topic/4675/Kendall-Tau-distance

http://shmilyaw-hotmail-com.iteye.com/blog/1769047

Algorithms

總結

以上是生活随笔為你收集整理的Kendall tau distance理解与分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。