python - 如何计算二维矩阵之间的距离

标签 python algorithm matrix machine-learning distance

你好社区,

I'm new (as a member) to the site, so if you think it might be better to post it on http://datascience.stackexchange.com, let me know.

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

该元素的属性是一个二维矩阵 (Matr),因此我正在寻找计算二维矩阵之间距离的最佳算法。 正如您将在下面看到的,“简单”的解决方案是将 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) 二维矩阵转换为 (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 divergence ( wiki ), 也发现了仅对一维矩阵 (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) 二维矩阵转换为 (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)
      
    • 通过追加行然后计算总熵,将 (NxM) 二维矩阵转换为 (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

考虑到这一点,最终目标是对不同的代码系列进行分类。该系列没有相同的长度,但由相同的代码制成。因此,转移概率矩阵在每种情况下都具有相同的维度。 我最初的问题是为了找到最合适的距离算法,这将产生最好的分类结果。

最佳答案

给定两个不同的转移矩阵AB和一个概率分布x作为行向量,一步后的分布根据AxA,根据B一步分布后为xB。您可以在所有 x 之间采用(两倍)最大统计距离

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

关于python - 如何计算二维矩阵之间的距离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38075714/

相关文章:

python - 以 'r+' 模式打开文件会给出奇怪的输出

python - 如何实现逻辑和数组长度?

python - Tkinter Canvas 将项目移动到顶层

c - 当所有元素都相同时快速排序复杂度?

matlab - 如何找到多个矩阵中对应元素的最大值?

arrays - 逐行填充多维数组

python - 定义仅在矩形子区域中具有非零元素的二维矩阵

python - 选择无行时发出的 PyQt QTableWidget 信号

python - 拓扑排序中的 indegrees 用 Kahn 算法解决 CouseSchedule

algorithm - 图的团数