【数值计算方法(黄明游)】矩阵特征值与特征向量的计算(五):Householder方法【理论到程序】

文章目录

  • 一、Jacobi 旋转法
  • 二、Jacobi 过关法
  • 三、Householder 方法
    • 1. 旋转变换
      • a. 旋转变换的选择
      • b. 旋转变换的顺序
    • 2. Householder矩阵(Householder Matrix)
      • a. H矩阵的定义
      • b. H变换的几何解释
      • c. H变换的应用场景
    • 3. H变换过程详解
      • a. 过程介绍
      • b. 细节解析
    • 4. H变换例题解析
  • 四、Python实现
    • 调试过程

  矩阵的特征值(eigenvalue)和特征向量(eigenvector)在很多应用中都具有重要的数学和物理意义。Householder 矩阵和变换提供了一种有效的方式,通过反射变换将一个向量映射到一个标准的方向,这对于一些数值计算问题具有重要的意义。

  本文将详细介绍Householder方法的基本原理和步骤,并给出其Python实现。

一、Jacobi 旋转法

  Jacobi 旋转法的每一次迭代中,需要选择一个非对角元素最大的位置,然后构造相应的旋转矩阵,进行相似变换,使得矩阵逐渐对角化。

二、Jacobi 过关法

  Jacobi 过关法(Jacobi’s threshold method)是 Jacobi 旋转法的一种改进版本,其主要目的是减少计算工作和提高运行速度。该方法通过动态调整阈值,并根据阈值对非对角元素进行选择性的旋转变换,以逐步对角化对称矩阵。

三、Householder 方法

  如果对任意向量 z z z,我们可以将其分解为与 u u u 平行的分量 a u au au 和与 u u u 正交的分量 b v bv bv,即 z = a u + b v z = au + bv z=au+bv,那么 Householder 变换会将 z z z 变换为 − a u + b v -au + bv au+bv。这个变换可以理解为镜面反射,它不改变向量在与 u u u 正交的平面上的投影,但将向量沿着 u u u 的方向反射。数学表达式为:

H z = a u + b v → − a u + b v Hz = au + bv \rightarrow -au + bv Hz=au+bvau+bv

  这个性质使得 Householder 变换在一些数值计算的应用中非常有用,例如 QR 分解等。

1. 旋转变换

  在 Householder 方法中,通过一系列的正交相似变换,可以将实对称矩阵 (A) 转化为三对角矩阵。不同于 Jacobi 旋转法( a i j = a j i = 0 a_{ij}= a_{ji}=0 aij=aji=0),Householder 方法的旋转矩阵选择的角度使得 c i k = c k j = 0 c_{ik}= c_{kj}=0 cik=ckj=0

a. 旋转变换的选择

  对于实对称矩阵 A A A 中的元素 a i k a_{ik} aik ,选择适当的旋转角度 θ \theta θ ,可以使得 a i k a_{ik} aik 变为零。具体而言,选择 θ \theta θ 使得:
c i k = c k j = a i k cos ⁡ ( θ ) + a j k sin ⁡ ( θ ) = 0 c_{ik}= c_{kj}=a_{ik} \cos(\theta) + a_{jk} \sin(\theta) = 0 cik=ckj=aikcos(θ)+ajksin(θ)=0

  通过这样的选择,我们可以构造一个旋转矩阵 P i , j , k P_{i,j,k} Pi,j,k,该矩阵对应的正交相似变换可以将 c i k c_{ik} cik 变为零。这一过程实现了对实对称矩阵的正交相似变换,使得某些元素变为零,逐步实现了将矩阵转化为三对角形式。

在这里插入图片描述

b. 旋转变换的顺序

  在进行 Householder 变换时,旋转的顺序很重要。通常,可以选择按列进行变换。例如,对于 i = 2 , … , n − 1 i = 2, \ldots, n-1 i=2,,n1,可以依次选择 j = i + 1 , i + 2 , … , n j = i+1, i+2, \ldots, n j=i+1,i+2,,n,然后对每一对 ( i , j ) (i, j) (i,j) 进行正交相似变换,将 a i k a_{ik} aik 变为零。整个过程的迭代将会逐步将实对称矩阵 A A A 转化为三对角矩阵 C C C

2. Householder矩阵(Householder Matrix)

