Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【数值计算方法(黄明游)】矩阵特征值与特征向量的计算(三):Jacobi 旋转法【理论到程序】

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

作者头像
Qomolangma
发布于 2024-07-30 02:42:44
发布于 2024-07-30 02:42:44
29300
代码可运行
举报
文章被收录于专栏:深度学习深度学习
运行总次数:0
代码可运行

  矩阵的特征值(eigenvalue)和特征向量(eigenvector)在很多应用中都具有重要的数学和物理意义。Jacobi 旋转法是一种用于计算对称矩阵特征值和特征向量的迭代方法。

  本文将详细介绍 Jacobi 旋转法的基本原理和步骤,通过一个具体的矩阵示例演示其应用过程,并给出其Python实现。

一、Jacobi 旋转法

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

  • 对称矩阵是一个实数矩阵,其转置与自身相等。
  • 对于一个方阵
A

,如果存在标量

λ

和非零向量

v

,使得

Av = λv

,那么

λ

就是

A

的特征值,

v

就是对应于

λ

的特征向量。

1. 基本思想

  Jacobi 旋转法的基本思想是通过一系列的相似变换,逐步将对称矩阵对角化,使得非对角元素趋于零。这个过程中,特征值逐渐浮现在对角线上,而相应的特征向量也被逐步找到。下面是 Jacobi 旋转法的基本步骤:

  1. 选择旋转角度: 选择一个旋转角度 θ,通常使得旋转矩阵中的非对角元素为零,从而实现对角化,通常选择非对角元素中绝对值最大的那个作为旋转的目标。
  2. 构造旋转矩阵: 构造一个旋转矩阵 J,该矩阵为单位矩阵,只有对应于选择的非对角元素的位置上有两个非零元素,其余位置上为零。这两个非零元素的值由旋转角度 θ 决定,例如,对于 2x2 矩阵,旋转矩阵可以表示为:
J = \begin{bmatrix} \cos(\theta) & -\sin(\theta) \\ \sin(\theta) & \cos(\theta) \end{bmatrix}
  1. 相似变换: 计算相似变换矩阵
P

,即

P^TAP

,其中

A

是原始矩阵,

P

是旋转矩阵,计算过程如下:

P^TAP = \begin{bmatrix} \cos(\theta) & \sin(\theta) \\ -\sin(\theta) & \cos(\theta) \end{bmatrix}^T \begin{bmatrix} a_{11} & a_{12} \\ a_{12} & a_{22} \end{bmatrix} \begin{bmatrix} \cos(\theta) & -\sin(\theta) \\ \sin(\theta) & \cos(\theta) \end{bmatrix}

  通过矩阵相乘计算,我们可以得到

P^TAP

中的非对角元素,假设这两个元素分别位于矩阵的 (1,2) 和 (2,1) 的位置。令

a_{ij}

为这两个元素,即

a_{ij}= a_{12} = a_{21}

  接下来,我们希望通过选择合适的

\theta

使得

a_{ij}

变为零,从而达到对角化的目的,即

a_{12} = a_{21}

,进一步可推导出

\theta = \frac{1}{2} \arctan\left(\frac{2 \cdot a_{ij}}{a_{ii} - a_{jj}}\right)
a_{ii}=a_{jj}

,则使用

arccot

形式

  1. 迭代: 重复步骤 1-3,直到矩阵 A 的非对角元素都趋于零或满足一定的精度要求。
  2. 提取特征值和特征向量: 对角线上的元素即为矩阵 A 的特征值,而 P 中的列向量即为对应于这些特征值的特征向量。

2. 计算过程演示

  对于矩阵

A = \begin{bmatrix} 2 & -1 & 0 \\ -1 & 2 & -1 \\ 0 & -1 & 2 \end{bmatrix}

  我们首先找到非对角元素中绝对值最大的元素,这里我们以 (2,1) 为例,计算旋转角度和旋转矩阵。

  1. 选择旋转角度:   计算旋转角度
\theta

公式:

\theta = \frac{1}{2} \arctan\left(\frac{2 \cdot a_{ij}}{a_{ii} - a_{jj}}\right)

其中,

a_{ii}

a_{jj}

分别是矩阵的对角元素,而

a_{ij}

是非对角元素,即

a_{21}

。 在这个例子中,

a_{21} = -1

a_{11} = a_{22} = 2

\theta = \frac{1}{2} \arctan\left(\frac{-2}{0}\right) = -\frac{\pi}{4}
  1. 构造旋转矩阵:
