用manim实现Gram-Schmidt正交化过程

        在线性代数中,正交基有许多美丽的性质。例如,由正交列向量组成的矩阵(又称正交矩阵)可以通过矩阵的转置很容易地进行反转。此外,例如:在由彼此正交的向量张成的子空间上投影向量也更容易。Gram-Schmidt过程是一个重要的算法,它允许我们将任意基转换为生成同一子空间的正交基。在这篇文章中,我们将使用一个流行的开源库。manim在3D中实现和可视化这个算法

        Gram-Schmidt过程是一种用于将一组线性无关的向量转化为一组正交(或正交归一化)的向量的算法。这个过程在数学和工程中广泛应用,特别是在计算机图形学、信号处理和统计分析中。

Gram-Schmidt 正交化的步骤

假设我们有一组线性无关的向量 {v_{1},v_{2},...,v_{n}},Gram-Schmidt过程的步骤如下:

  1. 初始化:给定向量v_{1},定它为第一个正交向量 u_{1}:

u_{1}=v_{1}

     2.后续向量的正交化:对于每个i=1,2,3,...,n,计算新的正交向量 u_{1}​:

u_{1}=v_{1}- \sum_{j=1}^{i-1}proj_{u_{i}}(v_{i})

        其中,投影 proj_{u_{i}}(v_{i}) 是:

proj_{u_{i}}(v_{i})=\frac{v_{i}.u_{j}}{v_{j}.u_{j}}.u_{j}

        这里表示向量的点积。

     3.归一化(可选):如果需要将向量归一化,使其单位长度,可以通过以下公式进行:

q_{i}=\frac{u_{i}}{||u_{i}||}

        其中 ||u_{i}||是向量u_{i}的模。

应用

  • 正交基:Gram-Schmidt过程的输出结果是正交基,可以用于简化内积空间中的计算。
  • 数值稳定性:在计算中使用正交向量能提高数值稳定性,特别是在进行矩阵分解(如QR分解)时。
  • 计算简化:在许多应用中(如最小二乘法),正交向量可以简化计算,使得更容易处理高维数据。

用manim实现向量的表示

        代码为了实现 Gram-Schmidt 正交化的可视化过程而构建,使用了 Manim 库。

