python/sympy计算施密特正交化向量

2023-11-09

sympy的符号计算功能很强大,学习矩阵分析,重温了线性代数中施密特正交化的方法,正好可以用sympy解决一些计算问题。施密特正交化,也称 Gram-Schmidt 正交化过程 (Gram–Schmidt Orthogonalization Procedure). 该⽅法以Jørgen P. Gram 和 Erhard Schmidt 命名, 它更早出现在拉普拉斯和柯西的⽂章中[1],步骤如下:

(1) β 1 = α 1 \beta_1=\alpha_1 β1=α1
(2) β j = α j − ( β 1 , α j ) ( β 1 , β 1 ) β 1 − ( β 2 , α j ) ( β 2 , β 2 ) β 2 − ( β j − 1 , α j ) ( β j − 1 , β j − 1 ) β j − 1 \beta_j=\alpha_j-\frac{(\beta_1,\alpha_j)}{(\beta_1,\beta_1)}\beta_1-\frac{(\beta_2,\alpha_j)}{(\beta_2,\beta_2)}\beta_2-\frac{(\beta_{j-1},\alpha_j)}{(\beta_{j-1},\beta_{j-1})}\beta_{j-1} βj=αj(β1,β1)(β1,αj)β1(β2,β2)(β2,αj)β2(βj1,βj1)(βj1,αj)βj1
(3) η j = β j ∣ ∣ β j ∣ ∣ , j = 1 , 2 , . . . , m \eta_j=\frac{\beta_j}{||\beta_j||},j=1,2,...,m ηj=βjβj,j=1,2,...,m

例如求3个无关列向量的正交向量组:
α 1 = ( 1 , 2 , 3 ) T \alpha_1=(1,2,3)^T α1=(1,2,3)T, α 2 = ( 2 , 1 , 3 ) T \alpha_2=(2,1,3)^T α2=(2,1,3)T, α 3 = ( 3 , 2 , 1 ) T \alpha_3=(3,2,1)^T α3=(3,2,1)T
手动计算可以按照前面的步骤求解,下面介绍sympy相关函数,很简单,如下面代码所示:

from sympy import *

L = [Matrix([1,2,3]), Matrix([2,1,3]), Matrix([3,2,1])]

o1=GramSchmidt(L)

o1
Out[4]: 
[Matrix([
 [1],
 [2],
 [3]]), Matrix([
 [15/14],
 [ -6/7],
 [ 3/14]]), Matrix([
 [ 4/3],
 [ 4/3],
 [-4/3]])]

o2=GramSchmidt(L,True) # 标准化

o2
Out[6]: 
[Matrix([
 [  sqrt(14)/14],
 [   sqrt(14)/7],
 [3*sqrt(14)/14]]), Matrix([
 [ 5*sqrt(42)/42],
 [-2*sqrt(42)/21],
 [   sqrt(42)/42]]), Matrix([
 [ sqrt(3)/3],
 [ sqrt(3)/3],
 [-sqrt(3)/3]])]

函数GramSchmidt(vlist, orthonormal=False),将参数orthonormal设为True 计算结果便是标准正交基,记作:
( α i , α j ) = δ i j (\alpha_i,\alpha_j)=\delta_{ij} (αi,αj)=δij

注意,scipy.linalg包也提供了函数orth()来计算标准正交基,但是根据文档介绍其使用的方法是SVD奇异值分解,所以求解结果和sympy的不一样

from scipy.linalg import *
import numpy as np

a=np.array([[1,2,3],[2,1,3],[3,2,1]])

a
Out[7]: 
array([[1, 2, 3],
       [2, 1, 3],
       [3, 2, 1]])

a=a.T

a
Out[9]: 
array([[1, 2, 3],
       [2, 1, 2],
       [3, 3, 1]])

orthogonal_procrustes?

