gram矩阵_(1)Python之向量(Vector)距离矩阵计算

本文介绍了Python中计算矩阵自身向量和两个矩阵之间距离矩阵的五种方法,包括直接循环、矩阵内积、避免循环内的点积运算、避免循环以及使用scipy库。还探讨了格拉姆矩阵的概念及其性质,提供了相关数学知识和代码示例。
摘要由CSDN通过智能技术生成

1.引言

距离矩阵是一个包含一组点两两距离的矩阵(即 二维数组)。因此给定

个欧几里得空间中的点,其距离矩阵就是一个非负实数作为元素的
的对称矩阵。在机器学习中距离矩阵都计算非常常见(只要涉及距离计算,基本都需要计算距离矩阵),在本篇博客中就来记录一下如何使用Python都科学计算包numpy计算向量都距离矩阵。
本篇博客讲解以行向量的欧氏距离为例讲解,但是同时给出了列向量的代码,距离矩阵的数学表达为:

给定

阶矩阵
,满足
中第
行向量是
维向量(注意这里是行向量),使得:

2. 矩阵自身(行)向量之间的距离矩阵计算

这里提供4种方法,需要使用到以下Python库:

2.1第一种方法:简单使用两重循环

# 行向量
#[[1,2,3],   
# [4,5,6]] 
# 得到
#[[ 0,     5.196]
# [ 5.196, 0    ]]
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

# 列向量
#[[1,2,3],  
# [4,5,6]] 
# 得到
#[[0,     1.414, 2.828]
# [1.414, 0,     1.414]
# [2.828, 1.414, 0    ]]
def compute_squared_EDM_method(X):
  # 获得矩阵都行和列,因为是列向量,因此一共有m个向量
  n,m = X.shape
  # 因为有m个向量,距离矩阵是m x m
  D = np.zeros([m, m])
  # 迭代求解向量的距离
  for i in range(m):
    for j in range(i+1, m):
      # la.norm()求向量都范数,默认是2范数(注意这里是列向量)
      D[i,j] = la.norm(X[:, i] - X[:, j])
      D[j,i] = D[i,j] #*1
  return D

由于是计算矩阵自身向量之间的距离,所以结果是一个对称的三角矩阵。注意1行代码处所做的优化。在上述方法中我们使用了两层循环,因此代码虽不简洁,但十分易懂。

2.2 第二种方法:矩阵內积双重循环

在第一种方法中,我们使用了numpynorm这个方法,这个方法从数学上讲,其计算公式是:

但是从另一方面来讲,我们可以先求点积运算,然后在进行求根运算:

上述运算可以使用点积(即矩阵内积)来计算:

# 这里是列向量
D[i,j] = np.sqrt(np.dot(X[:,i]-X[:,j],(X[:,i]-X[:,j]).T))

现在代码变化为:

# 行向量
#[[1,2,3],   
# [4,5,6]] 
# 得到
#[[ 0,     5.196]
# [ 5.196, 0    ]]
def compute_squared_EDM_method2(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):
      # 因为是行向量,这里是行索引
      d = X[i,:] - X[j,:]
      # 向量內积运算,并进行求根
      D[i,j] = np.sqrt(np.dot(d, d))
      D[j,i] = D[i,j]
  return D
  
# 列向量
#[[1,2,3],  
# [4,5,6]] 
# 得到
#[[0,     1.414, 2.828]
# [1.414, 0,     1.414]
# [2.828, 1.414, 0    ]]
def compute_squared_EDM_method2(X):
  # 获得矩阵都行和列,因为是列向量,因此一共有m个向量
  n,m = X.shape
  # 因为有m个向量,距离矩阵是m x m
  D = np.zeros([m, m])
  # 迭代求解向量的距离
  for i in range(m):
    for j in range(i+1, m):
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值