from manim import *  # 导入 Manim 库  
import numpy as np  # 导入 NumPy 库以进行数值计算  
from enum import Enum  # 导入枚举模块以创建动作类型  # 定义颜色  
basis_i_color = GREEN  # 基向量 i 的颜色  
basis_j_color = RED    # 基向量 j 的颜色  
basis_k_color = GOLD   # 基向量 k 的颜色  
q_color = PURPLE       # 向量 q 的颜色  
q_shifted_color = PINK # 移动的向量 q 的颜色  
projection_color = BLUE # 投影向量的颜色  # 定义动作枚举,便于管理不同的操作  
class Action(Enum):  UPDATE_MATRIX_REMOVE_Q = 1  # 更新矩阵并移除 q 向量  ADD_PROJECTION = 2           # 添加一个投影向量  REMOVE_PROJECTIONS_SET_Q = 3 # 移除投影向量并设置新的 q 向量  NORMALIZE_Q = 4              # 规范化 q 向量  # 实现 Gram-Schmidt 过程  
def gram_schmidt(A):  (n, m) = A.shape  # 获取矩阵 A 的形状  for i in range(m):  q = A[:, i]  # 选取矩阵 A 的第 i 列  for j in range(i):  # 计算并从 q 中减去之前列的投影  projection = np.dot(A[:, j], A[:, i]) * A[:, j]  q = q - projection  # 归一化 q 向量  q /= np.linalg.norm(q)  yield Action.NORMALIZE_Q, q  # 返回规范化的 q 向量  # 创建一个新的场景,用于展示 Gram-Schmidt  
class GramSchmidt(Scene):  def construct(self):  # 创建基础向量的颜色,并初始化向量和矩阵 M  M = np.random.rand(3, 3)  # 随机初始化 3x3 矩阵 M  projection_vectors = []     # 初始化用于存储投影向量的列表  q = None                    # 初始化 q 向量为 None  # 初始化基向量箭头  i_vec = Vector(M[:, 0], color=basis_i_color)  # i 向量  j_vec = Vector(M[:, 1], color=basis_j_color)  # j 向量  k_vec = Vector(M[:, 2], color=basis_k_color)  # k 向量  # 播放箭头和矩阵的动画  self.play(GrowArrow(i_vec), GrowArrow(j_vec), GrowArrow(k_vec))  self.wait()  # 遍历 Gram-Schmidt 的步骤  for (action, payload) in gram_schmidt(M):  if action == Action.UPDATE_MATRIX_REMOVE_Q:  # 此步骤用于更新矩阵,并移除旧的 q 向量  assert q is not None  M_rounded = np.round(M.copy(), 2)  # 对矩阵 M 进行四舍五入  matrix = self.create_matrix(M_rounded)  # 创建新的矩阵对象  self.remove(matrix)  # 移除旧的矩阵  # 更新基向量  i_vec_new = Vector(M[:, 0], color=basis_i_color)  j_vec_new = Vector(M[:, 1], color=basis_j_color)  k_vec_new = Vector(M[:, 2], color=basis_k_color)  animation_time = 2.0  # 动画时间  # 播放更新基向量的动画  self.play(  FadeOut(q, run_time=animation_time * 0.75),  ReplacementTransform(i_vec, i_vec_new, run_time=animation_time),  ReplacementTransform(j_vec, j_vec_new, run_time=animation_time),  ReplacementTransform(k_vec, k_vec_new, run_time=animation_time)  )  self.wait()  # 等待一段时间  # 更新现有向量引用  i_vec, j_vec, k_vec = i_vec_new, j_vec_new, k_vec_new  elif action == Action.ADD_PROJECTION:  # 添加新的投影向量  p = Vector(payload, color=projection_color)  projection_vectors.append(p)  # 将投影向量添加到列表中  self.play(GrowArrow(p))  # 播放投影箭头的动画  self.wait()  # 等待  if len(projection_vectors) == 2:  # 当有两个投影向量时,更新其显示效果  first_projection_end = projection_vectors[0].get_end()  p_shifted = Arrow(first_projection_end, first_projection_end + payload, buff=0, color=projection_color)  projection_vectors[1] = p_shifted  self.play(ReplacementTransform(p, p_shifted))  # 替换动画  self.wait()  # 等待  elif action == Action.REMOVE_PROJECTIONS_SET_Q:  # 移除投影并设置新的 q 向量  if not projection_vectors:  q = Vector(payload, color=q_color)  self.play(GrowArrow(q))  # 播放 q 向量的动画  self.wait()  else:  last_projection_end = projection_vectors[-1].get_end()  q_shifted = Arrow(last_projection_end, last_projection_end + payload, buff=0, color=q_shifted_color)  self.play(GrowArrow(q_shifted))  self.wait()  q = Vector(payload, color=q_color)  # 设置新的 q 向量  self.play(  ReplacementTransform(q_shifted, q),  *[FadeOut(p) for p in projection_vectors]  # 移除所有投影  )  self.wait()  projection_vectors = []  # 清空投影向量列表  elif action == Action.NORMALIZE_Q:  # 规范化 q 向量  q_normalized = Vector(payload, color=q_color)  self.play(ReplacementTransform(q, q_normalized))  # 播放规范化动画  self.wait()  q = q_normalized  # 更新 q 向量  else:  assert False  # 确保没有未识别的动作  self.wait(1)  # 在每轮操作间等待  # 验证结果  assert np.allclose(M.T @ M, np.identity(3))  # 确保 M 的转置乘以 M 为单位矩阵  self.wait(15)  # 等待更长时间以查看最终结果

代码解释

  1. 依赖导入:导入了 Manim 和 NumPy 库,Manim 用于创建动画,NumPy 用于数值计算。
  2. 颜色和动作类型定义:定义了不同颜色用于表示基向量、投影、规范化向量等,并通过枚举类型管理不同的动画操作。
  3. 实现 Gram-Schmidt:定义了 gram_schmidt 函数,用于计算 Gram-Schmidt 正交化,逐列处理输入矩阵。
  4. 创建场景:在 GramSchmidt 类中,设置基向量和矩阵,并实现了多个动画步骤,以展示算法的每一步。
  5. 动画逻辑:根据不同的 Action 执行相应的动画,包括更新向量、添加和移除投影向量、规范化向量等。
  6. 验证结果:程序的最后一步确保生成的矩阵是正交的,即其转置乘以自身等于单位矩阵。

