python_两两比较计算相似矩阵

发布时间 2023-10-13 11:59:46作者: 辰令

距离矩阵

余弦距离矩阵

 余弦距离使用两个向量夹角的余弦值作为衡量两个个体间差异的大小。相比欧氏距离,余弦距离更加注重两个向量在方向上的差异

点集内或矩阵内两两元素之间的距离矩阵

##简单使用两重循环
def compute_squared_EDM_method(X):
  # 获得矩阵都行和列,因为是行向量,因此一共有n个向量
  n,m = X.shape
  # 因为有n个向量,距离矩阵是n x n
  D = np.zeros([n, n])
  # 迭代求解向量的距离
  for i in range(n):
    for j in range(i+1, n):
      # la.norm()求向量都范数,默认是2范数
      D[i,j] = la.norm(X[i, :] - X[j, :])
      D[j,i] = D[i,j]
  return D

简单使用两重循环

 ###自定义的方式
dist = lambda p1, p2: sqrt(((p1-p2)**2).sum())
dm = np.asarray([[dist(p1, p2) for p2 in xy_list] for p1 in xy_list])

其他工具

 功能在python内或numpy内有现成的工具包
from scipy.spatial import distance
# 以下两种方式视情况选择
scipy.spatial.distance.pdist()
scipy.spatial.distance.cdist()

import numpy as np
from scipy.spatial.distance import pdist
from scipy.spatial.distance import squareform
A=np.array([[1,2],
            [3,4],
            [5,6],
            [7,8]])
# A是一个向量矩阵:euclidean代表欧式距离
distA=pdist(A,metric='euclidean')
# 将distA数组变成一个矩阵
distB = squareform(distA)

示例

import pandas as pd
from scipy.spatial import distance_matrix
    
data = [[5, 7], [7, 3], [8, 1]]
ctys = ['Boston', 'Phoenix', 'New York']
df = pd.DataFrame(data, columns=['xcord', 'ycord'], index=ctys)
pd.DataFrame(distance_matrix(df.values, df.values), index=df.index, columns=df.index)


###自定义的方式
dist = lambda p1, p2: sqrt(((p1-p2)**2).sum())
dm = np.asarray([[dist(p1, p2) for p2 in xy_list] for p1 in xy_list])

使用矩阵内积等方式

 矩阵內积双重循环

IOU计算,邻接矩阵法

 邻接矩阵是图论中的一种表示方法,它通过矩阵来表示一个图中每个结点之间的连通关系。
 在Python 中,你可以使用列表或NumPy 数组来生成邻接矩阵

图理论

 广度、深度优先路径搜索算法

参考

Python之向量(Vector)距离矩阵计算 https://zhuanlan.zhihu.com/p/77034615
https://zhuanlan.zhihu.com/p/354289511
 Python 图_系列之基于邻接矩阵实现广度、深度优先路径搜索算法 https://blog.51cto.com/gkcode/5174729
 Making a pairwise distance matrix in pandas https://drawingfromdata.com/pandas/clustering/making-a-pairwise-distance-matrix-in-pandas.html
 https://docs.scipy.org/doc/scipy/reference/spatial.html