J = \begin{bmatrix} \cos(\theta) & -\sin(\theta) \\ \sin(\theta) & \cos(\theta) \end{bmatrix}

对于

\theta = -\frac{\pi}{4}

J = \begin{bmatrix} \cos\left(-\frac{\pi}{4}\right) & -\sin\left(-\frac{\pi}{4}\right) \\ \sin\left(-\frac{\pi}{4}\right) & \cos\left(-\frac{\pi}{4}\right) \end{bmatrix}

计算得:

J = \begin{bmatrix} \frac{\sqrt{2}}{2} & \frac{\sqrt{2}}{2} \\ -\frac{\sqrt{2}}{2} & \frac{\sqrt{2}}{2} \end{bmatrix}
  1. 相似变换: 计算相似变换矩阵
P

P^T A P

在这里,

P

就是构造的旋转矩阵

J

  1. 迭代: 重复上述步骤,直到矩阵足够接近对角矩阵。

  这个过程会一步步地使矩阵趋近于对角矩阵,对角线上的元素就是矩阵的特征值,而相应的列向量就是对应的特征向量。由于计算较为繁琐,我在这里只展示了一个迭代的过程,实际应用中,需要进行多次迭代,直到满足精度的要求。

二、Python实现

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import numpy as np


def jacobi_rotation(A):
    n = A.shape[0]
    tolerance = 1e-10
    max_iterations = 1000
    eigenvectors = np.eye(n)

    for _ in range(max_iterations):
        # 寻找最大的非对角元素
        max_off_diag = np.max(np.abs(np.triu(A, k=1)))
        if max_off_diag < tolerance:
            break  # 达到收敛条件

        # 找到最大元素的索引
        indices = np.unravel_index(np.argmax(np.abs(np.triu(A, k=1))), A.shape)

        i, j = indices
        # 计算旋转角度
        theta = 0.5 * np.arctan2(2 * A[i, j], A[i, i] - A[j, j])

        # 构造旋转矩阵
        J = np.eye(n)
        J[i, i] = J[j, j] = np.cos(theta)
        J[i, j] = -np.sin(theta)
        J[j, i] = np.sin(theta)

        # 执行相似变换
        A = np.dot(np.dot(J.T, A), J)

        # 更新特征向量
        eigenvectors = np.dot(eigenvectors, J)

    # 提取特征值
    eigenvalues = np.diag(A)

    return eigenvalues, eigenvectors


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

# 执行 Jacobi 旋转
eigenvalues, eigenvectors = jacobi_rotation(A)

print("特征值:", eigenvalues)
print("特征向量:")
np.set_printoptions(precision=4, suppress=True)
print(eigenvectors)

迭代过程(调试)

  • 第一次:
  • 第二次:

………

  • 第九次:
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-01-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【数值计算方法(黄明游)】矩阵特征值与特征向量的计算(二):Jacobi 过关法(Jacobi 旋转法的改进)【理论到程序】
  Jacobi 旋转法的每一次迭代中,需要选择一个非对角元素最大的位置,然后构造相应的旋转矩阵,进行相似变换,使得矩阵逐渐对角化。
Qomolangma
2024/07/30
1360
【数值计算方法(黄明游)】矩阵特征值与特征向量的计算(二):Jacobi 过关法(Jacobi 旋转法的改进)【理论到程序】
【数值计算方法(黄明游)】矩阵特征值与特征向量的计算(五):Householder方法【理论到程序】
  Jacobi 旋转法的每一次迭代中,需要选择一个非对角元素最大的位置,然后构造相应的旋转矩阵,进行相似变换,使得矩阵逐渐对角化。