a. H矩阵的定义

  设 u u u为单位向量,即 ∥ u ∥ = 1 \|u\| = 1 u=1。定义 Householder 矩阵 H = I − 2 u u T H = I - 2uu^T H=I2uuT,其中 I I I 为单位矩阵。这个矩阵具有以下性质:

  • 对称性: H T = H H^T = H HT=H,即 Householder 矩阵是对称的。
  • 正交性: H T H = I H^T H = I HTH=I,即 Householder 矩阵是正交矩阵。
  • 保范性: 对于任意非零向量 x x x y y y,如果 ∥ x ∥ 2 = ∥ y ∥ 2 \|x\|^2 = \|y\|^2 x2=y2,则存在 Householder 矩阵 H H H,使得 H x = y Hx = y Hx=y
    • 考虑 Householder 矩阵对向量 u u u 的作用: H u = ( I − 2 u u T ) u = − u Hu = (I - 2uu^T)u = -u Hu=(I2uuT)u=u。这说明 Householder 矩阵将向量 u u u 反射到其负向量上
    • 对于任何与 u u u 正交的向量 v v v,有 H v = ( I − 2 u u T ) v = v Hv = (I - 2uu^T)v = v Hv=(I2uuT)v=v,即 Householder 矩阵保持与 u u u 正交的向量不变。
    • 因此对任意向量 z z z,设 z = a u + b v z = au + bv z=au+bv,那么 Householder 变换会将 z z z 变换为 − a u + b v -au + bv au+bv,数学表达式为:
      H z = a ( H u ) + b ( H v ) → − a u + b v Hz = a(Hu) + b(Hv) \rightarrow -au + bv Hz=a(Hu)+b(Hv)au+bv

b. H变换的几何解释

  可以将 Householder 变换视为镜面反射。考虑 u u u 为反射面上的单位法向量。对于任意 z z z,Householder 变换将 z z z 的投影反射到 − u -u u方向,同时保持投影在反射面上。

c. H变换的应用场景

  1. 矩阵三对角化: 在计算线性代数中,Householder 变换常用于将矩阵化为三对角形式,以便更容易进行特征值计算等操作。
  2. QR 分解: Householder 变换是计算 QR 分解的基本工具,用于将矩阵分解为一个正交矩阵和一个上三角矩阵的乘积。

3. H变换过程详解

a. 过程介绍

  对于矩阵 A A A 的某一列向量 a = ( a 1 , a 2 , … , a n ) T \mathbf{a} = (a_1, a_2, \ldots, a_n)^T a=(a1,a2,,an)T,如果我们想将向量的后 n − ( r + 1 ) n - (r+1) n(r+1)个分量化为零,即将 a \mathbf{a} a 变为 c = ( a 1 , a 2 , … , a r , − sign ( a r + 1 ) s , 0 , … , 0 ) T \mathbf{c} = (a_1, a_2, \ldots, a_r, -\text{sign}(a_{r+1})s, 0, \ldots, 0)^T c=(a1,a2,,ar,sign(ar+1)s,0,,0)T,其中 s = ∥ a ∥ 2 s = \|a\|_2 s=a2 (从 r + 1 r+1 r+1计算到 n n n)且 a r + 1 ≠ 0 a_{r+1} \neq 0 ar+1=0,则可以引入 Householder 矩阵 H H H,使得 H a = c Ha=c Ha=c。Householder 矩阵的计算方式如下:
w = a − sign ( a r + 1 ) s e r + 1 \mathbf{w} = \mathbf{a} - \text{sign}(a_{r+1})s\mathbf{e}_{r+1} w=asign(ar+1)ser+1
  其中, e r + 1 \mathbf{e}_{r+1} er+1 是单位向量 ( 0 , 0 , … , 0 , 1 , 0 , … , 0 ) T (0, 0, \ldots, 0, 1, 0, \ldots, 0)^T (0,0,,0,1,0,,0)T,具体位置在第 r + 1 r+1 r+1 个。

在这里插入图片描述

b. 细节解析

  • Householder 矩阵的构造:
    • 通过 Householder 变换,构造 Householder 矩阵 H H H,将某一列 a j a_j aj r + 1 r+1 r+1 n n n 个分量化为零。

  • 计算过程的稳定性:

    • a a a r + 1 r+1 r+1 n n n 个分量的符号设定为 − sign ( a r + 1 ) -\text{sign}(a_{r+1}) sign(ar+1),以增强计算的稳定性。
  • 计算相似三对角矩阵:

    • A A A 逐列进行正交相似变换,得到 A 1 , A 2 , … , A n − 1 A_1, A_2, \ldots, A_{n-1} A1,A2,,An1
    • 最终得到相似三对角矩阵 G = A n = H n − 2 ⋅ … ⋅ H 2 ⋅ H 1 ⋅ A G = A_n = H_{n-2} \cdot \ldots \cdot H_2 \cdot H_1 \cdot A G=An=Hn2H2H1A
  • 实际计算中的优化:

    • 实际计算中,无需形成所有的 Householder 矩阵,也无需进行矩阵乘法运算,可以直接在原矩阵上进行计算。
      在这里插入图片描述