orth(a)
Out[11]: 
array([[-0.56525513,  0.68901653,  0.45358886],
       [-0.47238331,  0.18041382, -0.86273105],
       [-0.67626966, -0.70193096,  0.22350007]])

验证:

In [11]: m=b[:,0]

In [12]: n=b[:,1]

In [13]: p=b[:,2]

In [14]: m.dot(n)
Out[14]: -5.551115123125783e-17

In [15]: m.dot(p)
Out[15]: -2.7755575615628914e-17

In [16]: sum([i**2 for i in m])
Out[16]: 0.9999999999999993

关键点

(1)需要正交化的向量写成矩阵的时候应该注意是矩阵每一列代表原来需要正交化的向量;
(2)数学中向量一般都是列向量,书本上为了节省空间通常写作横向量,严谨点的写法应该是横向量后面添加转置符号,但发现目前很多书籍、教材等都没有特意说明,在机器学习里面有很多以向量、矩阵表达的内容,很容易搞得晕头转向;
(3)正交这个概念在数学中很多方面都有涉及,例如

  • 正交向量:向量内积为零, ( x , y ) = 0 (\mathbf{x},\mathbf{y})=0 (x,y)=0
  • 正交矩阵:有 A ∈ R n × n A \in \mathbb{R}^{n \times n} ARn×n,若 A T A = I A^{\rm{T}}A=I ATA=I,即 A − 1 = A T A^{\rm{-1}}=A^{\rm{T}} A1=AT,称 A A A为正交矩阵
  • 正交函数:如果 ( f , g ) = ∫ a b ρ ( x ) f ( x ) g ( x ) d x = 0 (f,g)=\int_a^b\rho(x)f(x)g(x)dx=0 (f,g)=abρ(x)f(x)g(x)dx=0,则称函数 f f f g g g在区间 [ a , b ] [a,b] [a,b]上带权 ρ ( x ) \rho(x) ρ(x)正交
    参考资料
    [1] 黄正华 武汉大学http://aff.whu.edu.cn/huangzh/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python/sympy计算施密特正交化向量 的相关文章

随机推荐

  • 谈谈数据仓库架构的发展和分类

    在此不做评述 仅供参考 以下内容均引自于ttnn网站 详细链接如下 http groups google com group ttnn lnk li 1发件人 Jerome 查看个人资料日期 2006年12月10日 星期日 下午4时36分电
  • Typora无法打开提示安装新版本解决办法

    最近使用Typora时 发现打开时提示如下错误 The beta version of typora is expired please download and install a newer version 并且会自动跳转到https
  • k8s-hostpath存储使用

    参考网址 https github com nailgun k8s hostpath provisioner 运行k8s hostpath provisioner 下载github项目 git clone https github com
  • AlexNet网络结构详解(含各层维度大小计算过程)与PyTorch实现

    AlexNet网络结构详解 含各层维度大小计算过程 与PyTorch实现 AlexNet网络架构 1 模型架构 2 AlexNet网络架构的贡献 3 Pytorch代码实现 AlexNet网络架构 1 模型架构 AlexNet网络结构相对简
  • 使用Go实现GoF的23种设计模式(一)

    前言 从1995年GoF提出23种设计模式到现在 25年过去了 设计模式依旧是软件领域的热门话题 在当下 如果你不会一点设计模式 都不好意思说自己是一个合格的程序员 设计模式通常被定义为 设计模式 Design Pattern 是一套被反复
  • python可以实现手机定位吗_用Python实现通讯定位功能——PYBOARD V702评测

    1 boot py 这个脚本文件执行时 开发板启动 它设置了开发板的多个选项参数 2 Main py 在boot py运行后被执行 包含python程序的主要脚本 3 Pybcdc inf Windows驱动文件 用来配置USB端口 4 R
  • Linux网络编程基础知识

    网络编程 本质 使用操作系统的接口函数 使得应用程序具备收发网络数据的能力 核心概念 协议 为进行数据通信而预定义的数据规则 地址 网络通信中的用于标识设备的整数值 端口号 设备为收发数据而指定的数值 用于标识具体链接 可理解为 设备中用于
  • 关于2020HUEL_ACM暑期集训八月集训计划变更

    时间飞逝若白驹过隙 转眼2020疫情期间这个特殊的暑假已经过去一半 因为一些原因我们第二个月不与hky一起训练了 正常周赛 咱们的集训计划也会发生相应的改变 具体如下 时间安排 八月共四个周 第一周 继续学习最小生成树 2天 和最短路 4天
  • 屏幕适配方案

    屏幕dp px换算公式 其中width height为我们的手机屏幕宽高 即1920 1080 inch为对角尺寸 常见5 5寸 5 0寸等 public void getAndroiodScreenProperty WindowManag
  • 机器学习集成模型学习——投票集成Voting(二)

    Voting集成 投票机制就是多个模型分别预测 然后投票 票数最高的就是整个模型最后的效果 案例代码 from sklearn linear model import LogisticRegression from sklearn naiv
  • github访问很慢的问题

    github访问很慢的问题 公司一直用着svn 之前也的确用过github的版本管理 但是一直都是可视化的操作 这几天面试了几名前端 问了一下发现他们在之前的公司里都是用git的 于是今天好好温故了一下怎么用命令行进行一下git操作 首先要
  • R语言合并数据框的行与列

    合并数据框的行与列 大家好 这里是想做生信大恐龙 的生信小白 先赞后看养成习惯 还没关注的小伙伴点点关注不迷路 今天熟悉数据操作中的数据合并 数据合并 合并数据框的行与列 一 rbind 和cbind 函数 二 merge 函数 总结 一
  • 【日常实用】git rebase合并多笔为一笔提交

    前言 在日常开发中 经常会遇到master分支和自己的分支已经渐行渐远 分叉久已 此时并不能用get merge 的方式合并代码了 这个时候想要将多笔提交合并成一笔并解决好冲突提交话 get rebase 就派上了用场了 举例说明 一 新建
  • kibana使用

    数据导出 查询完数据后 数据量很大 我们要对数据进行分析 可以导出来用excel分析 导出很简单 就是先保存后分享就可以了 使用kibana界面导出数据 我们要进行重复行统计的时候 可以使用excel的数据透视表 很强大 excel如何快速
  • EM算法

    尽管最大似然估计 MLE 和EM都可以找到 最佳拟合 参数 但是它们查找模型的方式却大不相同 MLE首先累积所有数据 然后使用该数据构建最可能的模型 EM首先对参数进行猜测 考虑丢失的数据 然后对模型进行调整以适合猜测和观察到的数据 该算法
  • 【IDEA】IDEA git log 点击 没有代码变更

    文章目录 1 概述 1 概述 Git log 下查看分支提交的信息 结果只有提交信息 没有代码变更信息 如下图 这里有坑 不是消失了 是下拉框拉倒最上面了 这里有条线 往下拉就能看到了
  • 使用kubeadm工具升级kubernetes

    一 背景 kubeadm部署的kubernetes集群进行升级 通常先升级控制节点 控制节点升级完成后再升级工作节点 本博文只升级了控制节点 工作节点按照相同的流程进行升级即可 环境说明 主机名 节点 11 0 1 200 k8s客户端操控
  • show_space存储过程脚本

    CREATE OR REPLACE PROCEDURE show space p segname 1 IN VARCHAR2 p type 1 IN VARCHAR2 DEFAULT TABLE p space IN VARCHAR2 DE
  • 程序下载微云

    https share weiyun com 5OxmUiI
  • python/sympy计算施密特正交化向量

    sympy的符号计算功能很强大 学习矩阵分析 重温了线性代数中施密特正交化的方法 正好可以用sympy解决一些计算问题 施密特正交化 也称 Gram Schmidt 正交化过程 Gram Schmidt Orthogonalization