Qomolangma
2024/07/30
2770
【数值计算方法(黄明游)】矩阵特征值与特征向量的计算(五):Householder方法【理论到程序】
数值计算方法 Chapter7. 计算矩阵的特征值和特征向量
显然,对于任意一个向量 ,我们总可以将其用 阶矩阵的一组正交基进行表示,即:
codename_cys
2022/06/20
2.1K0
Jacobi方法求实对称阵的特征值
Jacobi方法用于求实对称阵的全部特征值、特征向量。对于实对称阵 A,必有正交阵 Q ,使 QT A Q = Λ 其中Λ是对角阵,其主对角线元素λii是A的特征值,正交阵Q的第j列是A的第i个特征值
fem178
2018/04/08
2.8K0
Jacobi方法求实对称阵的特征值
【愚公系列】2023年08月 3D数学-矩阵运算和变换
矩阵是由数字或符号排成的矩形阵列。矩阵中的每个数字或符号称为元素。矩阵用于在数学、物理学、工程学和计算机科学等领域中描述和解决线性方程组、向量、转换、空间几何等问题。矩阵通常由方括号表示,如下所示:
愚公搬代码
2025/05/28
580
【愚公系列】2023年08月 3D数学-矩阵运算和变换
矩阵分析笔记(七)特征值与特征向量
设\mathscr{A}是数域\mathbb{F}上的n维线性空间V的线性变换,若存在\alpha \neq 0, \lambda \in \mathbb{F},使
mathor
2020/10/23
1.8K0
矩阵分析笔记(七)特征值与特征向量
【数值计算方法(黄明游)】矩阵特征值与特征向量的计算(一):乘幂法【理论到程序】
  乘幂法(Power Iteration)是一种用于估计矩阵的最大特征值及其对应特征向量的迭代算法,基于以下的数学原理:
Qomolangma
2024/07/30
4360
【数值计算方法(黄明游)】矩阵特征值与特征向量的计算(一):乘幂法【理论到程序】
线性代数整理(三)行列式特征值和特征向量
比方说在二维平面中,这里有三组二维向量,每组都有两个向量,那么每组向量的面积就可以表示它们的不同。当然这里说面积是针对二维平面来说的,在三维空间中,就是体积;在更高维度中,可能就是一个体,但这个体比较抽象
算法之名
2021/03/04
2.8K0
【数值计算方法(黄明游)】解线性代数方程组的迭代法(一):向量、矩阵范数与谱半径【理论到程序】
  矩阵的范数是定义在矩阵空间上的实值函数,用于度量矩阵的大小或度量。对于一个矩阵
Qomolangma
2024/07/30
1690
【数值计算方法(黄明游)】解线性代数方程组的迭代法(一):向量、矩阵范数与谱半径【理论到程序】
特征值和特征向量
$$ \begin{array} \mathbf{I A} \mathbf{x}=\mathbf{I} \cdot \lambda \mathbf{x} \\ \mathbf{A} \mathbf{x}=(\lambda I) \mathbf{x} \end{array} $$
为为为什么
2022/09/30
1.1K0
Gimbal Lock欧拉角死锁问题
在前面几篇跟SETTLE约束算法相关的文章(1, 2, 3)中,都涉及到了大量的向量旋转的问题--通过一个旋转矩阵,给定三个空间上的欧拉角
DechinPhy
2022/11/01
1.3K0
Gimbal Lock欧拉角死锁问题
自动控制理论笔记
\(G(s) = \frac{a}{s+a}\) \(\frac{1}{a}\)是时间常数\(\tau\),对应上升为0.63 \(4\tau\)对应阶跃响应0.98
列夫托尔斯昊
2020/08/25
2K0
自动控制理论笔记
【机器学习】在向量的流光中,揽数理星河为衣,以线性代数为钥,轻启机器学习黎明的瑰丽诗章
在正式踏入机器学习的实战领域前,我们需要为自己筑起一座坚实的数学地基。 对于零基础的学习者而言,数学听起来也许陌生甚至有点“吓人”。然而,不必惧怕:本篇文章将带你从最直观的概念出发,帮助你理解和掌握线性代数这门支撑机器学习大厦的重要支柱。
半截诗
2025/01/09
2040
Jacobi方法求矩阵特征值的算例及代码
Jacobi方法用于求实对称阵的全部特征值、特征向量。对于实对称阵 A,必有正交阵 Q ,使 QT A Q = Λ 其中Λ是对角阵,其主对角线元素λii是A的特征值,正交阵Q的第i列是A的第i个特征值
fem178
2018/04/08
4K0
Jacobi方法求矩阵特征值的算例及代码
【数值计算方法(黄明游)】矩阵特征值与特征向量的计算(二):乘幂法的加速(带有原点移位的乘幂法)【理论到程序】
  乘幂法(Power Iteration)是一种用于寻找矩阵的最大特征值及其对应特征向量的迭代算法。它通过迭代计算矩阵与向量的乘积,并规范化得到新的向量,最终收敛到矩阵的最大特征值和对应的特征向量。然而,对于某些矩阵,乘幂法的收敛速度可能相对较慢。为了加速乘幂法的收敛,一种常见的做法是通过平移(Shift)矩阵的方式。