4. H变换例题解析

  给定矩阵:
A = [ 1 2 1 2 2 2 − 1 1 1 − 1 1 1 2 1 1 1 ] A = \begin{bmatrix} 1 & 2 & 1 & 2 \\ 2 & 2 & -1 & 1 \\ 1 & -1 & 1 & 1 \\ 2 & 1 & 1 & 1 \end{bmatrix} A= 1212221111112111
在这里插入图片描述
在这里插入图片描述

最终的三对角矩阵 A 2 A_2 A2

  • A 2 A_2 A2的形式为
    A 2 = [ 1 − 3 0 0 − 3 2.3333 − 0.4714 0 0 − 0.4714 1.1667 − 1.5003 0 0 − 1.5003 0.5002 ] A_2 = \begin{bmatrix} 1 & -3 & 0 & 0 \\ -3 & 2.3333 & -0.4714 & 0 \\ 0 & -0.4714 & 1.1667 & -1.5003 \\ 0 & 0 & -1.5003 & 0.5002 \end{bmatrix} A2= 130032.33330.4714000.47141.16671.5003001.50030.5002

  这样,通过选择 r = 1 r=1 r=1 r = 2 r=2 r=2 进行两次 Householder 变换,矩阵 A A A 被成功地化为三对角形式 A 2 A_2 A2

四、Python实现

import numpy as np


def householder_matrix(v):
    """
    给定向量 v,返回 Householder 变换矩阵 H
    """
    v = np.array(v, dtype=float)
    if np.linalg.norm(v) == 0:
        raise ValueError("无效的输入向量,它应该是非零的。")

    v = v / np.linalg.norm(v)
    H = np.eye(len(v)) - 2 * np.outer(v, v)
    return H


def householder_reduction(A):
    """
    对矩阵 A 执行 Householder 变换,将其化为三对角形式。
    """
    m, n = A.shape
    if m != n:
        raise ValueError("输入矩阵 A 必须是方阵。")

    Q = np.eye(m)  # 初始化正交矩阵 Q

    for k in range(n - 2):
        x = A[k + 1:, k]
        e1 = np.zeros_like(x)
        e1[0] = 1.0
        v = np.sign(x[0]) * np.linalg.norm(x) * e1 + x
        v = v / np.linalg.norm(v)

        H = np.eye(m)
        H[k + 1:, k + 1:] -= 2.0 * np.outer(v, v)
        Q = np.dot(Q, H)
        A = np.dot(H, np.dot(A, H))

    return Q, A


# 示例矩阵
A = np.array([[1, 2, 1, 2],
              [2, 2, -1, 1],
              [1, -1, 1, 1],
              [2, 1, 1, 1]], dtype=float)

# Householder 变换
Q, tridiagonal_A = householder_reduction(A)
np.set_printoptions(precision=4, suppress=True)
print("正交矩阵 Q:")
print(Q)
print("\n三对角矩阵:")
print(tridiagonal_A)


在这里插入图片描述

调试过程

  • 第一次:
    在这里插入图片描述

  • 第二次:
    在这里插入图片描述

  • final:
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/213310.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

全面的.NET微信网页开发之JS-SDK使用步骤、配置信息和接口请求签名生成详解

JSSDK使用步骤 步骤一:绑定安全域名: 先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”。 步骤二:引入JS文件: 在需要调用JS接口的页面引入如下JS文件,(支持https):http://…

业务数据治理体系化实施流程学习总结

目录 一、业务数据治理实施流程 步骤 1:发现问题和制定目标 步骤 2:针对问题进行拆解,设计可衡量的指标 步骤 3:制定解决SOP和检查研发标准规范 步骤 4:推广运营,以拿结果为核心目标 步骤 5&#xff…

matlab科学计算

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和技术。关…

ARM架构安装RabbitMQ

1.查看centos内核版本 uname -a uname -r2.安装之前的准备工作 安装RabbitMQ必装Erlang(RabbitMQ官网添加链接描述) 2.1.Erlang简介 Erlang是一种通用的面向并发的编程语言,它由瑞典电信设备制造商爱立信所辖的CS-Lab开发,目的是创造一种可以应对…

【Java基础篇 | 面向对象】—— 聊聊什么是多态(下篇)

个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【JavaSE_primary】 本专栏旨在分享学习JavaSE的一点学习心得,欢迎大家在评论区讨论💌 目录 一、动态绑定和静态绑…

C++ string类(2)—成员访问、插入、删除、替换、查找和交换操作

