X_train_vec_squared = np.diag( np.dot(self.X_train, self.X_train.transpose()) )
X_X_train = -2*np.dot(self.X_train, X.transpose())
dists = np.sqrt( (X_X_train + X_vec_squared).transpose() + X_train_vec_squared )
X is np with(500,1000) X_train is np with (5000,1000) 对于X中的每一个元素(一行),和X_train中每一个元素,进行norm2运算
最终得到(500,5000)dist矩阵。
eg:
>>> a=np.array([[1,2],[2,3],[3,3]])
>>> b=np.array([[3,2],[1,3],[4,3],[1,1]])
>>> a_vec_squared = np.diag( np.dot(a, a.transpose()) )
>>> a_vec_squared
array([ 5, 13, 18])
>>> b_train_vec_squared = np.diag( np.dot(b, b.transpose()) )
>>> b_train_vec_squared
array([13, 10, 25, 2])
>>> ab_train = -2*np.dot(b, a.transpose())
>>> ab_train
array([[-14, -24, -30],
[-14, -22, -24],
[-20, -34, -42],
[ -6, -10, -12]])
>>> dists = np.sqrt( (ab_train + a_vec_squared).transpose() + b_train_vec_squared )
>>> dists
array([[ 2. , 1. , 3.16227766, 1. ],
[ 1.41421356, 1. , 2. , 2.23606798],
[ 1. , 2. , 1. , 2.82842712]])