2016-06-28 145 views
6

你好社區,如何計算距離的二維矩陣

我是新(作爲成員)的網站,所以如果你認爲它可能會更好張貼在http://datascience.stackexchange.com,讓我知道。

我正在處理機器學習問題,它需要計算NxM維元素之間的距離,以實現某些分類算法。

元素的屬性是一個二維矩陣(矩陣),因此我正在尋找最佳算法來計算二維矩陣之間的距離。如你所見,「簡單」解決方案是將2D轉換爲1D(矢量),然後實現任何距離算法,但我正在尋找更方便的東西(如果存在)。

到目前爲止我已經使用以下方法:

  1. 各元件之間的歐幾里德距離。

    import numpy as np 
    def dist_euclidean(elem1, elem2): 
        t_sum=0 
        for i in range(len(elem1.Matr)): 
         for j in range(len(elem1.Matr[0])): 
          t_sum+= np.square(elem1.Matr[i][j]-elem2.Matr[i][j]) 
        return np.sqrt(t_sum) 
    
  2. 餘弦相似度,其中我不得不的(N×M個)2D矩陣轉換成(1xNM)載體。

    from scipy.spatial import distance 
    def dist_cosine(elem1, elem2): 
        temp1=[] 
        temp2=[] 
        for i in range(len(elem1.Matr)): 
         temp1.extend(elem1.Matr[i]) 
         temp2.extend(elem2.Matr[i]) 
        return distance.cosine(temp1, temp2) 
    
  3. KL散度(wiki),還發現實現僅一維矩陣(向量),由此做了以下轉換:

    • 實測值每個對應行之間的熵,然後取它們的平均值。

      import numpy as np 
      from scipy.stats import entropy 
      def dist_KL_row_avg(elem1, elem2): 
          Y=[] 
          for i in range(len(elem1.Matr)): 
           Y.append(entropy(elem1.Matr[i], elem2.Matr[i])) 
          return np.average(Y) 
      
    • 通過附加行,然後計算總熵轉換的(N×M個)2D矩陣代入(1xNM)載體。

      import numpy as np 
      from scipy.stats import entropy 
      def dist_KL_1d_total(elem1, elem2): 
          temp1=[] 
          temp2=[] 
          for i in range(len(elem1.Matr)): 
           temp1.extend(elem1.Matr[i]) 
           temp2.extend(elem2.Matr[i]) 
          return entropy(temp1, temp2) 
      
  4. KS試驗(wiki),還發現實現僅一維矩陣(矢量),從而也做了同樣的轉化如在KL實現:

    • 實測值之間的熵每個相應的行然後平均它們。

      import numpy as np 
      from scipy.stats import ks_2samp 
      def dist_KS_row_avg(elem1, elem2): 
          Y=[] 
          Z=[] 
          for i in range(len(elem1.Matr)): 
           Y.append(ks_2samp(elem1.Matr[i], elem2.Matr[i])) 
          Z=[x[0]/x[1] for x in Y] 
          return np.average(Z) 
      
    • 通過附加行,然後計算總熵轉換的(N×M個)2D矩陣代入(1xNM)載體。

      import numpy as np 
      from scipy.stats import ks_2samp 
      def dist_KS_1d_total(elem1, elem2): 
          temp1=[] 
          temp2=[] 
          for i in range(len(elem1.Matr)): 
           temp1.extend(elem1.Matr[i]) 
           temp2.extend(elem2.Matr[i]) 
          Y = ks_2samp(temp1, temp2) 
          return Y[0]/Y[1] 
      

都在我的問題上的工作,但我得到了好奇,因爲我無法找到任何更具體的說我非常滿意。


編輯1。 由於pltrdy建議,這裏有一些關於這個問題的更多信息。

每個元素的初始數據是一系列代碼ex(C-> B-> D-> B-> A),然後將其轉換爲也針對每一行進行歸一化的轉換矩陣。因此,矩陣中的每個單元表示從代碼[i]到代碼[j]的過渡概率。例如:

IN: A->C->B->B->A->C->C->A 
OUT: 
    A  B  C 
A 0  0  1 
B 0.5 0.5 0 
C 0.33 0.33 0.33 

考慮到這一點,最終目標是對不同的代碼系列進行分類。該系列的長度不一樣,但是由相同的代碼組成。因此,轉換概率矩陣在每種情況下具有相同的尺寸。 我有最初的問題,以找到最合適的距離算法,這將產生最佳的分類結果。

+1

您應該提供有關上下文/目標的更多信息。 我的意思是,在我看來,完全不可能提出一個好的距離函數,而沒有任何目標的想法。它就像在說「如果你有兩點使用曼哈頓/歐幾里德(等)距離」。在這種情況下,我們可以使用更一般的距離函數(例如,像你的2D點一樣用於歐幾里得),但這不會真正產生,也許不適合你的需要。 – pltrdy

+0

Thanx的建議,我沒有發佈很多信息,以免混淆讀者。我希望編輯能夠幫助,讓我知道更多的澄清。 –

+0

可以肯定的是,分類任務是從一系列代碼中預測概率矩陣(在我們的例子中是這樣)? 我不確定這是否是嚴格意義上的分類任務。我的意思是,我從來沒有見過一個矩陣作爲輸出tbh。 – pltrdy

回答

0

給定兩個不同的過渡矩陣AB並作爲一個行向量的概率分佈x,之後根據A一個步驟是xA的分佈,和之後的分配根據B一個步驟是xB。您可以在所有的x之間取得(兩倍)最大統計距離,其中

numpy.linalg.norm(A - B, numpy.inf)