目录 一、成员访问 1、[ ]&at 2、front( )&back( ) 二、插入元素 三、删除元素 四、替换元素 五、查找元素 1、查找第一次出现位置 2 、在指定范围内查找 六、交换字符串 七、c_str 八、rfind&substr 一、成员访问 1、[ ]&at 虽然二者功能一样&…

【微信小程序】上传头像 微信小程序内接小程序客服

这里写目录标题 微信小程序上传头像使用button按钮包裹img 微信小程序内接小程序客服使用button按钮跳转客服 微信小程序上传头像 使用button按钮包裹img 原本思路是只使用image标签再加上chooseImg,但发现使用button标签上传头像这种方法更实用。微信小程序文档上…

栈实现队列,力扣

题目地址: 232. 用栈实现队列 - 力扣(LeetCode) 难度:简单 今天刷栈实现队列,大家有兴趣可以点上看看题目要求,试着做一下。 题目: 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支…

简单句子成分、阅读技巧

四、段落的主旨题:问这一段讲了什么(一般都在段落的第一句话或最后一句话) 词汇题的答案一般都在生词的上一句或者下一句 做题步骤: 1、先标段落 2、看题,划出关键词 3、去原文定位,标注中文意思 4、第一遍…

类和对象——(5)定义对象数组

归纳编程学习的感悟, 记录奋斗路上的点滴, 希望能帮到一样刻苦的你! 如有不足欢迎指正! 共同学习交流! 🌎欢迎各位→点赞 👍 收藏⭐ 留言​📝 芳华没有草稿纸,我们永久不…

异常(C++)

异常 前言一、程序的错误分类二、异常1. 概念2. 捕获异常的关键字和格式3. 异常的使用异常的原则异常再抛出异常说明注意事项 4. 自定义异常体系5. C标准库的异常体系 三、总结 前言 在程序运行时经常碰到一些错误,例如年龄、身高不能为负,除数为0等&…

阿里微服务质量保障系列:性能监控最佳实践

建设一体化性能监控平台 随着互联网技术的不断发展,企业的业务规模和复杂度也在不断增加。为了保证业务的稳定性和可靠性,企业需要对其系统进行全面的性能监控。而一体化性能监控就是一种集成了多种监控工具和技术的综合性监控方案,可以帮助…

PPT设置背景颜色

问题描述:PPT如何设置背景颜色? 问题解决:设计→设置背景格式→颜色→蓝色(最好选择看着比较舒服的颜色)

软件设计模式原则(三)单一职责原则

单一职责原则(SRP)又称单一功能原则。它规定一个类应该只有一个发生变化的原因。所谓职责是指类变化的原因。如果一个类有多于一个的动机被改变,那么这个类就具有多于一个的职责。而单一职责原则就是指一个类或者模块应该有且只有一个改变的原…

linux下安装nginx

第一步:压缩包 准备压缩包,最好准备一个稳定的版本:下载地址 我这边选用的是1.24.0双版本号 第二步:解压 在相对应的目录下,执行命令:tar -zxvf nginx-1.18.0.tar.gz 第三步:配置\编译 推荐…

【vue】尚硅谷vue3学习笔记

Vue3快速上手 1.Vue3简介 2020年9月18日,Vue.js发布3.0版本,代号:One Piece(海贼王)耗时2年多、2600次提交、30个RFC、600次PR、99位贡献者github上的tags地址:https://github.com/vuejs/vue-next/release…

图论|并查集理论基础 1971. 寻找图中是否存在路径

什么是并查集 并查集是一种数据结构,用于处理一些不交集的合并及查询问题。它支持两种操作: 查找(Find):确定某个元素属于哪个子集。它可以用来判断两个元素是否属于同一个子集。 合并(Union)&…

Button初了解

Button 由TextView派生而来,二者的区别有: Button有默认的按钮背景,TextView默认无背景Button的内部文本默认居中对齐,而TextView的默认靠左对齐2023年以前,Button默认将英文换为大写,而TextView保持原始的…

springboot助农管理系统

springboot助农管理系统 成品项目已经更新!同学们可以打开链接查看!需要定做的及时联系我!专业团队定做!全程包售后! 2000套项目视频链接:https://pan.baidu.com/s/1N4L3zMQ9nNm8nvEVfIR2pg?pwdekjv 提…

虚拟化逻辑架构: VM VirtualBox 指定6.0.24版本开启硬件辅助虚拟化功能

目录 一、实验 1.安装VM VirtualBox-6.0.24 2.安装VM VirtualBox-6.1.26 3.再次重新安装VM VirtualBox-6.0.24 二、问题 1.系统开机报错 2.Ubuntu系统无法自适应VM VirtualBox系统边框 3.VirtualBox如何开启无缝模式 3.Ubuntu如何查询软件是否已经安装 一、实验 1.安…