距离矩阵

在看 k-center 的时候发现自己对其距离矩阵的计算不是很清楚,于是在此记录。

距离矩阵的计算及 Python 实现

给定 m×nm\times n 矩阵 XX, X=[x1,x2,...,xn]X = [x_1, x_2,...,x_n], 这里第 ii 列向量 xix_imm 维向量,任务是计算出一个 n×nn\times n 矩阵,使得: Dij=xixj2D_{ij}=||x_i-x_j||^2

具体的,Dij=(xixj)T(xixj)=xiTxi2xiTxj+xjTxjD_{ij} = (x_i - x_j)^T(x_i-x_j)=x^T_ix_i-2x^T_ix_j+x^T_jx_j

用 Gram Matrix 表示,Dij=Gii2Gij+GjjD_{ij}=G_{ii}-2G_{ij}+G_{jj}

放在矩阵的尺度来看,D=H+K2GD = H + K -2G。 其中,Hij=Gii,Kij=GjjH_{ij} = G_{ii}, K_{ij} = G_{jj}

根据最后一个式子,计算的时候可以避免循环:

1
2
3
4
5
def compute_dist_matrix(X):
m,n = X.shape
G = np.dot(X.T, X)
H = np.tile(np.diag(G), (n, 1)) # Construct an array by repeating the number of times.
return H + H.T - 2*G

Reference:


距离矩阵
https://blog.superui.cc/machine-learning/distance-matrix/
作者
Superui
发布于
2021年11月5日
许可协议