Loading [MathJax]/jax/element/mml/optable/GreekAndCoptic.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 旋转法的每一次迭代中,需要选择一个非对角元素最大的位置,然后构造相应的旋转矩阵,进行相似变换,使得矩阵逐渐对角化。

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

,如果存在标量

和非零向量

,使得

,那么

就是

的特征值,

就是对应于

的特征向量。

1. 基本思想

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

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

,即

,其中

是原始矩阵,

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

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

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

为这两个元素,即

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

使得

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

,进一步可推导出

,则使用

形式

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

2. 计算过程演示

  对于矩阵

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

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

公式:

其中,

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

是非对角元素,即

。 在这个例子中,

  1. 构造旋转矩阵:

对于

计算得:

  1. 相似变换: 计算相似变换矩阵

在这里,

就是构造的旋转矩阵

  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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【kafka运维】Kafka全网最全最详细运维命令合集(精品强烈建议收藏!!!)
本文所有命令,博主均全部操作验证过,保证准确性; 非复制粘贴拼凑文章; 如果想了解更多工具命令,可在评论区留下评论,博主会择期加上;
石臻臻的杂货铺[同名公众号]
2021/07/08
6K0
【kafka运维】Kafka全网最全最详细运维命令合集(精品强烈建议收藏!!!)
【kafka运维】Kafka全网最全最详细运维命令合集(精品强烈建议保存)
本文所有命令,博主均全部操作验证过,保证准确性; 非复制粘贴拼凑文章; 如果想了解更多工具命令,可在评论区留下评论,博主会择期加上;
石臻臻的杂货铺[同名公众号]
2021/12/31
2.3K1
【kafka运维】Kafka全网最全最详细运维命令合集(精品强烈建议保存)
kafka-consumer-groups 命令行工具使用手册
该手册原文出自 $KAFKA_HOME\bin\windows\kafka-consumer-groups.bat --help 命令的输出结果,并由 Redisant 提供翻译和测试用例。
用户3871926
2022/11/12
1K0
【Kafka专栏 09】Kafka消费者如何实现如何实现消息回溯与重放:谁说“覆水难收”?
在分布式系统中,消息队列扮演着至关重要的角色,而Kafka作为其中的佼佼者,以其高吞吐量、低延迟和可扩展性赢得了广泛的应用。然而,在实际应用中,我们不可避免地会遇到数据丢失、错误处理、版本升级以及数据分析等场景,这时就需要消息回溯消费的能力。
夏之以寒
2024/06/12
6140
Kafka运维命令大全
1、集群管理 前台启动broker bin/kafka-server-start.sh <path>/server.properties Ctrl + C 关闭 后台启动broker bin/kafka-server-start.sh -daemon <path>/server.properties 关闭broker bin/kafka-server-stop.sh 2、Topic管理 创建topic bin/kafka-topics.sh --create --zookeeper localhost:21
用户6070864
2019/09/17
1.2K0
Kafka运维命令大全
Kafka Consumer重置Offset
在Kafka Version为0.11.0.0之后,Consumer的Offset信息不再默认保存在Zookeeper上,而是选择用Topic的形式保存下来。
迹_Jason
2019/05/28
10.5K0
Kafka 命令记录
bin/kafka-server-start.sh <path>/server.properties Ctrl + C 关闭
郭顺发
2023/07/17
1630
kafka 集群部署
2.编辑配置文件 /usr/local/kafka/config/server.properties
Jerly.Yan
2023/07/18
1.7K0
kafka 集群部署
Kafka-日常运维命令
我们上一章介绍了中间件:Zookeeper,本章将介绍另外一个中间件:Kafka。目前这2个中间件都是基于JAVA语言的。
运维小路
2025/06/08
730
Kafka-日常运维命令
kafka集群管理指南
其中,—topic表示主题名称,—partitions表示分区数,—replication-factor表示副本数,—config表示主题配置,会覆盖默认的配置项。
从大数据到人工智能
2022/01/19
2K0
Kafka 常用运维脚本
集群管理 (1)启动 broker $ bin/kafka-server-start.sh daemon <path>/server.properties (2)关闭 broker $ bin/kafka-server-stop.sh topic 管理 kafka-topics.sh 脚本 # 创建主题 $ bin/kafka-topics.sh --create --zookeeper localhost:2181 --partitions 64 --replication-factor 3 --topi
张乘辉
2020/08/27
1.4K0
kafka-消费者偏移量__consumer_offsets_相关解析
https://blog.csdn.net/z69183787/article/details/109810468
Get
2024/03/10
4630
【kafka原理】 消费者偏移量__consumer_offsets_相关解析
我们在kafka的log文件中发现了还有很多以 __consumer_offsets_的文件夹;总共50个;
石臻臻的杂货铺[同名公众号]
2021/07/14
6.2K0
Kafka集群管理:🛠️ 如何实现数据均衡与性能最大化
Kafka 起初是 由 LinkedIn 公司采用 Scala 语言开发的一个多分区、多副本且基于 ZooKeeper 协调的分布式消息系统,现已被捐献给 Apache 基金会。
TASKCTL 任务调度平台
2024/11/21
1820
Kafka集群管理:🛠️ 如何实现数据均衡与性能最大化
kafka的消费者组(下)
上一文对消费者组的一些概念,基本原理进行了简单描述,本文继续来聊聊消费者组中另外一个比较重要的内容:偏移量的存储。
陈猿解码
2023/02/28
8750
kafka的消费者组(下)
一文读懂springboot整合kafka
Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据。
QGS
2024/05/03
13.3K0
Kafka 消费者原理(4)
通过前几篇文章我们知道在Partition中,消息是不会删除的,所以才可以追加写入,写入的消息是连续并且有序的。
兜兜毛毛
2021/04/02
1.6K0
大数据必知必会之Kafka
Kafka 起初是 由 LinkedIn 公司采用 Scala 语言开发的一个多分区、多副本且基于 ZooKeeper 协调的分布式消息系统,现已被捐献给 Apache 基金会。目前 Kafka 已经定位为一个分布式流式处理平台,它以高吞吐、可持久化、可水平扩展、支持流数据处理等多种特性而被广泛使用,主要是由 Scala 和 Java 编写。
没有故事的陈师傅
2022/09/15
4910
大数据必知必会之Kafka
Kafka入门实战教程(9):深入了解Offset
Offset,消息位移,它表示分区中每条消息的位置信息,是一个单调递增且不变的值。换句话说,offset可以用来唯一的标识分区中每一条记录。
Edison Zhou
2022/09/16
4.5K0
Kafka入门实战教程(9):深入了解Offset
Kafka——分布式的消息队列
Producers – 生产者 生产者将数据发布到他们选择的主题。生产者负责选择要分配给主题中哪个分区的消息 可以以循环方式完成此操作,仅是为了平衡负载,也可以根据某些语义分区功能(例如基于消息中的某些键)进行此操作。
时间静止不是简史
2020/07/24
1.5K0
相关推荐
【kafka运维】Kafka全网最全最详细运维命令合集(精品强烈建议收藏!!!)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验