阳关男孩
人工智能:CNN过时了吗?有人提出GNN
主题:DeepMind的提议:把传统的贝叶斯因果网络和知识图谱,与深度强化学习融合一、提出“图网络” 图灵奖得主Judea Pearl指出的深度学习无法做因果推理的核心问题。 图灵奖得主、贝叶斯网络之父Judea Pearl,在ArXiv发布了他的论文《机器学习理论障碍与因果革命七大火花》,论述当前机器学习理论局限,并给出来自因果推理的7大启发。Pearl指出,当前的机器学习系统几乎完全以统计学或盲模型的方式运行,不能作为强AI的基础。他认为突破口在于“因果革命”,借鉴结构性的因果推理模型,能对自动化推理做出独特贡献。 DeepMind联合谷歌大脑、MIT等机构27位作者发表重磅论文,提出“图网络”(Graph network),将端到端学习与归纳推理相结合,有望替换深度学习,克服深度学习无法进行关系推理的问题。二、AI的学派和成果 机器学习界有三个主要学派,符号主义(Symbolicism)、连接主义(Connectionism)、行为主义(Actionism)。符号主义的起源,注重研究知识表达和逻辑推理。 经过几十年的研究,目前这一学派的主要成果,一个是贝叶斯因果网络,另一个是知识图谱。 贝叶斯因果网络的旗手是 Judea Pearl 教授,2011年的图灵奖获得者。但是据说 2017年 NIPS 学术会议上,老爷子演讲时,听众寥寥。2018年,老爷子出版了一本新书,“The Book of Why”,为因果网络辩护,同时批判深度学习缺乏严谨的逻辑推理过程。而知识图谱主要由搜索引擎公司,包括谷歌、微软、百度推动,目标是把搜索引擎,由关键词匹配,推进到语义匹配。连接主义的起源是仿生学,用数学模型来模仿神经元。 Marvin Minsky 教授因为对神经元研究的推动,获得了1969年图灵奖。把大量神经元拼装在一起,就形成了深度学习模型,深度学习的旗手是 Geoffrey Hinton 教授。深度学习模型最遭人诟病的缺陷,是不可解释。行为主义把控制论引入机器学习,最著名的成果是强化学习。 强化学习的旗手是 Richard Sutton 教授。近年来Google DeepMind 研究员,把传统强化学习,与深度学习融合,实现了 AlphaGo,战胜当今世界所有人类围棋高手。DeepMind 前天发表的这篇论文,提议把传统的贝叶斯因果网络和知识图谱,与深度强化学习融合,并梳理了与这个主题相关的研究进展。三、DeepMind的技术指向“关系” 作为行业的标杆,DeepMind的动向一直是AI业界关注的热点。最近,这家世界最顶级的AI实验室似乎是把他们的重点放在了探索“关系”上面,6月份以来,接连发布了好几篇“带关系”的论文,比如:关系归纳偏置(Relational inductive bias for physical construction in humans and machines)关系深度强化学习(Relational Deep Reinforcement Learning)关系RNN(Relational Recurrent Neural Networks)论文比较多,但如果说有哪篇论文最值得看,那么一定选这篇——《关系归纳偏置、深度学习和图网络》。而图网络是操作关系的最佳推手。四、图网络构成概要 在论文里,作者探讨了如何在深度学习结构(比如全连接层、卷积层和递归层)中,使用关系归纳偏置(relational inductive biases),促进对实体、对关系,以及对组成它们的规则进行学习。 他们提出了一个新的AI模块——图网络(graph network),是对以前各种对图进行操作的神经网络方法的推广和扩展。图网络具有强大的关系归纳偏置,为操纵结构化知识和生成结构化行为提供了一个直接的界面。 作者还讨论了图网络如何支持关系推理和组合泛化,为更复杂、可解释和灵活的推理模式打下基础。
阳关男孩
图神经网络 (GNN) 概述
一、说明 神经网络是受人脑工作启发的计算模型,能够从复杂的非结构化数据(如图像、文本、音频和视频)中学习。然而,还有许多其他类型的数据无法用传统的神经网络轻松表示,例如那些具有图形结构的数据。图形是节点和边的集合,分别表示系统的实体和关系。图表无处不在:从社交网络、推荐系统、计算化学、分子生物学、网络安全等等。我们如何利用神经网络的力量来分析和学习这些图形数据? 答案是:使用图神经网络(GNN)。GNN是一类直接在图上运行的神经网络,利用节点和边的结构和语义信息。GNN 能够学习节点的向量表示(或嵌入),从而在图中捕获它们的特征和上下文。然后,这种表示可用于各种任务,例如节点分类、链接预测、图形生成、空间和时间推理等等。 GNN是一个非常活跃且发展迅速的研究领域,面临着许多挑战和机遇。在本文中,我想对 GNN 进行概述,说明它们的工作原理、应用、它们与传统神经网络的区别以及它们的关键概念和术语。特别是,我将重点介绍四种类型的 GNN:图卷积网络 (GCN)、图注意力网络 (GAT)、时态图网络 (TGN) 和内存增强图神经网络 (MA-GNN)。之所以选择这些类型的GNN,是因为它们代表了GNN领域中一些最具创新性和影响力的想法,并且因为它们涵盖了广泛的场景和应用。二、图卷积网络 (GCN) 卷积是将输入信号转换为输出信号的数学运算,同时保留原始信号的某些属性,例如局部性、平稳性和组合性。卷积在神经网络中广泛用于分析图像、文本、音频和视频,这些图像、文本、音频和视频可以看作是规则网格上的定义信号。然而,图形没有规则的结构,而是不规则和可变的。我们如何将卷积应用于图形? 图卷积网络 (GCN) 是一类用于图的神经网络,它使用卷积来学习图节点的向量表示。GCNs的基本思想是在图上定义一个卷积算子,它允许节点及其邻居的信息被高效且不变地聚合。有几种方法可以在图形上定义卷积算子,具体取决于如何对节点之间的关系进行建模、如何对邻居进行加权以及如何组合信息。图上卷积算子的一些示例包括:频谱、空间域、时域和频域。 GCN 能够学习节点的向量表示(或嵌入),从而在图中捕获它们的特征和上下文。然后,这种表示可用于各种任务,例如节点分类、链接预测、图形生成、空间和时间推理等等。基于 GCN 的算法的一些示例包括:GraphSage、PinSage、Graph Isomorphism Network、Graph U-Net 等。 你是对的,我忘了在我的文章中描述 PinSage。PinSage 是一种图神经网络 (GNN) 算法,它使用卷积来学习图节点的向量表示。PinSage 的独特之处在于它使用随机游走对节点的邻居进行采样,而不是使用均匀或加权采样。随机游走是一个随机过程,包括以随机方式沿着图形的边缘从一个节点移动到另一个节点。随机游走允许您探索图形中更大、更多样化的部分,并为与目标节点最相关的邻居分配更高的重要性。PinSage 旨在处理大型图表,例如 Pinterest 的图表,并为用户生成个性化推荐。三、图注意力网络 (GAT) 注意力是一种机制,允许您将注意力集中在输入信号的一部分上,而忽略其他不相关的部分。注意力在神经网络中被广泛用于分析文本、音频和视频,可以看作是元素的序列。然而,图不是序列,而是不规则和可变的结构。我们怎样才能把注意力放在图表上? 图注意力网络 (GAT) 是一类图神经网络,它使用注意力来学习图节点的向量表示。GAT 的基本思想是在图形上定义注意力机制,它允许您根据节点与目标节点的相关性为节点的邻居分配权重。通过这种方式,GAT能够有选择地和自适应地聚合节点及其邻居的信息,同时考虑到图的结构和内容。 GAT 使用空间方法聚合邻居信息,其中包括计算目标节点与其邻居之间的相似性函数,然后使用 softmax 函数对权重进行归一化。GAT 可以使用不同类型的相似函数,例如标量积、加性标量积或乘法标量积。GAT 还可以使用多个注意力头来学习节点的不同表示,然后将它们连接或调解以获得最终表示。 GAT 能够学习节点的向量表示(或嵌入),从而在图中捕获它们的特征和上下文。然后,这种表示可用于各种任务,例如节点分类、链接预测、图形生成、空间和时间推理等等。基于 GAT 的算法的一些示例包括:Graph Transformer、Graph Attention U-Net、Graph Attention Autoencoder 等。四、时态图网络 (TGN) 时态图是一种随时间变化的图,其结构和内容都发生了变化。时间图可以表示动态现象,例如社会互动、金融交易、化学反应、生物过程等等。我们如何从时间图中学习? 时态图网络 (TGN) 是一类神经图网络,它使用时间作为学习时态图节点的向量表示的基本维度。TGN 的基本思想是对节点和链接随时间变化的动态进行建模,同时考虑它们的属性和变化。TGN 能够将内存和时间嵌入到 GNN 中,以捕获时间依赖性以及节点和链路的演变。 TGN 使用编码模块根据节点的静态和动态特性来学习节点的向量表示。TGN 使用聚合模块根据节点与邻居随时间推移的交互来更新节点的表示。TGN 使用内存模块根据节点的时间相关性来存储和检索节点的表示。TGN 使用解码模块根据节点的表示和当前时间生成预测。 TGN 能够学习节点的向量表示(或嵌入),从而在时间图中捕获它们的特征和上下文。然后,这种表示可用于各种任务,例如节点分类、链接预测、图形生成、空间和时间推理等等。基于 TGN 的算法的一些示例包括:DyRep、JODIE、Know-Evolve 等。五、结论 在本文中,我概述了图神经网络 (GNN),这是一类直接在图上运行的神经网络,利用节点和边的结构和语义信息。我阐述了GNN的工作原理、应用、与传统神经网络的区别,以及关键概念和术语。特别是,我关注了四种类型的GNN:图卷积网络(GCN)、图注意力网络(GAT)、时态图网络(TGN)和内存增强图神经网络(MA-GNN)。 GNN是一个非常活跃且发展迅速的研究领域,面临着许多挑战和机遇。GNN 能够学习节点的向量表示,从而在图形中捕获它们的特征和上下文。然后,这种表示可用于各种任务,例如节点分类、链接预测、图形生成、空间和时间推理等等。GNN 已被证明在许多领域和场景中是有效和高效的,例如社交网络、推荐系统、计算化学、分子生物学、网络安全等。
阳关男孩
【机器学习】— 2 图神经网络GNN
一、说明 在本文中,我们探讨了图神经网络(GNN)在推荐系统中的潜力,强调了它们相对于传统矩阵完成方法的优势。GNN为利用图论来改进推荐系统提供了一个强大的框架。在本文中,我们将在推荐系统的背景下概述图论和图神经网络(GNN)。在推荐系统系列的第一部分中,我们讨论了任务和常用的各种类型的推荐系统,以及基于业务上下文的相关指标。在本文中,我们将在推荐系统的背景下概述图论和图神经网络(GNN)。二、经典矩阵补全方法 推荐系统的一种流行技术是利用经典的机器学习方法进行矩阵补全,这是一种协同过滤方法。给定用户数 m 和数项 n,它旨在填充用户-项交互矩阵 R(维度为 mxn)中的缺失值。为了实现这一点,我们将每个用户和项目映射到大小为 k 的嵌入 — 向量空间中的抽象表示。这些嵌入可能会捕获电影类型或用户人口统计数据等特征,但很多时候是潜在的未知特征。生成用户嵌入矩阵 U(维度为 mxk)和项目嵌入矩阵 I(维度为 nxk)。 为了预测用户-项目对,我们计算转置项目矩阵和用户矩阵的点积。最初,潜在矩阵是随机初始化的,我们使用基于已知用户-项交互的损失函数优化嵌入。 图 1:此图显示了用户-项交互矩阵 R,以及我们如何在用户和项嵌入矩阵之间取点积来预测 R 矩阵中的特定值。 但是,此方法在处理稀疏矩阵时会遇到性能问题。在用户仅与数百万个可用项中的几个项交互的情况下,经典的矩阵完成方法可能是不够的,因为它们只考虑用户和项之间的直接连接。为了解决这一限制,基于图神经网络(GNN)的推荐系统已成为一种更有效的替代方案。 GNN 不仅通过考虑单个用户的偏好,还集成来自相邻用户的信息,在稀疏数据集中提供改进的性能。通过利用图形结构,GNN 可以更全面地捕获用户和项目之间的关系,从而实现更准确和个性化的推荐。让我们首先提醒自己一些关于图论的知识。三、图论概述3.1 什么是图表? 图形是一种数据结构,将实体集合表示为节点(顶点),并将其关系表示为边。它是建模和理解各种真实场景的强大工具。例如,图表可以表示银行交易,其中节点符号化银行账户,边表示它们之间的交易。同样,社交网络图以人为节点,边缘描绘个人之间的关系。 图 2:图形示例。 图表的类型 根据其特征,有不同类型的图形。 有向图具有具有特定方向的边。 例如,在银行交易图中,每条边表示从发送方到接收方的交易,从而建立明确的方向。另一方面,无向图不会为边分配方向。在社交网络中,无向边缘表示两个人之间的联系或相识,没有任何固有的方向性。 图形也可以分为同构或异构。 同类图具有单一类型的节点和边,而异构图可能包含多种类型。例如,在电子商务方案中,可能有两种类型的节点:一种表示可供销售的商品,另一种表示用户。不同类型的边缘可以表示不同的交互,例如用户单击项目或进行购买。 图 3:有向图、无向图、齐次图和异构图的示例 二分图是一种特定类型的异构图,在建模推荐系统方面非常有用。它们涉及两组不同的节点,例如用户和项目,边缘专门连接来自不同集的节点。二分图有效地捕获用户-项目交互,并启用高效的推荐算法来利用丰富的网络结构。 图 4:二分图示例。3.2 我们如何存储图形数据? 有多种方法可以存储图形数据。一种方法是使用邻接矩阵,表示为 A ∈ {0, 1}ⁿxⁿ,其中 n 是图中的节点数。矩阵的 (i, j) 条目 Ai,j 表示节点 vi 和 vj 之间的连通性,如果有连接 vi 和 vj 的边,则为 Ai,j = 1。对于无向图,邻接矩阵是对称的,即 Ai,j = Aj,i。但是,对于大型和稀疏图(如社交网络),邻接矩阵可能是内存密集型的。这是因为邻接矩阵随节点数而缩放。在拥有数百万个节点的社交网络中,大多数人彼此不认识。这将导致一个大矩阵,其中大多数单元格为空。 为了解决这个问题,邻接列表表示形式对内存效率更高。 它将节点之间的边描述为元组 (i,j),其中 (0,1) 表示节点 0 和 1 之间的边。例如,对于图 5 中的图形,邻接列表为 [(A,B)、(B,D)、(B,C)、(D,C)]。 图 5a:图形示例 — 图 5b:图 4a 中图形的邻接矩阵。 邻接列表表示形式提供了更高的内存效率,特别是对于稀疏图,因为它仅存储有关连接节点的必要信息。这使其成为处理大规模图形数据(例如社交网络)的首选,其中连接数与节点总数相比通常有限。四、推荐系统中的图神经网络 与传统的矩阵完成方法类似,GNN 可以为用户和项目生成嵌入,以预测看不见的用户-项目交互。但是,它们提供了一种显式合并高阶图结构的方法,并且可以捕获数据本身中可能不可用的潜在或隐藏相关性。 给定一个图,我们的目标是将每个节点 v 映射到其自己的 d 维最终嵌入,其中基于其网络邻域特征以及自身特征的相似节点最终应在其最终嵌入空间中彼此接近。 图 6:节点编码到嵌入空间。4.1 图形神经网络层 GNN 的一层在图中的所有直接邻居之间交换信息,为图中的每个节点生成新的节点嵌入。在 2 层 GNN 模型中,每个节点将根据其 2 跳邻域生成其第 2 层嵌入。 K-hop 邻域是指距离感兴趣节点 K 边的所有节点。这是一个迭代过程,其中邻居变量通过传递消息(一种消息传递方法)与每个变量“对话”。 图 7:2 层 GNN 中特定目标节点的输入图和计算图 在此图像中,我们看到节点 A 的第 2 层表示是通过以某种方式聚合其直接邻居 [B,C,D] 的第 1 层嵌入并对其应用黑盒转换或神经网络生成的。这些嵌入又由其第 0 层 [X_A、X_B...X_F] 嵌入直接相邻要素,这是初始输入要素。每一层都会生成一个新的节点嵌入,节点的 K 层嵌入从距离自身的 K 跳节点获取信息。4.2 图神经网络的特点、优势和局限性 图神经网络(GNN)具有几个显着的特征和优势,使其与传统的矩阵补全方法区分开来。这些特征有助于它们在推荐系统中的有效性。让我们探索这些功能:· 阶次不变性: GNN 是顺序不变的,这意味着节点的标记顺序不会影响结果。计算图考虑节点连接而不是节点顺序,利用顺序不变的聚合函数(如平均值、最大/最小池化)进行消息传递。· 大小不变性: GNN 中的每个节点都有自己的计算图,这使得 GNN 的大小不变。这允许各个节点根据其本地邻域处理和集成信息,从而实现个性化和灵活的学习。下图显示了上图中每个节点的计算图。 图 8:图 7 输入图中每个节点的计算图。· 处理稀疏矩阵:与经典的矩阵补全方法不同,GNN 擅长处理稀疏矩阵。它们超越了直接节点交互,并捕获了高阶图结构中存在的隐藏相关性。此功能增强了它们在交互受限的场景中的性能· 端到端学习: GNN 提供端到端学习,同时优化嵌入和预测任务。这减轻了对手动特征工程的需求,简化了推荐管道。此外,GNN 可以很好地适应不断发展的用户/项目功能,从而减少对重大代码修改的需求。 尽管GNN具有优势,但它们也有应考虑的局限性:· 计算复杂性:GNN 可能是计算密集型的,特别是对于大型图形和深度架构。与更简单的模型相比,训练GNN可能需要大量的计算资源和更长的训练时间。· 可解释性:与传统方法相比,GNN的复杂性可能使它们的可解释性降低。了解基于 GNN 的建议背后的内部工作原理和推理可能具有挑战性。五、结论 通过利用嵌入在图结构中的丰富信息,GNN可以捕获复杂的模式,发现潜在特征,并在推荐过程中考虑相邻用户的影响。这种方法增强了推荐系统做出准确预测的能力,即使在经典方法难以生存的稀疏数据集中也是如此。 随着推荐系统领域的不断发展,GNN已成为解决传统方法局限性的有前途的解决方案。 他们适应不同领域并自动从数据中学习的能力使他们非常适合在各种情况下提供相关和量身定制的建议。 在本系列的下一部分中,我们将深入研究GNN的数学基础,特别关注LightGCN在电影推荐系统中的应用。通过了解基本原理和算法,我们可以进一步了解GNN如何改变推荐系统的格局。
阳关男孩
自组织地图 (SOM) — 介绍、解释和实现
自组织地图 (SOM) — 介绍、解释和实现一、说明 什么是SOM(self orgnize map)自组织地图,是GNN类似的图神经网络的概念。因为神经网络实质上可以解释为二部图的权重,因此无论GNN还是SOM都有共同的神经网络属性。本文将叙述这中SOM内的结构模型。二、关于 SOM 芬兰教授Teuvo Kohonen在1980年代提出的自组织地图或SOM提供了一种在保留数据拓扑的同时对数据集进行低维和离散化表示的方法,称为“地图”。 目标是学习一个以类似方式响应类似输入模式的地图。它被学习为一个权重数组,它被解释为一个神经元数组,其中每个神经元本身都是一个与输入数据点具有相同维度的向量,如下所示。神经元直接受到输入数据的影响。 权重数组中神经元之间的距离用于生成表征数据分布的映射。 SOM 具有轻松可视化特征行为的优势。由于可以从学习的表示中访问各个特征,因此表示每个特征的数据行为。 让我们分解一下: “自组织” SOM 是一种无监督的人工神经网络。它不是使用误差最小化技术,而是使用竞争性学习。特征向量使用数据点和学习表示之间的基于距离的指标映射到低维表示,不需要任何其他计算,使其“自组织”。“地图”学习到的结果权重由U矩阵(统一距离矩阵,下面详细解释)表示,这是一个表示神经元之间距离的“映射”。学习SOM背后的想法是,形成的映射以类似的方式响应类似的输入,在生成的映射的某些区域中将类似的输入组合在一起。三、在 Python 中的实现 Eklavya 连贯地解释了该算法,提供了带有变量适当表示的分步解释,我们也将用于我们的 Python 实现。Kohonen自组织地图一种特殊类型的人工神经网络towardsdatascience.com 目标是学习一个权重数组,在我们的例子中是一个 3D 数组,但被解释为神经元大小为 x 的 2D 数组,其中每个神经元都是长度的 1D 向量。我们正在学习数据集的 2D 表示。 然后用于生成 U 矩阵 — 整个数据集的单个 2D 地图。Wlengthwidthn_featuresW 图1 - 权重数组“W” 每个输入向量用于更新 。最接近数据点的神经元是最佳匹配单元(BMU)。其余神经元与BMU的距离用于更新邻域函数,该函数是更新的基础。中较大的值表示相似输入向量的聚类。邻域函数的学习率和半径随时间衰减,因为邻域变小,即相似的输入被分组得更紧密。WWWW 首先,导入所有必要的库。from sklearn.preprocessing import MinMaxScaler, StandardScaler
import matplotlib
import matplotlib.pyplot as plt
import numpy as np
import random
import time
from itertools import product四、第一部分:从数据集导入到权重获取 对于数据,我们使用用于预测胎儿健康的数据集,该数据集将胎儿的健康分类为 、 或使用 CTG 数据。它有 22 个功能,但我们只关注前 10 个功能:NormalSuspectPathologicalfilein = "fetal_health.csv"
data = np.loadtxt(open(filein, "rb"), delimiter = ",", skiprows = 1)
features = ['baseline value', 'accelerations', 'fetal_movement',
'uterine_contractions', 'light_decelerations',
'severe_decelerations', 'prolongued_decelerations',
'abnormal_short_term_variability',
'mean_value_of_short_term_variability',
'percentage_of_time_with_abnormal_long_term_variability']
X_data = np.array(data)[:,0:len(features)]
print("Number of datapoints: ", X_data.shape[0])
print("Number of features: ", X_data.shape[1]) 而且,由于它使用基于距离的指标,我们将继续缩放输入:scaler = MinMaxScaler()
X_data = scaler.fit_transform(X_data) # normalizing, scaling 现在,深入探讨算法实现的细节。首先,我们看一下超参数:n_features = X_data.shape[1]
max_iter = 1000 # max. no. of iterations
length = 50 # length of W
width = 50 # width of W
W = np.random.rand([length, width, n_features]) # initial weights
aplha0 = 0.9 # initial learning rate
beta = [[]] # neighbourhood function
sigma0 = max(length, width) # initial radius of beta
TC = max_iter/np.log(sigma0) # time constant· length, , — 权重矩阵的维度,其中 和 指定 feaure 地图的大小,值越高,结果越精细。使用随机值初始化。widthn_feauturesWlengthwidthW· max_iter— 我们想要运行算法的最大迭代次数。· TC— 用于学习率和邻域半径衰减的时间常数。· alpha0— 动态学习率的初始值。学习率衰减为时间步长或迭代次数t的指数函数:alphatdef aplhaUpdate(t):
return aplha0*np.exp(-t/TC)· sigma0— 邻域函数的动态(收缩)半径的初始值。我们从一个半径开始,该半径覆盖了神经元的整个 2D 映射。它的更新方式与 相同。Walphadef sigmaUpdate(t):
return sigma0*np.exp(-t/TC)· beta一个 2D 向量,用于存储 中每个节点的邻域函数的值。BMU· BMU— est atching nit 是最接近输入数据点的节点,即与它的距离最短,在我们的例子中,欧几里得距离,如下所示。def winningNode(x_n, W): # Find the winning node and distance to it
dist = np.linalg.norm(x_n - W, ord =2 , axis = 2)
d = np.min(dist)
BMU = np.argwhere(dist == np.min(dist))
return d, BMU· 要更新,我们首先需要找到权重向量中每个节点与 . 是表示每个长向量到每个其他向量的欧几里得距离的向量,其中每个向量由其 x 和 y 坐标表示。betaBMUhardDistn_featureWWcoordshardDist = np.zeros([length, width, length, width])
for i,j,k,l in product(range(length),range(width),range(length),range(width)):
hardDist[i,j,k,l]= ((i-k)**2 + (j-l)**2)**0.5· gridDistances用于访问表示距离或每个向量在位置 的 2D 数组。coordsdef gridDistances(coords):
return hardDist[coords[0][0],coords[0][1],:,:]· 然后我们可以更新 .对于每个输入向量,计算为最接近 的点提供最小值。betabetaBMUdef betaUpdate(coords, sigma): # neighbourhood function
return np.exp(-gridDistances(coords)**2/(2*sigma**2))· 下图显示了一个权重数组,在第二张图中可以想象为矢量神经元的 2D 数组。以红色突出显示的矢量是 BMU。蓝色表面显示了每个神经元的值,在BMU处最高。的值表示二维正态分布。Wbetabeta 图 2 — W,BMU 以红色突出显示(左和右),为 sigma=1.5 绘制的 beta 值,显示 BMU 处的 beta 值最高。· 最后,我们可以更新 .我们看到有三个因素影响了更新:(1),它在数据集的一次迭代中是恒定的;(2)、每个向量与输入向量的差值;和(3) .将因子添加到 ,因此对于靠近输入的向量,的值更大,从而导致 中的向量值更大。WWalphaf=x_n-WWbetaalpha*beta*fWWbetaWdef weightUpdate(W, aplha, beta, x_t):
f= (x_t-W)
beta = np.reshape(beta,[beta.shape[0],beta.shape[1],1])
return W+aplha*beta*f 现在,我们已经讨论了初步内容,我们可以将它们放在一起: errors=np.zeros([max_iter])
for t in range(max_iter):
t1 = time.time()
alpha = aplhaUpdate(t)
sigma = sigmaUpdate(t)
np.random.shuffle(X_data)
n_sample = len(X_data) # iterating over whole dataset
QE = 0
for n in range(n_sample):
d, BMU = winningNode(X_data[n,:], W)
QE = QE + d
beta = betaUpdate(BMU, sigma)
W = weightUpdate(W, alpha, beta, X_data[n,:])
W /= np.linalg.norm(W, axis=2).reshape((length, width, 1))
QE /= n_sample
errors[t]=QE
t1 = time.time() - t1
print("Iteration: ", "{:05d}".format(t), " | Quantization Error: ", "{:10f}".format(QE), " | Time: ", "{:10f}".format(t1))让我们一步一步地看一下。· 对于每次迭代,并略微衰减以适应 中的逐渐变化。alphasigmaW· 对于数据集中的每个输入向量,我们找到 BMU 和 BMU 与输入向量的距离 .d· beta根据BMU进行更新,然后用于更新.W· W被归一化,以便在不同的值下保持可比性。Wt· 为了监控学习过程,我们使用量化误差,这是每个数据点到其BMU的距离的平均值。如果更新正确,它应该在迭代中减少。QEW当我们在数据集上运行它时,我们得到以下输出: 我们可以通过沿其代表特征的最后一个维度切片来绘制各个特征图。W图3 - 特征图 这样就完成了学习获取单个特征图的第一步。W五、第二部分:U矩阵获取 第二部分是简单地计算神经元之间的距离以获得U矩阵(Unified-distance矩阵),它可以是六边形或矩形。在下图中,我们看到了查看 中神经元 2D 数组的两种方式。W 图 5 — W、六边形(左)和矩形(右)的不同解释 U矩阵表示神经元之间的距离。下图显示了六边形和矩形表示的 U 矩阵。在两张图像中,黄色细胞表示相邻神经元之间的距离,例如,{1,2}是上图中神经元1和2之间的距离。橙色单元格表示从神经元数到周围神经元的距离的平均值,即 {1}=mean({1,2}, {1,4}) 或 {5}=mean({2,5}, {4,5}, {5,6}, {5,7}, {5,8}, {5,9}) 对于六边形 U 矩阵,{5}=mean({2,5}, {4,5}, {5,6}, {5,8}) 对于矩形矩阵。 图 6 — U 矩阵,六边形(左)和矩形(右) 在矩形 U 矩阵中,还有一种其他类型的单元格,以蓝色突出显示。我们不能将其视为蓝色单元格角上的橙色单元格之间的距离,例如平均值({1},{5})或平均值({2},{4}),因为这些值对蓝色单元格都有效,但不相等,这将是矛盾的。因此,我们将该值作为其周围黄色单元格的平均值,从而允许最终 U 矩阵中的单元格之间更平滑地过渡。有关进一步说明,请参阅此文章。下面给出了两种类型的 U 矩阵的计算。 对于黄色单元格,我们计算相邻神经元之间的距离,橙色和蓝色单元格计算为它们上方、下方和两侧单元格的平均值。# CALCULATION OF RECTANGULAR U-MATRIX FROM W
def make_u_rect(W):
U = np.zeros([W.shape[0]*2-1, W.shape[1]*2-1], dtype=np.float64)
# YELLOW CELLS
for i in range(W.shape[0]): # across columns
k=1
for j in range(W.shape[1]-1):
U[2*i, k]= np.linalg.norm(W[i,j]-W[i,j+1], ord=2)
k += 2
for j in range(W.shape[1]): # down rows
k=1
for i in range(W.shape[0]-1):
U[k,2*j] = np.linalg.norm(W[i,j]-W[i+1,j], ord=2)
k+=2
# ORANGE AND BLUE CELLS - average of cells top, bottom, left, right.
for (i,j) in product(range(U.shape[0]), range(U.shape[1])):
if U[i,j] !=0: continue
all_vals = np.concatenate((
U[(i-1 if i>0 else i): (i+2 if i<=U.shape[0]-1 else i), j],
U[i, (j-1 if j>0 else j): (j+2 if j<=U.shape[1]-1 else j)]))
U[i,j] = all_vals[all_vals!=0].mean()
# Normalizing in [0-1] range for better visualization.
scaler = MinMaxScaler()
return scaler.fit_transform(U) 对于六边形矩阵,我们使用神经元本身的值作为位置{1}、{2}、...以简化 中 {1,2}、{2,3} 等的计算。{1}, {2}, ...然后替换为其周围值的平均值。U# CALCULATION OF HEXAGONAL U-MATRIX FROM W
def make_u_hex(W):
# Creating arrays with extra rows to accommodate hexagonal shape.
U_temp = np.zeros([4*W.shape[0]-1, 2*W.shape[1]-1, W.shape[2]])
U = np.zeros([4*W.shape[0]-1, 2*W.shape[1]-1])
"""
The U matrix is mapped to a numpy array as shown below.
U_temp holds neuron at postion 1 in place of {1} for easy computation
of {1,2}, {2,3} etc. in U. {1}, {2}, {3}, ... are computed later.
[
[ (1), 0, 0, 0, (3)],
[ 0, (1,2), 0, (2,3), 0],
[ (1,4), 0, (2), 0, (3,6)],
[ 0, (2,4), 0 , (2,6), 0],
[ (4), 0, (2,5), 0, (6)],
[ 0, (4,5), 0, (5,6), 0],
[ (4,7), 0, (5), 0, (6,9)],
[ 0, (2,4), 0, (5,9), 0],
[ (7), 0, (5,8), 0, (9)],
[ 0, (7,8), 0, (8,9), 0],
[ 0, 0, (8), 0, 0]
]
"""
# Creating a temporary array placing neuron vectors in
# place of orange cells.
k=0
indices = []
for i in range(W.shape[0]):
l=0
for j in range(W.shape[1]):
U_temp[k+2 if l%4!=0 else k,l,:] = W[i,j,:]
indices.append((k+2 if l%4!=0 else k,l))
l+=2
k += 4
# Finding distances for YELLOW cells.
for (i,j),(k,l) in product(indices, indices):
if abs(i-k)==2 and abs(j-l)==2: # Along diagonals
U[int((i+k)/2), int((j+l)/2)] =
np.linalg.norm(U_temp[i,j,:]-U_temp[k,l,:], ord=2)
if abs(i-k)==4 and abs(j-l)==0: # In vertical direction
U[int((i+k)/2), int((j+l)/2)] =
np.linalg.norm(U_temp[i,j,:]-U_temp[k,l,:], ord=2)
# Calculating ORANGE cells as mean of immediate surrounding cells.
for (i,j) in indices:
all_vals =
U[(i-2 if i-1>0 else i): (i+3 if i+2<U.shape[0]-1 else i),
(j-1 if j>0 else j): (j+2 if j<=U.shape[1]-1 else j)]
U[i,j] = np.average(all_vals[all_vals!=0])
# To remove extra rows introduced in above function.
new_U = collapse_hex_u(U)
# Normalizing in [0-1] range for better visualization.
scaler = MinMaxScaler()
return scaler.fit_transform(new_U)
def collapse_hex_u(U):
new_U = np.zeros([int((U.shape[0]+1)/2), U.shape[1]])
# Moving up values in every alternate column
for j in range(1, U.shape[1], 2):
for i in range(U.shape[0]-1):
U[i,j]=U[i+1,j]
# Removing extra rows
for i in range(new_U.shape[0]): new_U[i,:] = U[2*i,:]
return new_U 要绘制六边形网格,我们需要自己在图上绘制六边形。对于折叠的六边形,我们可以绘制 U 矩阵,方法是为每个点绘制一个六边形,每两列有一个轻微的 y 偏移量,以制作一个网格,如图 6 所示。Udef draw_hex_grid(ax, U):
def make_hex(ax, x, y, colour):
if x%2==1: y=y+0.5
xs = np.array([x-0.333,x+0.333,x+0.667,x+0.333,x-0.333,x-0.667])
ys = np.array([ y+0.5, y+0.5, y, y-0.5, y-0.5, y])
ax.fill(xs, ys, facecolor = colour)
ax.invert_yaxis()
cmap = matplotlib.cm.get_cmap('jet')
for (i,j) in product(range(U.shape[0]), range(U.shape[1])):
if U[i,j]==0: rgba='white'
else: rgba = cmap(U[i,j])
make_hex(ax, i, j, rgba)
ax.set_title("U-Matrix (Hexagonal)")图 3 所示的两种类型的 U 矩阵结果为:W 图 7 — U 矩阵 在学习过程中拍摄如图 3 所示的快照,我们可以观察每个特征图和 U 矩阵的学习情况。上面显示的颜色图显示,红色表示最大值,表示该区域中聚集的更多输入数据点,而模糊区域表示输入数据点稀疏出现的空间。W 随着迭代的进行,学习速度变慢了。在开始的迭代中,特征图变化很大,而在以后的迭代中,它们变得有些稳定。矩阵也出现了同样的趋势,社区的规模在缩小。这也反映在 中,其下降速率随时间而降低。哈尼亚·安尤姆 显示“W”和“U”学习的.gif图像(在新选项卡中打开以再次播放)
阳关男孩
图卷积网络:GNN 深入探讨【02/4】
一、说明在各种类型的GNN中,图卷积网络(GCN)已成为最普遍和应用最广泛的模型。GCN具有创新性,因为它们能够利用节点的特征及其局部性进行预测,从而提供了一种处理图形结构数据的有效方法。在本文中,我们将在推荐系统的背景下概述图论和图神经网络(GNN)。二、经典矩阵补全方法 系统的一种流行技术是利用经典的机器学习方法进行矩阵补全,这是一种协同过滤方法。给定用户数 m 和数项 n,它旨在填充用户-项交互矩阵 R(维度为 mxn)中的缺失值。为了实现这一点,我们将每个用户和项目映射到大小为 k 的嵌入 — 向量空间中的抽象表示。这些嵌入可能会捕获电影类型或用户人口统计数据等特征,但很多时候是潜在的未知特征。生成用户嵌入矩阵 U(维度为 mxk)和项目嵌入矩阵 I(维度为 nxk)。 为了预测用户-项目对,我们计算转置项目矩阵和用户矩阵的点积。最初,潜在矩阵是随机初始化的,我们使用基于已知用户-项交互的损失函数优化嵌入。 图 1:此图显示了用户-项交互矩阵 R,以及我们如何在用户和项嵌入矩阵之间取点积来预测 R 矩阵中的特定值。 但是,此方法在处理稀疏矩阵时会遇到性能问题。在用户仅与数百万个可用项中的几个项交互的情况下,经典的矩阵完成方法可能是不够的,因为它们只考虑用户和项之间的直接连接。为了解决这一限制,基于图神经网络(GNN)的推荐系统已成为一种更有效的替代方案。 GNN 不仅通过考虑单个用户的偏好,还集成来自相邻用户的信息,在稀疏数据集中提供改进的性能。通过利用图形结构,GNN 可以更全面地捕获用户和项目之间的关系,从而实现更准确和个性化的推荐。让我们首先提醒自己一些关于图论的知识。三、图论概述3.1 什么是图表? 图形是一种数据结构,将实体集合表示为节点(顶点),并将其关系表示为边。它是建模和理解各种真实场景的强大工具。例如,图表可以表示银行交易,其中节点符号化银行账户,边表示它们之间的交易。同样,社交网络图以人为节点,边缘描绘个人之间的关系。图 2:图形示例。3.2 图表的类型 根据其特征,有不同类型的图形。 有向图具有具有特定方向的边。 例如,在银行交易图中,每条边表示从发送方到接收方的交易,从而建立明确的方向。另一方面,无向图不会为边分配方向。在社交网络中,无向边缘表示两个人之间的联系或相识,没有任何固有的方向性。 图形也可以分为同构或异构。 同类图具有单一类型的节点和边,而异构图可能包含多种类型。例如,在电子商务方案中,可能有两种类型的节点:一种表示可供销售的商品,另一种表示用户。不同类型的边缘可以表示不同的交互,例如用户单击项目或进行购买。图 3:有向图、无向图、齐次图和异构图的示例 二分图是一种特定类型的异构图,在建模推荐系统方面非常有用。它们涉及两组不同的节点,例如用户和项目,边缘专门连接来自不同集的节点。二分图有效地捕获用户-项目交互,并启用高效的推荐算法来利用丰富的网络结构。图 4:二分图示例。3.3 我们如何存储图形数据? 有多种方法可以存储图形数据。一种方法是使用邻接矩阵,表示为 A ∈ {0, 1}ⁿxⁿ,其中 n 是图中的节点数。矩阵的 (i, j) 条目 Ai,j 表示节点 vi 和 vj 之间的连通性,如果有连接 vi 和 vj 的边,则为 Ai,j = 1。对于无向图,邻接矩阵是对称的,即 Ai,j = Aj,i。但是,对于大型和稀疏图(如社交网络),邻接矩阵可能是内存密集型的。这是因为邻接矩阵随节点数而缩放。在拥有数百万个节点的社交网络中,大多数人彼此不认识。这将导致一个大矩阵,其中大多数单元格为空。 为了解决这个问题,邻接列表表示形式对内存效率更高。 它将节点之间的边描述为元组 (i,j),其中 (0,1) 表示节点 0 和 1 之间的边。例如,对于图 5 中的图形,邻接列表为 [(A,B)、(B,D)、(B,C)、(D,C)]。图 5a:图形示例 — 图 5b:图 4a 中图形的邻接矩阵。 邻接列表表示形式提供了更高的内存效率,特别是对于稀疏图,因为它仅存储有关连接节点的必要信息。这使其成为处理大规模图形数据(例如社交网络)的首选,其中连接数与节点总数相比通常有限。四、推荐系统中的图神经网络 与传统的矩阵完成方法类似,GNN 可以为用户和项目生成嵌入,以预测看不见的用户-项目交互。但是,它们提供了一种显式合并高阶图结构的方法,并且可以捕获数据本身中可能不可用的潜在或隐藏相关性。 给定一个图,我们的目标是将每个节点 v 映射到其自己的 d 维最终嵌入,其中基于其网络邻域特征以及自身特征的相似节点最终应在其最终嵌入空间中彼此接近。图 6:节点编码到嵌入空间。4.1 图形神经网络层 GNN 的一层在图中的所有直接邻居之间交换信息,为图中的每个节点生成新的节点嵌入。在 2 层 GNN 模型中,每个节点将根据其 2 跳邻域生成其第 2 层嵌入。 K-hop 邻域是指距离感兴趣节点 K 边的所有节点。这是一个迭代过程,其中邻居变量通过传递消息(一种消息传递方法)与每个变量“对话”。图 7:2 层 GNN 中特定目标节点的输入图和计算图 在此图像中,我们看到节点 A 的第 2 层表示是通过以某种方式聚合其直接邻居 [B,C,D] 的第 1 层嵌入并对其应用黑盒转换或神经网络生成的。这些嵌入又由其第 0 层 [X_A、X_B...X_F] 嵌入直接相邻要素,这是初始输入要素。每一层都会生成一个新的节点嵌入,节点的 K 层嵌入从距离自身的 K 跳节点获取信息。4.2 图神经网络的特点、优势和局限性 图神经网络(GNN)具有几个显着的特征和优势,使其与传统的矩阵补全方法区分开来。这些特征有助于它们在推荐系统中的有效性。让我们探索这些功能:阶次不变性: GNN 是顺序不变的,这意味着节点的标记顺序不会影响结果。计算图考虑节点连接而不是节点顺序,利用顺序不变的聚合函数(如平均值、最大/最小池化)进行消息传递。大小不变性: GNN 中的每个节点都有自己的计算图,这使得 GNN 的大小不变。这允许各个节点根据其本地邻域处理和集成信息,从而实现个性化和灵活的学习。下图显示了上图中每个节点的计算图。图 8:图 7 输入图中每个节点的计算图。处理稀疏矩阵:与经典的矩阵补全方法不同,GNN 擅长处理稀疏矩阵。它们超越了直接节点交互,并捕获了高阶图结构中存在的隐藏相关性。此功能增强了它们在交互受限的场景中的性能端到端学习: GNN 提供端到端学习,同时优化嵌入和预测任务。这减轻了对手动特征工程的需求,简化了推荐管道。此外,GNN 可以很好地适应不断发展的用户/项目功能,从而减少对重大代码修改的需求。尽管GNN具有优势,但它们也有应考虑的局限性:计算复杂性:GNN 可能是计算密集型的,特别是对于大型图形和深度架构。与更简单的模型相比,训练GNN可能需要大量的计算资源和更长的训练时间。可解释性:与传统方法相比,GNN的复杂性可能使它们的可解释性降低。了解基于 GNN 的建议背后的内部工作原理和推理可能具有挑战性。五、结论 在本文中,我们探讨了图神经网络(GNN)在推荐系统中的潜力,强调了它们相对于传统矩阵完成方法的优势。GNN为利用图论来改进推荐系统提供了一个强大的框架。 通过利用嵌入在图结构中的丰富信息,GNN可以捕获复杂的模式,发现潜在特征,并在推荐过程中考虑相邻用户的影响。这种方法增强了推荐系统做出准确预测的能力,即使在经典方法难以生存的稀疏数据集中也是如此。 随着推荐系统领域的不断发展,GNN已成为解决传统方法局限性的有前途的解决方案。 他们适应不同领域并自动从数据中学习的能力使他们非常适合在各种情况下提供相关和量身定制的建议。 在本系列的下一部分中,我们将深入研究GNN的数学基础,特别关注LightGCN在电影推荐系统中的应用。通过了解基本原理和算法,我们可以进一步了解GNN如何改变推荐系统的格局。
阳关男孩
图神经网络与自组织地图实践
本课程深入介绍图神经网络(GNN)和自组织地图(SOM)的理论与实现。从"SOM介绍、解释和实现"到"图神经网络:消息传递算法"
阳关男孩
基本概念 I 和 Q:I/Q 数据的基础知识
一、说明 I/Q 值是指两个复数分量,即正交振幅分量 In-phase (I) 和 Quadrature (Q)。I/Q 值在无线通信系统中广泛使用,尤其在数字信号处理领域中。在数字信号接收机中,接收到的无线电波信号经过变频后,转换为 I/Q 值,然后对其进行数字信号处理。I/Q 值也用于确定信号的相位和幅度,因此在无线电通信和雷达系统中也广泛使用。二、I/Q 值是指两个复数分量 I/Q 数据出现在许多数据科学设置中:RF(射频)数据、时间序列分析、音频处理等。 另外,我最喜欢的几何演示之一是将角度调制的正弦波分解为两个正交的调幅正弦波。作为即将发生的事情的预告片 图 8:先睹为快。这就是我们要得到的地方!图片由作者提供。 作为动机,我将使用一个无线电示例。从业余无线电到雷达成像,我对射频的所有事物都充满热情。在本文中,我们将探讨如何使用“相移键控”对波中的信息进行编码,以及如何仅使用两个振荡器的总和合成任何所需相位的波。让我们潜入! 我在本文中创建了所有图形。随意在任何上下文中重复使用,无需署名(不保留权利)。 图 1:三个相同的正弦波相位偏移 正如我在另一篇文章中更深入地讨论的那样,“相位”描述了正弦曲线的从左到右的偏移。给定指定频率的正弦波,相位告诉我们振荡在时间或空间上的起始位置。在图 1 中,我绘制了三个相同的正弦曲线,它们仅在相位上有所不同。在 y 轴上,我还包括了生成方程。 如果你戴着你的工程帽子,你可能会想“如果我能改变一件事,我就可以用它来编码信息。确实可以!我们可以采用简单的正弦波(即“载波”)并调制(即改变)相位以将信息传达给接收器。三、二进制相移键控 (BPSK) BPSK是通过操纵载波的相位来传达信息的最简单机制。透射波的相位在两种状态之间变化。图 2:二进制序列的简单 BPSK 编码。 小菜一碟!在BPSK下,我们可以传达两个二进制状态。我们只是将每个状态编码为一个不同的阶段。通常,两相状态尽可能相互偏移(180°)。上面(图 2),我使用 BPSK 方案对序列 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, <> 进行了编码。 回到工程帽!如果我们可以用两个相位值对两个状态进行编码,那么如果我们使用额外的相位呢?如果我们使用四个相位值在每个比特周期传输四种可能的状态之一,以提高传输的信息密度,会怎样?我们可以!这种扩展称为“正交相移键控”(QPSK)。 不过,这引发了一些实际问题...随着我们继续引入额外的相位要求,我们是否需要引入额外的振荡器?四、由同相和正交分量合成 相反,让我们考虑一下如何使用简单构建块的组合来创建许多具有不同相位的正弦曲线。图 3:余弦和正弦参考图像。 在我的无线电工具包中,我有很多方法可以从余弦波生成正弦波。例如,如果我有一个产生纯余弦的电子振荡器,我可以添加一个简单的功率分配和延迟线来生成正弦。余弦和正弦只是彼此的相移,偏移90°。从另一个生成一个在硬件中很简单:我只需要一个时间延迟来转换信号。 但是,现在我正在使用两者,继续将它们称为“余弦”和“正弦”可能会有点令人困惑。由于它们只是彼此的相移,如果我在未来的某个随机时间点开始测量我的信号,我的“余弦”可能看起来像正弦,而我的“正弦”可能看起来像余弦!相反,让我们使用余弦作为参考,并将其称为“同相”。我们将正弦称为“正交”分量。非常好!我从一个相位开始,现在我有两个相位,只使用功率分配和可调延迟线。 我的“同相”和“正交”组件似乎有一些有趣的属性。如果我将余弦信号和正弦相乘并取总和,我得到零。更正式地说,如果我取这两个函数的乘积的积分,我的结果是零。此属性称为“正交性”。它们的相关性为零!这是个好消息,因为它使构建坐标空间变得容易。如果我把我的同相性放在 x 轴上,把我的正交性放在 y 轴上,我知道它们不相关,所以沿一个轴增加不会影响另一个轴上的值。图 4:纯余弦的 I/Q 空间。 让我们画出这个同相、正交空间。在x轴上,我们绘制了我们想要多少余弦(即余弦函数上的“同相”权重)。在 y 轴上,我们绘制了我们想要多少正弦(即正弦函数上的“正交”权重)。我们可以可视化两个加权分量和加权总和(图 4)。我们将这个新空间称为 I/Q 来描述两个轴:(i)n 相和 (q)uadrature 在蓝色中,我绘制了坐标同相权重 1,正交权重 0,并用一条线指向原点。到原点的距离为 1:√(1² + 0²)。不出所料,当正弦权重为零时,我们的加权和只是余弦!图 5:纯正弦波的 I/Q 空间 让我们转到相位 0 中的坐标,正交权重 1(图 5)。这是从我们之前的位置(红线)旋转 90°。当同相权重为零时,我们只得到正弦波。我们开始看到一些有趣的东西...在此坐标中旋转 90° 会在我们的加权和中引起 90° 相位。它以前是余弦,现在是正弦。我们空间的几何形状对此属性进行了编码。很酷! 我们也可以在轴上移动到负值。有效地围绕 y 轴翻转(即反转)我们的余弦或正弦分量。图 6:反余弦的 I/Q 空间。 跳到坐标同相权重-1,正交权重0(图6),我们将原始余弦分量颠倒过来!同样,如果我们回顾一下原始余弦参考,这种翻转相当于我们的第一个加权和的 180° 相位偏移。这也是我们在这个领域构建的第一个“新”阶段。使用I和Q基函数的混合,我们构建了一个以前没有的相位的正弦曲线。图 7:反正弦的 I/Q 空间。 最后,完成空间直觉,我们在坐标同相权重 0、正交权重 -1 处反转原始正弦函数(图 7)。这是我们的第二个“新”阶段:一个我们以前没有的阶段的信号。再一次,加权和是我们第一次检查的纯余弦的270°相位偏移。在我们看到的每个位置,角度(绿色)反映了应用于加权和的相位偏移。 只要我们可以任意混合这两个组件,似乎我们可以生成任何我们想要的相位!我们希望保持与原点的距离恒定(此处为单位长度),以确保我们不会改变总功率,但是当我们扫描两个分量的权重时,我们可以合成我们想要的任何相位的正弦曲线。这太棒了!从单个振荡器开始,添加功率分配和延迟线,现在引入混频器,我们可以组成任何相位的正弦波,保持频率和幅度不变。 我们拥有我们需要的所有直觉!现在我们可以重新审视我们的原始可视化。图 8:将角度调制正弦波分解为两个正交的调幅正弦波 如果这不是一个令人满意的几何结果,我不知道是什么。它令人着迷且有用。下次你在数据科学项目中遇到 I/Q 值时,我希望它们看起来不那么令人生畏!彼得·巴雷特·布莱恩