Qomolangma
2024/07/30
2210
【数值计算方法(黄明游)】矩阵特征值与特征向量的计算(二):乘幂法的加速(带有原点移位的乘幂法)【理论到程序】
图形学入门(一):坐标变换
将一个物体显示到屏幕上,这个事情似乎非常简单,以至于我们基本上认为它已经天经地义到直接告诉计算机我们要显示什么物体它就会自动显示出来,毕竟我们拍照的时候就是举起相机按下快门就会出现一张图片了。但事实上,相机是基于物理感光元件实现了从三维世界到二维图片的投影,在计算机的程序世界中一切都需要被计算出来,也就是说,我们只有一堆图形的描述信息,我们需要自己将这些图形在二维的平面上绘制的方式告诉操作系统,操作系统才能最终在屏幕上绘制出我们想要的图形。
zhiruili
2021/08/10
2K0
图形学入门(一):坐标变换
线性代数之相似矩阵、二次型
(1)特征值求法:解特征方程; (2)特征向量的求法:求方程组的基础解系。 (3)特征值的性质:
用户11315985
2024/10/16
2720
线性代数之相似矩阵、二次型
Deep Learning Chapter01:机器学习中线性代数
好久不见,大家好,我是北山啦。机器学习当中需要用到许多的数学知识,如今博主又要继续踏上深度学习的路程,所以现在在网上总结了相关的考研数学和机器学习中常见相关知识如下,希望对大家有所帮助。
北山啦
2022/10/31
5130
Deep Learning Chapter01:机器学习中线性代数
变换(Transform)(1)-向量、矩阵、坐标系与基本变换
如果要将右侧坐标系变为左侧那种,我们只需要做一些旋转操作,将右侧坐标系顺时针旋转180度,再将整个坐标系水平翻转即可。我们可以通过一定的旋转操作将两个坐标系重合,那么我们就称它们具有相同的旋向性(handedness)。
Zero Two
2024/07/21
5820
Google Earth Engine(GEE)——协方差、特征值、特征向量主成分分析(部分)
的主成分(PC)的变换(又称为Karhunen-Loeve变换)是一种光谱转动所需要的光谱相关的图像数据,并输出非相关数据。PC 变换通过特征分析对输入频带相关矩阵进行对角化来实现这一点。要在 Earth Engine 中执行此操作,请在阵列图像上使用协方差缩减器并eigen()在结果协方差阵列上使用该命令。为此目的考虑以下函数(这是完整示例的一部分 ):
此星光明
2024/02/02
2960
推荐阅读
【数值计算方法(黄明游)】矩阵特征值与特征向量的计算(二):Jacobi 过关法(Jacobi 旋转法的改进)【理论到程序】
1360
【数值计算方法(黄明游)】矩阵特征值与特征向量的计算(五):Householder方法【理论到程序】
2770
数值计算方法 Chapter7. 计算矩阵的特征值和特征向量
2.1K0
Jacobi方法求实对称阵的特征值
2.8K0
【愚公系列】2023年08月 3D数学-矩阵运算和变换
580
矩阵分析笔记(七)特征值与特征向量
1.8K0
【数值计算方法(黄明游)】矩阵特征值与特征向量的计算(一):乘幂法【理论到程序】
4360
线性代数整理(三)行列式特征值和特征向量
2.8K0
【数值计算方法(黄明游)】解线性代数方程组的迭代法(一):向量、矩阵范数与谱半径【理论到程序】
1690
特征值和特征向量
1.1K0
Gimbal Lock欧拉角死锁问题
1.3K0
自动控制理论笔记
2K0
【机器学习】在向量的流光中,揽数理星河为衣,以线性代数为钥,轻启机器学习黎明的瑰丽诗章
2040
Jacobi方法求矩阵特征值的算例及代码
4K0
【数值计算方法(黄明游)】矩阵特征值与特征向量的计算(二):乘幂法的加速(带有原点移位的乘幂法)【理论到程序】
2210
图形学入门(一):坐标变换
2K0
线性代数之相似矩阵、二次型
2720
Deep Learning Chapter01:机器学习中线性代数
5130
变换(Transform)(1)-向量、矩阵、坐标系与基本变换
5820
Google Earth Engine(GEE)——协方差、特征值、特征向量主成分分析(部分)
2960
相关推荐
【数值计算方法(黄明游)】矩阵特征值与特征向量的计算(二):Jacobi 过关法(Jacobi 旋转法的改进)【理论到程序】
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验