你可以根据自己的需求调整参数、颜色或动画,以实现所需的效果。

运行结果:

 

 

 

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Oracle 表空间异构传输

已经有了表空间的数据文件,和元数据dump文件,如何把这个表空间传输到异构表空间中? 查询异构传输平台信息: COLUMN PLATFORM_NAME FORMAT A40 SELECT PLATFORM_ID, PLATFORM_NAME, ENDIAN_FORMAT FROM V$TRANSPORTABLE_PLATFORM O…

LLM大模型:开源RAG框架汇总

前言 本文搜集了一些开源的基于LLM的RAG(Retrieval-Augmented Generation)框架,旨在吸纳业界最新的RAG应用方法与思路。如有错误或者意见可以提出,同时也欢迎大家把自己常用而这里未列出的框架贡献出来,感谢~ RAG应用…

【Python】数据可视化之聚类图

目录 clustermap 主要参数 参考实现 clustermap sns.clustermap是Seaborn库中用于创建聚类热图的函数,该函数能够将数据集中的样本按照相似性进行聚类,并将聚类结果以矩阵的形式展示出来。 sns.clustermap主要用于绘制聚类热图,该热图通…

训练验证器解决数学应用题

人工智能咨询培训老师叶梓 转载标明出处 数学问题解决不仅要求模型能够理解问题的语言表述,还要求其能够准确地执行一系列数学运算,每一步的准确性都至关重要。遗憾的是,现有的语言模型在这一领域的性能远远未能达到人类的水平,它…

