在看 k-center 的时候发现自己对其距离矩阵的计算不是很清楚,于是在此记录。
距离矩阵的计算及 Python 实现
给定 m × n m\times n m × n 矩阵 X X X , X = [ x 1 , x 2 , . . . , x n ] X = [x_1, x_2,...,x_n] X = [ x 1 , x 2 , ... , x n ] ,
这里第 i i i 列向量 x i x_i x i 是 m m m 维向量,任务是计算出一个 n × n n\times n n × n 矩阵,使得:
D i j = ∣ ∣ x i − x j ∣ ∣ 2 D_{ij}=||x_i-x_j||^2 D ij = ∣∣ x i − x j ∣ ∣ 2 。
具体的,D i j = ( x i − x j ) T ( x i − x j ) = x i T x i − 2 x i T x j + x j T x j D_{ij} = (x_i - x_j)^T(x_i-x_j)=x^T_ix_i-2x^T_ix_j+x^T_jx_j D ij = ( x i − x j ) T ( x i − x j ) = x i T x i − 2 x i T x j + x j T x j 。
用 Gram Matrix 表示,D i j = G i i − 2 G i j + G j j D_{ij}=G_{ii}-2G_{ij}+G_{jj} D ij = G ii − 2 G ij + G jj 。
放在矩阵的尺度来看,D = H + K − 2 G D = H + K -2G D = H + K − 2 G 。
其中,H i j = G i i , K i j = G j j H_{ij} = G_{ii}, K_{ij} = G_{jj} H 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 )) return H + H.T - 2 *G
Reference: