施密特正交化的几何解释与代码实现
正交化,简单地说,就是指把若干向量转化成互相之间夹角为90度的状态,这样互相之间没有影响。否则,不满足正交性的因子,相互会影响各自的回归系数,从而可能导致回归系数过大等估计误差,从而影响该因子的评价。
这里讨论最常见的施密特正交化。
1、施密特正交化的几何解释
给定一组基α1,α2,…,αn,将其变换成另外一组正交基β1,β2,…,βn,使这两组基等价
施密特正交化方法:
1)在二维的情况下
此时有两个向量α、β,其中 α 在 β 上的投影向量为
如图红色部分即为投影部分
则蓝色部分向量为
对应两个向量的施密特法则
可见蓝色向量 β2 与β1是垂直的。
以上公式也可以推算得到。
先令向量 β1 = α1,只要找到另外一个新的向量 β2,使得 β2 与 β1 内积为0,这两个向量就是正交的了。如何寻找?
根据向量之间的运算关系,因为 β2 由 β1、α2 得到,则我们可以设
β2=k1β1+k2β2\beta_2=k_1\beta_1+k_2\beta_2β2=k1β1+k2β2
因为 β2 与 β1 内积为0,因此
(β1,β2)=(β1,k1β1+k2β2)=0(\beta_1,\beta_2)=(\beta_1,k_1\beta_1+k_2\beta_2)=0(β1,β2)=(β1,k1β1+k2β2)=0
则有
⇒k1(β1,β1)+k2(β2,α1)=0\Rightarrow k_1(\beta_1,\beta_1)+k_2(\beta_2,\alpha_1)=0⇒k1(β1,β1)+k2(β2,α1)=0
⇒k1=−k2(α2,β1)(β1,β1)\Rightarrow k_1=-\frac{k_2(\alpha_2,\beta_1)}{(\beta_1,\beta_1)}⇒k1=−(β1,β1)k2(α2,β1)
因此
β2=k2α2−k2(α2,β1)(β1,β1)α1\beta_2=k_2\alpha_2-\frac{k_2(\alpha_2,\beta_1)}{(\beta_1,\beta_1)}\alpha_1β2=k2α2−(β1,β1)k2(α2,β1)α1
令 k = 1,就得到了新的正交向量 β1\beta_1β1与β2\beta_2β2。
举个栗子(没看错,是举着栗子。。。),现有矩阵 [a, b]
a=[111]a=\left[ \begin{matrix} 1\\ 1 \\ 1\\ \end{matrix} \right]a=⎣⎡111⎦⎤,b=[102]b=\left[\begin{matrix} 1\\0\\2\\ \end{matrix} \right]b=⎣⎡102⎦⎤
根据以上公式有:
A = a
B=b−ATbATAAB=b-\frac{A^Tb}{A^TA}AB=b−ATAATbA
代入具体数值,有
A=[111]A=\left[ \begin{matrix} 1\\ 1 \\ 1\\ \end{matrix} \right]A=⎣⎡111⎦⎤
B=[102]−[111][102][111][111][111]=[0−11]B=\left[\begin{matrix} 1\\0\\2\\ \end{matrix} \right]-\frac{[1 1 1]\left[\begin{matrix} 1\\0\\2\\ \end{matrix} \right]}{[1 1 1]\left[ \begin{matrix} 1\\ 1 \\ 1\\ \end{matrix} \right]}\left[ \begin{matrix} 1\\ 1 \\ 1\\ \end{matrix} \right]=\left[ \begin{matrix} 0\\ -1 \\ 1\\ \end{matrix} \right]B=⎣⎡102⎦⎤−[111][111][111][102]⎣⎡111⎦⎤=⎣⎡0−11⎦⎤
2)在三维的情况下
即向量个数为3时,对应三维空间的几何解释如图 。
其中绿色的为需要正交的原始基αi(α1是红色的因为α1同时也是β1)
将二维得到的β2平移到坐标原点出后则α3在xoy平面的投影即是
即α3在β1和β2上的投影组成的平行四边形的斜边,则得到的β3就是α3与该投影的向量差,即红色部分的β3,显然可以看出来β1,β2,β3是正交的。
从推算的角度,我们可以令
β3=k1β1+k2β2+k3α3\beta_3=k_1\beta_1+k_2\beta_2+k_3\alpha_3β3=k1β1+k2β2+k3α3
要让(β1,β3)=0(\beta_1,\beta_3)=0(β1,β3)=0,需要
(β1,β3)=k1(β1,β1)+k2(β1,β2)+k3(β1,α3)=0(\beta_1,\beta_3)=k_1(\beta_1,\beta_1)+k_2(\beta_1,\beta_2)+k_3(\beta_1,\alpha_3)=0(β1,β3)=k1(β1,β1)+k2(β1,β2)+k3(β1,α3)=0
⇒k1=−k3(α3,β1)(β1,β1)\Rightarrow k_1=-\frac{k_3(\alpha_3,\beta_1)}{(\beta_1,\beta_1)}⇒k1=−(β1,β1)k3(α3,β1)
要让(β2,β3)=0(\beta_2,\beta_3)=0(β2,β3)=0,需要
(β2,β3)=k1(β1,β2)+k2(β2,β2)+k3(β2,α3)=0(\beta_2,\beta_3)=k_1(\beta_1,\beta_2)+k_2(\beta_2,\beta_2)+k_3(\beta_2,\alpha_3)=0(β2,β3)=k1(β1,β2)+k2(β2,β2)+k3(β2,α3)=0
⇒k2=−k3(α3,β2)(β2,β2)\Rightarrow k_2=-\frac{k_3(\alpha_3,\beta_2)}{(\beta_2,\beta_2)}⇒k2=−(β2,β2)k3(α3,β2)
因此
β3=k3α3−k3(α3,β1)(β1,β1)β1−k3(α3,β2)(β2,β2)β2\beta_3=k_3\alpha_3-\frac{k_3(\alpha_3,\beta_1)}{(\beta_1,\beta_1)}\beta_1-\frac{k_3(\alpha_3,\beta_2)}{(\beta_2,\beta_2)}\beta_2β3=k3α3−(β1,β1)k3(α3,β1)β1−(β2,β2)k3(α3,β2)β2
三维以上空间里的公式以此类推。
2、代码实现
import numpy as np
A = np.array([[1,1,0],[0,1,1],[1,0,1]],dtype=float)
Q = np.zeros_like(A)
m, n = Q.shape
cnt = 0
for a in A.T:u = np.copy(a)for i in range(0, cnt):u -= np.dot(np.dot(Q[:, i].T, a), Q[:, i]) # 减去待求向量在以求向量上的投影e = u / np.linalg.norm(u) # 归一化Q[:, cnt] = ecnt += 1
print(Q)
或者
from scipy import linalg
A = np.array([[1,1,0],[0,1,1],[1,0,1]])
a = linalg.orth(A)
print(np.array(linalg.orth(A),dtype=float))
print(np.dot(A,A.T)-1)
参考:
1、施密特正交化的几何解释
2、自己动手写施密特正交化
3、揭秘施密特正交化
施密特正交化的几何解释与代码实现相关推荐
- 施密特正交化的几何解释
向量投影公式推导:https://blog.csdn.net/weixin_33991418/article/details/85459591 施密特正交化的几何解释 :https://blog.cs ...
- 矩阵论 施密特正交化的几何解释_最直观图解法
线性代数中最头疼的公式恐怕就是施密特正交化了.但其实搞清楚它的几何原理之后公式的记忆就简单多了,数学重在理解! 给定一组基α1,α2,...,αnα1,α2,...,αn 首先清除一个公式,两个向量α ...
- 数值计算——施密特正交化
施密特正交化单位正交基C++代码 使用施密特正交化得出单位正交基的完整代码 #include <time.h> #include <iostream> #include < ...
- 施密特正交化及QR分解(附实现代码)
施密特正交化 施密特正交化(Gram-Schmidt Orthogonality)是常用的求欧式空间正交基的方法.给定一个线性无关向量组a1,a2,...,ama_1,a_2,...,a_ma1,a ...
- matlab格拉姆施密特,改进的格拉姆-施密特正交化(modified Gram-Schmidt Process)
最近在重新学习线性代数,学习的教材是MIT Gilbert Strang 教授的<INTRODUCTION TO LINEAR ALGEBRA>,在第4.4章节格拉姆-施密特正交化时,书中 ...
- 5.5 QR分解一:施密特正交化
文章目录 计算方法 python实现 数据测试 计算方法 矩阵的正交三角分解QR decomposition,简称QR分解,是找到两个矩阵Q和R使得 A = Q R A=QR A=QR,Q是正交矩 ...
- python/sympy计算施密特正交化向量
sympy的符号计算功能很强大,学习矩阵分析,重温了线性代数中施密特正交化的方法,正好可以用sympy解决一些计算问题.施密特正交化,也称 Gram-Schmidt 正交化过程 (Gram–Schmi ...
- java实现施密特正交化
今天线代课刚学了这个 施密特正交化 然后今天老师布置的作业就是这个 我这一看,这计算量,就我这计算水平,难免会有算错的 所以就自己写了个程序帮我计算,啊不对,是帮我验证我算的对不对 程序是用java写 ...
- c语言实现向量组的标准/规范正交基(施密特正交化)
问题:任意一个向量组求标准正交基,尽量用C/C++. 思路:下面是我找的课本上面的算向量组标准正交基的方法.第一步,用施密特正交化方法,使向量组正交:第二步,将向量组各向量单位化. 代码实现: #in ...
最新文章
- 在OpenCV环境下写的两个图像平移C和C++源代码
- Asp.NET获取文件及其路径
- 本地连接虚拟机的redis
- 如何成为python 数据分析师_如何七周成为数据分析师20:了解和掌握Python的函数...
- 腾讯AI Lab副主任俞栋:语音识别领域的现状与进展
- [C++STL]string容器用法介绍
- java websocket client,java基础面试笔试题
- Kotlin — 适用于数据科学
- 闪字在线制作php源码,闪光字图片制作 在线制作图片加闪光字
- VMware虚拟机安装与使用
- 设置google浏览器为黑色底色
- 卷积神经网络之 - 残差⽹络(RESNET)
- 计算机组成与系统结构(课程设计)
- Delphi中的线程类--之(1)
- 西电、成电的风雨往事
- Yahoo Programming Contest 2019 D - Ears
- EMI+ EMC基础知识
- 黑马培训的点滴(前端)
- 题解 - CF662C Binary Table
- ai智能外呼系统营销服务一体化中的必备工具