[C#]使用onnxruntime部署yolov11-onnx实例分割模型

【官方框架地址】 https://github.com/ultralytics/ultralytics.git 【算法介绍】 在C#中使用ONNX Runtime部署YOLOv11-ONNX实例分割模型,涉及到模型的加载、数据预处理、模型推理和后处理几个关键步骤。 首先,需要确保已经安装了ONNX Runtime的NuGe…

站岗放哨树形dp

前言&#xff1a;好久没有写树上dp了&#xff0c;这儿题目还是挺有意思的 题目地址 #include<bits/stdc.h> #include<iostream> using namespace std;//#define int long long int n; const int N (int)1e510; int e[N],ne[N],h[N],idx 0; int dp[2][N];void add…

FLUX1.1PRO震撼来袭:蓝莓揭开神秘面纱,4网站体验,6倍卓越速率和更高质量,竞技场角逐超越所有模型,Elo最高分

大家好我是安琪&#xff01;&#xff01;&#xff01; FLUX 1.1 PRO震撼来袭&#xff1a;蓝莓揭开神秘面纱&#xff0c;4网站体验&#xff0c;6倍卓越速率和更高质量&#xff0c;竞技场角逐超越所有模型&#xff0c;Elo最高分 在人工智能领域&#xff0c;图像生成与反推技术的…

登 Nature 子刊!论文一作详解蛋白质语言模型的小样本学习方法,解决湿实验数据匮乏难题

在「Meet AI4S」系列直播第三期中&#xff0c;我们有幸邀请到了上海交通大学自然科学研究院 & 上海国家应用数学中心博士后周子宜&#xff0c; 他所在的上海交通大学洪亮课题组研究方向主要为 AI 蛋白和药物设计、分子生物物理。该课题组研究成果颇丰&#xff0c;截止目前共…

Steamdeck SteamOs 安装单机版冒险岛079

Steamdeck SteamOs 安装单机版冒险岛079 复制资源到SteamDeck添加游戏到Steamdeck![请添加图片描述](https://i-blog.csdnimg.cn/direct/4e18b0e9b6a84a07851c7d75c452a048.png) 复制资源到SteamDeck 链接&#xff1a;https://pan.baidu.com/s/1CGCthOcfbYRS6y150HAuzw?pwdap…

Semantic Communications With AI Tasks——面向图像分类任务的语义传输系统

论文链接&#xff1a; 2109.14170 (arxiv.org)https://arxiv.org/pdf/2109.14170 1. 背景 无线网络从“万物互联”向“智能互联”转变的范式变化&#xff0c;这与香农和韦弗关于通信演变的预言相一致。传统的无线网络侧重于信号的准确传输&#xff08;技术层面&#xff09;&…

从0到1:企事业单位知识竞赛答题小程序迭代开发笔记一

背景调研 企事业单位知识竞赛答题小程序&#xff0c;在信息技术迅猛发展的时代&#xff0c;企业和事业单位在提升员工素质和知识水平方面面临着新的挑战。为了增强员工的学习积极性、提高团队凝聚力和整体素质&#xff0c;越来越多的单位开始组织知识竞赛活动。传统的知识竞赛…

【全球顶级域名后缀】

数据时间: 2024.10.6 广告: 五分钟申请SSL证书 (手机电脑都能用) ["aaa","aarp","abarth","abb","abbott","abbvie","abc","able","abogado","abudhabi","ac"…

GemFilter:基于早期层压缩加速长文本LLM推理

GemFilter 是一种用于加速长文本输入的 LLM 推理并降低内存消耗的新型 AI 方法&#xff0c;其利用 LLM 早期层识别关键信息的能力&#xff0c;从而显著压缩输入序列&#xff0c;并在保持性能的同时&#xff0c;实现高达 2.4 倍的加速和 30% 的内存使用减少。 论文介绍 大型语…

从代码到语言:CoreGen 助力自动化提交信息生成

1.概述 源代码与自然语言之间的语义鸿沟是生成高质量代码提交信息的一个重大挑战。代码提交信息对于开发者来说非常重要&#xff0c;因为它们简明扼要地描述了代码更改的高层次意图&#xff0c;帮助开发人员无需深入了解具体实现即可掌握软件的演变过程。手动编写高质量的提交信…

融资、投流、造血,大模型「新星」开启变现竞速

被称为“AI大模型应用元年”的2024年已过半&#xff0c;行业变化太快&#xff0c;充斥着各种声音。 原本漫长的技术发展周期&#xff0c;在大模型身上被装上了加速键。从卷参数、到卷应用&#xff0c;短短两年时间&#xff0c;玩家“百模大战”、资本烈火烹油&#xff0c;都在…

模型 SECI(知识的创造)

系列文章 分享 模型&#xff0c;了解更多&#x1f449; 模型_思维模型目录。知识创造的螺旋转化模型。 1 SECI的应用 1.1 Tech Innovations移动应用创新 Tech Innovations是一家软件开发公司&#xff0c;致力于开发创新的移动应用程序。为了提升团队的知识共享和创新能力&…

论文选题没思路?用这7个GPT提示词10分钟确定论文选题

选题是论文写作的第一步&#xff0c;也是至关重要的一步。毕业论文选题都是让大学生头疼的大事。没有灵感、方向不清、信息太多&#xff0c;常常让人无从下手。现在有了ChatGPT这样的AI写作辅助工具&#xff0c;它可以帮你快速生成丰富的选题思路&#xff0c;轻松解决选题难题。…

fiddler抓包18-2_导出jmeter、postman脚本(带请求头)

课程大纲 1. Fiddler导出请求为curl脚本 选中请求&#xff0c;“文件” - “导出会话” - “选中的会话” - “cURL Script”。 2. 导入jmeter ① 复制curl脚本。 ② 打开jmeter&#xff0c;“工具” - “import from cURL”&#xff0c;粘贴脚本&#xff0c;勾选“Add cooki…

【百度文心智能体】想开发爆款智能体?来看看 万圣节之夜探秘者 智能体开发流程大揭秘

目录 前言 一. 创作灵感 二. 智能体中Prompt如何设计 2.1 头像 && 聊天背景 2.2 智能体简介 && 角色定位与目标 2.3 思考路径 && 个性化 2.4 开场白 && 自动追问 2.5 插件选择 三. 总结 前言 从2022年11月底ChatGPT …

Github优质项目推荐-第四期

文章目录 Github优质项目推荐 - 第四期一、【Umi-OCR】&#xff0c;26.1k stars - 文字识别工具二、【AFFiNE】&#xff0c;41k stars - 知识库平台三、【NocoBase】&#xff0c;12k stars - 无代码/低代码平台四、【neovim】&#xff0c;82.3k stars - 改良版VIM五、【generat…