文章目录

  • 思想
  • Python代码

思想

施密特正交化方法
将n维子空间中的任意一组基向量变换成标准正交向量。

假设有两个向量a⃗\vec{a}a和b⃗\vec{b}b,若要使两向量正交,则a⃗\vec{a}a不变,b⃗\vec{b}b可分解为b⃗\vec{b}b在a⃗\vec{a}a上的投影b′⃗\vec{b'}b′和误差向量e⃗\vec{e}e。因为a⃗\vec{a}a和e⃗\vec{e}e正交,所以将a⃗\vec{a}a和e⃗\vec{e}e标准化后,即为一组标准正交向量。

设初始矩阵为A=[a1,a2,a3,...,an]A=[a_1,a_2,a_3,...,a_n]A=[a1​,a2​,a3​,...,an​],aia_iai​是m×1\small m\times 1m×1的列向量(i∈(1,n))(i \in (1,n))(i∈(1,n)),则AAA是m×n\small m\times nm×n的矩阵。
设要求的一组正交向量为P=[p1,p2,p3,...,pn]P=[p_1,p_2,p_3,...,p_n]P=[p1​,p2​,p3​,...,pn​]。
首先可知p1=a1p_1=a_1p1​=a1​。
其次求p2p_2p2​,即求a2a_2a2​在p1p_1p1​投影的误差向量。
a2a_2a2​在p1p_1p1​投影向量的投影系数x21=(p1Tp1)−1p1Ta2x_{21}=(p_1^{T}p_1)^{-1}p_1^{T}a_2x21​=(p1T​p1​)−1p1T​a2​。
投影向量a2′=p1(p1Tp1)−1p1Tp2a'_2=p_1(p_1^{T}p_1)^{-1}p_1^{T}p_2a2′​=p1​(p1T​p1​)−1p1T​p2​。
p2=a2−a2′=a2−p1(p1Tp1)−1p1Ta2p_2=a_2-a'_2=a_2-p_1(p_1^{T}p_1)^{-1}p_1^{T}a_2p2​=a2​−a2′​=a2​−p1​(p1T​p1​)−1p1T​a2​。
再次求p2p_2p2​,即求a3a_3a3​在p1p_1p1​和p2p_2p2​构成的平面上投影的误差向量。
a3a_3a3​在p1p_1p1​和p2p_2p2​构成的平面上投影向量可以写成p1p_1p1​和p2p_2p2​的和。
投影系数为x31=(p1Tp1)−1p1Ta3x_{31}=(p_1^{T}p_1)^{-1}p_1^{T}a_3x31​=(p1T​p1​)−1p1T​a3​和x32=(p2Tp2)−1p2Ta3x_{32}=(p_2^{T}p_2)^{-1}p_2^{T}a_3x32​=(p2T​p2​)−1p2T​a3​
投影向量a3′=p1(p1Tp1)−1p1Ta3+p2(p2Tp2)−1p2Ta3a'_3=p_1(p_1^{T}p_1)^{-1}p_1^{T}a_3+p_2(p_2^{T}p_2)^{-1}p_2^{T}a_3a3′​=p1​(p1T​p1​)−1p1T​a3​+p2​(p2T​p2​)−1p2T​a3​。
p3=a3−a3′=a3−[p1(p1Tp1)−1p1Ta3+p2(p2Tp2)−1p2Ta3]p_3=a_3-a'_3=a_3-[p_1(p_1^{T}p_1)^{-1}p_1^{T}a_3+p_2(p_2^{T}p_2)^{-1}p_2^{T}a_3]p3​=a3​−a3′​=a3​−[p1​(p1T​p1​)−1p1T​a3​+p2​(p2T​p2​)−1p2T​a3​]。
……
用此方法迭代即可求出这一组正交向量PPP。
然后将其标准化。
设标准正交矩阵为Q=[q1,q2,q3,...,qn]Q=[q_1,q_2,q_3,...,q_n]Q=[q1​,q2​,q3​,...,qn​]。
标准化方法为qi=pi∣pi∣(i∈(1,n))q_i=\frac{p_i}{|p_i|}(i \in (1,n))qi​=∣pi​∣pi​​(i∈(1,n))

Python代码

import numpy as np
from scipy import linalgdef matmul_mulelms(*matrixs):'''连乘函数。将输入的矩阵按照输入顺序进行连乘。Parameters----------*matrixs : 矩阵按计算顺序输入参数.Raises------ValueError当参数个数小于2时,不满足乘法的要求.Returns-------res : 矩阵返回连乘的结果.'''if len(matrixs)<2:raise ValueError('Please input more than one parameters.')res = matrixs[0]for i in range(1,len(matrixs)):res = np.matmul(res, matrixs[i])return res# 3.3.4 施密特正交化
def One_Col_Matrix(array):'''确保为列矩阵Parameters----------array : 矩阵,向量或数组Raises------ValueError获得的参数不是1xn或mx1时,报错.Returns-------TYPE返回列矩阵.'''mat = np.mat(array)if mat.shape[0] == 1:return mat.Telif mat.shape[1] == 1:return matelse:raise ValueError('Please input 1 row array or 1 column array')def Transfor_Unit_Vector(matrix):'''将每列都转换为标准列向量,即模等于1Parameters----------matrix : 矩阵Returns-------unit_mat : 矩阵每列模都为1的矩阵.'''col_num = matrix.shape[1]# 初始化为零矩阵unit_mat = np.zeros((matrix.shape))for col in range(col_num):vector = matrix[:,col]unit_vector = vector / np.linalg.norm(vector)unit_mat[:,col] = unit_vector.Treturn unit_matdef Gram_Schmidt_Orthogonality(matrix):'''施密特正交化方法Parameters----------matrix : 矩阵Returns-------标准正交化矩阵。'''col_num = matrix.shape[1]# 第一列无需变换gram_schmidt_mat = One_Col_Matrix(matrix[:,0])for col in range(1,col_num):raw_vector = One_Col_Matrix(matrix[:,col])orthogonal_vector = One_Col_Matrix(matrix[:,col])if len(gram_schmidt_mat.shape)==1:# 当矩阵为列向量是,shape的返回值为“(row,)”,没有col的值gram_schmidt_mat_col_num = 1else:gram_schmidt_mat_col_num = gram_schmidt_mat.shape[1]for base_vector_col in range(gram_schmidt_mat_col_num):base_vector = gram_schmidt_mat[:,base_vector_col]prejective_vector = matmul_mulelms(base_vector, linalg.inv(np.matmul(base_vector.T,base_vector)), base_vector.T, raw_vector)orthogonal_vector = orthogonal_vector - prejective_vectorgram_schmidt_mat = np.hstack((gram_schmidt_mat,orthogonal_vector))#print(gram_schmidt_mat)return Transfor_Unit_Vector(gram_schmidt_mat)
### 测试用例
A = np.array([[1,1,1],[-1,0,-1],[0,-1,1]])
print(Gram_Schmidt_Orthogonality(A))

【线性代数】施密特正交化方法——Python实现相关推荐

  1. 施密特正交化_机器学习 线性代数基础 | 3.3施密特正交化:寻找最佳投影基

    ▼ 更多精彩推荐,请关注我们 ▼3.3  施密特正交化:寻找最佳投影基 在本章的前面两个小节里,我们通过向指定子空间进行投影,探索到了如何寻找"最近距离"的有效途径,通过理论分析和 ...

  2. matlab格拉姆施密特,改进的格拉姆-施密特正交化(modified Gram-Schmidt Process)

    最近在重新学习线性代数,学习的教材是MIT Gilbert Strang 教授的<INTRODUCTION TO LINEAR ALGEBRA>,在第4.4章节格拉姆-施密特正交化时,书中 ...

  3. java实现施密特正交化

    今天线代课刚学了这个 施密特正交化 然后今天老师布置的作业就是这个 我这一看,这计算量,就我这计算水平,难免会有算错的 所以就自己写了个程序帮我计算,啊不对,是帮我验证我算的对不对 程序是用java写 ...

  4. c语言实现向量组的标准/规范正交基(施密特正交化)

    问题:任意一个向量组求标准正交基,尽量用C/C++. 思路:下面是我找的课本上面的算向量组标准正交基的方法.第一步,用施密特正交化方法,使向量组正交:第二步,将向量组各向量单位化. 代码实现: #in ...

  5. 施密特正交化的几何解释与代码实现

    正交化,简单地说,就是指把若干向量转化成互相之间夹角为90度的状态,这样互相之间没有影响.否则,不满足正交性的因子,相互会影响各自的回归系数,从而可能导致回归系数过大等估计误差,从而影响该因子的评价. ...

  6. 线性代数学习笔记——第七十讲——格拉姆—施密特(Gram-Schmidt)正交化方法

    1. 格拉姆-施密特(Gram-Schmidt)正交化方法详解 2. 格拉姆-施密特(Gram-Schmidt)正交化示例

  7. 漫步线性代数十七——正交基和格拉姆-施密特正交化(上)

    对于一个正交基,每个向量和其他所有向量垂直,坐标轴就是互相正交的.我们还可以进一步改善:每个向量除以它的长度得到单位向量,这样的话正交基变成了标准正交基: 16.如果 qTiqj={01i≠j,给出正 ...

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

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

  9. 漫步线性代数十八——正交基和格拉姆-施密特正交化(下)

    格拉姆-施密特 声明:以后博主会把文章的pdf版本陆续发布到的网上,免费供大家下载 正交基和格拉姆-施密特正交化 假设我们有是是三个无关向量a,b,ca,b,c,如果他们是正交的,那么会多问题都变得容 ...

最新文章

  1. OpenCV直线拟合检测
  2. [导入]IIS无法显示asp页面
  3. 你真的了解JavaScript的比较运算符(==,!=,===,!===,=,=,,)吗?
  4. Pandas常用技巧总结
  5. 开始→运行→命令集锦
  6. 专辑一:爱之初体验(初级)
  7. android 自定义dialog iphone,Android用DialogFragment实现iphone样式的圆角对话框 – 思,无邪...
  8. JS编写一个函数,实现传入一个不定长度字符串,查找出重复次数前n名的字符并分别统计其次数
  9. Hive笔记之JOIN的左外链接和右外链接
  10. 论文浅尝 | 将文本建模为关系图,用于联合实体和关系提取
  11. 复古海报设计灵感配色,“一见即知”的感觉
  12. springweb 初步理解
  13. NOD32 2.7、3.0最新升级ID 每天实时同步更新
  14. Java核心技术卷一基础知识-第3章-Java的基本程序设计结构-读书笔记
  15. 手机硬件电路英文缩写
  16. Kafka踩坑 - Couldn't find leaders for Set
  17. 2021-05-12 MongoDB面试题 在MongoDB中如何排序
  18. 心路历程:当win10遇上win7激活程序...请默哀
  19. PMI考试收获的学习思维
  20. docker 命令大全

热门文章

  1. docker使用小记——docker安装es+ik分词器+拼音分词器+kibana
  2. 射频信号对喇叭的影响
  3. C语言 define 关键字
  4. Excel表格里面做省份,市(二级联动效果)
  5. 倍压整流电路图大全(九款倍压整流电路设计原理图详解)
  6. xgboost 调参经验
  7. 晶体管计算机芯片原理图,芯片都是由晶体管构成的,芯片难制造是因为晶体管吗?...
  8. W5500EVB通过上位机配置+固件升级
  9. 为什么银行查不到你的身份信息?
  10. Flutter从入门到精通之Dart基础篇(一)