如何计算2D矩阵之间的距离

时间:2016-06-28 12:02:44

标签: python algorithm matrix machine-learning distance

Hello社区,

  

我是该网站的新成员(作为会员),因此如果您认为将其发布在http://datascience.stackexchange.com上可能会更好,请告诉我们。

我正在解决机器学习问题,该问题需要计算NxM维元素之间的距离,以便实现某些分类算法。

元素的属性是2D矩阵( Matr ),因此我正在寻找最佳算法来计算2D矩阵之间的距离。 正如您将看到的那样,“简单”的解决方案是将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. 余弦相似度,我必须将(NxM)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),也发现仅针对1D矩阵(Vector)实现,因此进行了以下转换:

    • 找到每个相应行之间的熵,然后平均它们。

      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)
      
    • 通过附加行然后计算总熵将(NxM)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),也发现仅针对1D矩阵(Vector)的实现,因此进行了与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)
      
    • 通过附加行然后计算总熵将(NxM)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]
      
  5. 上述所有工作都解决了我的问题,但我很好奇,因为我找不到更让我满意的具体内容。

    修改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 个答案:

答案 0 :(得分:0)

给定两个不同的转换矩阵AB以及概率分布x作为行向量,根据A执行一步后的分布为{{1}根据{{​​1}}一步后的分布是xA。您可以使用

将({1}}之间的所有B的最大统计距离(两倍)
xB