【补充】图神经网络前传——DeepWalk

论文阅读

论文:https://arxiv.org/pdf/1403.6652

参考:【论文逐句精读】DeepWalk,随机游走实现图向量嵌入,自然语言处理与图的首次融合_随机游走图嵌入-CSDN博客

abstract

DeepWalk是干什么的:在一个网络中学习顶点的潜在表示。这些潜在表示编码了容易被统计学模型的在联系向量空间中的社会关系。

DeepWalk怎么做到的:使用从截断的随机游走中获得的局部信息,通过将行走视为句子来学习潜在表征。

统计学模型->指ML

introduction

网络表示的稀疏性既是优点也是缺点。稀疏性使得设计高效的离散算法成为可能,但也使得推广统计学习变得更加困难。因此ML就需要做到可以处理稀疏性。

在这篇文章中,通过对一系列短随机游走(short random walks)进行建模来学习图顶点的社会表示(social representations)。社会表征是捕获邻居相似性和社区成员的顶点的潜在特征。这些潜在表征将社会关系编码在一个具有相对较少维度的连续向量空间中。

DeepWalk将一个图作为输入,并产生一个潜在的表示作为输出。空手道网络如图1a所示。图1b显示了我们的方法具有2个潜在维度的输出。

DeepWalk诞生背景和想要解决的问题
在DeepWalk诞生之前,往往是通过人工干预,创造的特征工程来进行图机器学习,在这种情况下面临两个问题:
(1)特征工程的好坏决定模型的好坏。并且特征工程并没有统一的标准,对于不同的数据集所需要做的特征工程是不一样的,因此图数据挖掘的模型的稳定性并不好。
(2)人工特征工程无非关注节点信息、边信息、图信息,且不论是否全部关注到,假设可以做到所有信息全部兼顾(实际上不可能)这样近乎完美的特征工程,但是节点的多模态属性信息无法得到关注。这意味着,即使是完美的特征工程,仍然只能兼顾到有限信息,数据挖掘的深度被严重限制。

DeepWalk想要通过这么一种算法,把图中每一个节点编码成一个D维向量(embedding过程),这是一个无监督学习。同时,embedding的信息包含了图中节点、连接、图结构等所有信息,用于下游监督学习任务。

为什么可以借鉴NLP里面的方法?
图数据是一种具有拓扑结构的序列数据。既然是序列数据,那么就可以用序列数据的处理方式。这里所谓的序列数据是指,图网络总是具有一定的指向性和关联性,例如从磨子桥到火车南站,就可以乘坐3号线在省体育馆转1号线,再到火车南站,也可以在四川大学西门坐8号线转。这都是具备指向关系。那么,我们把“磨子桥-省体育馆-倪家桥-桐梓林-火车南站”就看作是一个序列。当然,这个序列是不唯一的,我们可以“四川大学望江校区-倪家桥-桐梓林-火车南站”。也可以再绕大一圈,坐7号线。总之,在不限制最短路径的前提下,我们从一个点出发到另外一个点,有无数种可能性,这些可能性构成的指向网络,等价于一个NLP中的序列,并且在这个图序列中,相邻节点同样具备文本信息类似的相关性。

Embedding编码应该具有什么样的特性?
在前文已经有过类似的一句话,embedding的信息包含了图中节点、连接、图结构等所有信息,用于下游监督学习任务。 其实这个更是一个思想,具体而言,在NLP领域中,我们希望对文本信息,甚至单词的编码,除了保留他单词的信息,还应该尽可能保留他在原文中的位置信息,语法信息,语境信息,上下文信息等。因为只有这个基向量足够强大,用这个向量训练的模型解码出来才能足够强大。例如这么两句话:
Sentence1:今天天气很好,我去打篮球,结果不小心把新买的水果14摔坏了,但是没关系,我买了保险,我可以免费修手机。
Sentence2:我今天去修手机。
很显然,第一句话包含的信息更多,我们能够更加清晰的理解到这个事件的来龙去脉。对计算机而言也是一样,只有输入的信息足够完整,才能有更好的输出可靠性
放到图网络里,假设有两个节点u和v,他们在图空间的信息应该和在向量空间的信息保持一致,这就是embedding最核心的特征(假设u和v在图空间是邻接点,那么在向量空间他们也应该是距离相近的;如果八竿子打不着关系,那么在向量空间应该也是看不出太多联系)。把映射的向量放在二维空间或者更高维空间进行下游任务的设计,会比图本身更加直观,把图的问题转化成了不需要特征工程的传统机器学习或者深度学习问题。

什么是随机游走(Random Walk)
首先选择一个点,然后随机选择它的邻接节点,移动一步之后,再次选择移动后所在节点的邻接节点进行移动,重复这个过程。记录经过的节点,就构成了一个随机游走序列。
Question:为什么要随机游走?
Answer:一个网络图实际上可能是非常庞大的,通过无穷次采样的随机游走(实际上不可能无穷次),就可以”管中窥豹,可见一斑“。从无数个局部信息捕捉到整张图的信息
Random Walk的假设和Word2Vec的假设保持一致,即当前节点应该是和周围节点存在联系。所以可以构造一个Word2Vec的skip-gram问题。
                        
原文链接:【论文逐句精读】DeepWalk,随机游走实现图向量嵌入,自然语言处理与图的首次融合_随机游走图嵌入-CSDN博客

关于这里对为什么可以应用NLP的内容,个人理解就是,在NLP中,一句话说出来的顺序,或者说出来的方式,在一定程度上不影响句意,比如文言文里有倒装、通假、省略、互文等等,但是表达出来的意思是一样的,就像图中从A节点到达D节点,我们可以走不通的路径。

关于embedding编码这部分,简单回忆一下,关于语法信息,之前也提到过,比如位置编码:

11.6. Self-Attention and Positional Encoding — Dive into Deep Learning 1.0.3 documentation

语法信息的话,BERT里面提过LeeMeng - 進擊的 BERT:NLP 界的巨人之力與遷移學習拆解不同的token,可以把单词拆成单词本身+ing或者+s这样(我猜作者是这个意思)

之后关于图的描述里面,确实在后续GNN的模型中都指出要让相邻的节点更相似(似乎PageRank也有关于相似度的应用)

关于随机游走的部分,在后续的GNN中也有提到,这似乎是用到的一种采样方法,当然在PageRank中也有提及(是一种迭代计算PageRank值的方法,但是因为其需要模拟的游走太多了,没有被使用。

在引用的这篇文章中,也指出totally random walk并不是一个好方法,因为节点之间的权重是不一样的,但是DeepWalk就完全均匀随机游走了(还没看后续怎么改,但是想想应该也是类似于加一个系数,让能一定概率跳到某些点)

由于计算量的限制,这个随机游走的长度并不是无限,所以对于一个巨大的网络,虽然管中窥豹可见一斑,但这也注定了当前位置和距离非常远的位置是完全无法构成任何联系信息的,这和Word2Vec的局限性是一致的,在图神经网络GCN中,解除了距离限制,好像Transformer解除了RNN的距离限制一样,极大释放了模型的潜力,后续也会讲到。
                        
原文链接:【论文逐句精读】DeepWalk,随机游走实现图向量嵌入,自然语言处理与图的首次融合_随机游走图嵌入-CSDN博客

problem definition

我们考虑将社交网络的成员划分为一个或多个类别的问题。

G=(V,E),其中V表示网络中的成员,E表示边,E\subseteq (V\times V)(笛卡尔积?元素表示节点对?(v_i,v_j))。给定一个部分标记的社交网络G_L = (V,E,X,Y),其中属性X \in \mathbb{R}^{|V| \times S},这里的S表示的是每个属性向量的特征空间(即多少个特征),Y \in \mathbb{R}^{|V| \times | \boldsymbol{y} |}\boldsymbol{y}表示标签的集合。(X是特征)

在传统的ML classification中,我们的目标是学习一个假设H可以将元素X映射到标签集\boldsymbol{y}

在文中,可以利用关于G结构中嵌入的示例的依赖性的重要信息来实现优越的性能。在文献中,这被称为关系分类(或集体分类问题[37])。传统的关系分类方法将问题作为无向马尔可夫网络中的一个推理,然后使用迭代近似推理算法来计算给定网络结构的标签后向分布。

目标:学习X_E \in \mathbb{R}^{|V| \times d},这里d是少量的潜在维度,这些低维表示是分布的,也就是说,每一个社会现象都是由维度的一个子集来表达的,而每一个维度都对空间所表达的社会概念的一个子集有所贡献。利用这些结构特征,扩大属性空间以帮助分类决策。

learning social representations

一些背景介绍,可移步【论文逐句精读】DeepWalk,随机游走实现图向量嵌入,自然语言处理与图的首次融合_随机游走图嵌入-CSDN博客

method

与任何语言建模算法一样,唯一需要的输出是一个语料库和一个词汇表V。DeepWalk将一组短截断的随机行走视为自己的语料库,并将图顶点作为自己的词汇表(\boldsymbol{V} = V)。尽管在训练前知道V和频率分布是有好处的,但是对于hierarchical softmax方法而言是非必要的。

frequency distribution

频率分布:一种统计数据的排列方式,展示了变量值出现的频率。

Frequency Distribution: values and their frequency (how often each value occurs).

关于频率分布:

2.1: Organizing Data - Frequency Distributions - Statistics LibreTexts

Frequency Distribution | Tables, Types & Examples

Frequency Distributions – Math and Statistics Guides from UB’s Math & Statistics Center

Algorithm: Deep Walk

算法包含了两个主要步骤,第一个是一个随机游走生成器(random walk generator),第二个是更新过程(update procedure)。

其中,随机游走生成器拿到图G并均匀采样一个随机顶点v_i作为随机游走的根W_{v_i}。从最后访问的顶点的邻居中均匀采样,直到达到最大长度(t)。虽然我们将实验中随机游走的长度设置为固定值(这里更容易被理解成是随机游走的步数),但随机游走的长度不受限制(这里应该指的是路径的真实长度,因为可能跳回去)。这些行走可以有重新启动(即瞬间返回到根节点的概率),但是初步结果并没有显示使用重新启动的任何优势。

上图3-9行展示的是方法的核心。最外层的循环指定了在每个顶点开始随机游走的次数\gamma。将每次迭代视为对数据进行“传递”,并在此传递期间对每个节点进行一次采样。在每次“”传递开始的时候,我们生成一个随机的顺序来遍历顶点。这不是严格要求的,但众所周知,它可以加快随机梯度下降的收敛速度。

在内部循环中,我们遍历图的所有顶点。对于每个顶点v_i,我们生成一个随机游动|W_{v_i}| = t,然后使用它来更新(第7行)->采用SkipGram算法⬇️。

SkipGram

SkipGram是一种语言模型,它最大限度地提高句子中窗口w内出现的单词之间的共存概率

算法2在随机游走中遍历窗口w(第1-2行)内出现的所有可能的搭配。对于每个顶点,我们将每个顶点v_j映射到其当前表示向量\Phi(v_j) \in \mathbb{R}^d(见图⬇️)。给定v_j的表示,我们希望最大化它在游走(第3行)中的邻居的概率。可以使用几种分类器来学习这种后验分布。

这里的\Phi指的是对应的embedding

(这里没太读懂“maximize the probability of its neighbors in the walk”,按照前面的意思是SkipGram能够提高cooccurrence probability,但是为什么要提高呢?这里断一下去看看SkipGram)

参考:理解 Word2Vec 之 Skip-Gram 模型 - 知乎

Skip-gram Word2Vec Explained | Papers With Code

Skip-Gram Model in NLP - Scaler Topics

Word2Vec Tutorial - The Skip-Gram Model · Chris McCormick

(目前的理解是,对于选择的节点j我希望节点j能够出现在节点i的随机游走的路径中)

Hierarchical Softmax

对于给定u_k \in V,计算Pr(u_k | \Phi(v_j))并不可行。计算partition function(归一化因子)是昂贵的。如果我们将顶点分配给二叉树的叶子,那么预测问题就变成了最大化树中特定路径的概率(参见图⬇️)。

partition function-分区函数:在统计力学中的一种函数,用于表示系统的状态数或相关函数的生成函数。

如果到达顶点u_k的路径被一系列数节点定义(b_0,b_1,\cdot \cdot \cdot ,b_{\left \lceil log|V| \right \rceil}),(b_0 = root, b_{\left \lceil log|V| \right \rceil}=u_k),那么:

Pr(u_k| \Phi (v_j)) = \prod_{l=1}^{\left \lceil log|V| \right \rceil}Pr(b_l| \Phi (v_j))

Pr(b_l| \Phi (v_j))可以被分给其父节点的二分类器建模。

Optimization

随机梯度下降(SGD)

在Overview里,作者提出DeepWalk也需要和自然语言处理算法一样,构建自己的语料库和词库。这里的语料库就是随机游走生成的序列,词库就是每个节点本身。从这一点上看,其实图的Skip-Gram会更简单一点,因为词会涉及到分词,切词,例如”小明天天吃饭“,是小明还是明天,如果词库做不好,切割做不好,会非常影响模型性能;如果是英文单词,好一点的做法会切分#-ed -#ing这样的分词,但是节点都是一个一个单独的,不存在这样的问题。
                        

原文链接:

【论文逐句精读】DeepWalk,随机游走实现图向量嵌入,自然语言处理与图的首次融合-CSDN博客

示例代码,请参考:

论文|DeepWalk的算法原理、代码实现和应用说明 - 知乎

其他:

【论文笔记】DeepWalk - 知乎

【Graph Embedding】DeepWalk:算法原理,实现和应用 - 知乎

DeepWalk【图神经网络论文精读】_哔哩哔哩_bilibili

DeepWalk【图神经网络论文精读】_哔哩哔哩_bilibili

通过在图里随机游走,生成一连串随机游走的序列,每一个序列都类似一句话,序列中的每一个节点就类似word2vec中的单词,然后套用word2vec方法。word2vec中假设一句话中相邻的单词是相关的,deepwalk假设在一个随机游走中,相邻的节点是相关的。

比如图中,用v_j,即1,预测3和5,通过这种,用中心节点去预测周围节点,就可以捕获相邻的关联信息,最后迭代优化\Phi\Phi反映了相似关系

通过随机游走可以采样出来一个序列。

输入中心节点预测周围临近节点,那么我们就可以套用word2vec,把每一个节点编码成一个向量。

⬆️手动构造特征,⬇️学习特征 

把词汇表维度降到d维

⬅️原图,➡️deepwalk编码后到图

优点:

  1. 可扩展。来了一个新数据之后,即来即学,即建立一个新连接之后不需要从头训练,只需要把新增的节点和关联,让随机游走采样下来,然后在线训练
  2. 可以直接套用NLP中的语言模型,把随机游走当作是句子,把节点当作是单词
  3. 效果不错,尤其在稀疏标记的图分类任务上

在NLP中有一个现象,称为幂律分布/二八定律/长尾分布

有一些词出现的特别频繁(如:the, and, of, etc.),但是这些词比较少,而大部分的词出现的次数少(但是这些词数量多)

带入到图中,比如网络,很少部分的网站很多人访问,而大部分的网站都没人访问

关于各种分布,可以参考:从幂律分布到特征数据概率分布——12个常用概率分布_数据和特征怎么估计概率分布-CSDN博客

->服从同一分布->可以类比->可以用相同的方法

5个步骤:

  1. 先输入一个图
  2. 采样随机游走序列
  3. 用随机游走序列训练word2vec
  4. 为了解决分类个数过多的问题,加一个分层softmax(or 霍夫曼编码树)
  5. 得到每一个节点的图嵌入向量表示

首先来看random walk。每一个节点作为起始节点,产生\gamma个随机游走序列,每一个随机游走序列的最大长度是t

使用得到的随机游走序列去构造skip-gram,输入中心词的编码表示,预测周围词(输入1,预测3 5)

分层的softmax->比如一个八分类问题,分成三个分类任务,这里的每一个分类任务都是一个二分类的逻辑回归。

->复杂度从O(n)降低到O(log n)

有两套要学的参数:节点的表示 & 逻辑回归的权重

节点表示需要优化的是skip-gram的损失函数,逻辑回归是优化最大似然估计的交叉熵损失函数

同时优化

->最后得到每一个节点的向量

优缺点:

DeepWalk论文逐句精读_哔哩哔哩_bilibili

online learning指的是在线学习算法,是一个即来即训的算法,如果图中有新的节点出现or有新的连接出现(比如一个社交网络中有一个新的注册用户/一个新的好友关系的添加,不需要将全图重新训练一遍,而只要把新增的节点/关系构建新的随机游走序列,迭代地更新到原有的模型中。

隐式向量(编码后的结果)就编码了节点的邻域信息和社群信息。->一个连续、低维、稠密的空间。

在图数据结构中,每个节点之间是有关联的,这就违反了传统机器学习的独立同分布假设(比如iris数据集,每一条数据都是一朵独立的鸢尾花,但是都属于鸢尾花),但是图的话,每个节点之间是有关联的,所以不能用传统的机器学习方法(就像红楼梦四大家族一样,互相掣肘)。

deepwalk是无监督学习,与节点的label、特征均无关,只与节点在网络中的社群属性、连接结构相关。

后续的算法可以加上节点本身的信息(但是deepwalk本身不包含)

(弹幕:deepwalk不用,但下游任务用)

word2vec不需要标签,输入中心词,周围的词就是标签

 

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

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

相关文章

求最大梯形的面积

【入门】求最大梯形的面积 今天做4星题单发现一个好玩的&#xff08;太简单了&#xff09;。 说明 从键盘读入n(3<n<100)个梯形的上底、下底和高&#xff0c;请问这n个梯形中&#xff0c;最大面积的梯形的面积是多少&#xff1f;&#xff08;梯形面积的求解公式为 S …

ExcelVBA在选择区域(有合并)中删除清除空行

【问题】 关于删除空行&#xff0c;以前是用函数来完成工作的&#xff0c; 今天有人提出问题&#xff0c;传来这个文件&#xff0c; 现有数据&#xff0c;1w多行&#xff0c;其中有部分列有不同合并单元格&#xff0c;跨行也不一样。如果要进行筛选删除空行&#xff0c;有一定的…

Rerank进一步提升RAG效果

RAG & Rerank 目前大模型应用中&#xff0c;RAG&#xff08;Retrieval Augmented Generation&#xff0c;检索增强生成&#xff09;是一种在对话&#xff08;QA&#xff09;场景下最主要的应用形式&#xff0c;它主要解决大模型的知识存储和更新问题。 简述RAG without R…

买卖股票的最佳时机 II(LeetCode 122)

❤️❤️❤️ 欢迎来到我的博客。希望您能在这里找到既有价值又有趣的内容&#xff0c;和我一起探索、学习和成长。欢迎评论区畅所欲言、享受知识的乐趣&#xff01; 推荐&#xff1a;数据分析螺丝钉的首页 格物致知 终身学习 期待您的关注 导航&#xff1a; LeetCode解锁100…

整体安全设计

人员和资产的安全是当今许多组织的最高优先事项之一。随着暴力事件在美国各地盛行——枪击事件、袭击、内乱等——建筑物业主必须为其建筑物及其居住者的安全做好计划。 为了创造一个安全的环境&#xff0c;新设施或园区的安全设计必须超越基本的摄像头和访问控制设备&#xf…

HarmonyOS开发案例:【UIAbility内和UIAbility间页面的跳转】

UIAbility内和UIAbility间页面的跳转&#xff08;ArkTS&#xff09; 介绍 基于Stage模型下的UIAbility开发&#xff0c;实现UIAbility内和UIAbility间页面的跳转。包含如下功能&#xff1a; UIAbility内页面的跳转。跳转到指定UIAbility的首页。跳转到指定UIAbility的指定页…

centos7安装MySQL(rpm安装)

centos7安装MySQL&#xff08;rpm安装&#xff09; 准备工作1、卸载不要的环境2、获取MySQL官方yum源3、下载官方的yum源 安装可能遇到问题:描述解决方法&#xff1a; 配置添加远程访问用户设置MySql不区分大小写 准备工作 1、卸载不要的环境 grep mariadb # 先检查是否有mar…

【Java】/*方法的使用-快速总结*/

目录 一、什么是方法 二、方法的定义 三、实参和形参的关系 四、方法重载 五、方法签名 一、什么是方法 Java中的方法可以理解为C语言中的函数&#xff0c;只是换了个名称而已。 二、方法的定义 1. 语法格式&#xff1a; public static 返回类型 方法名 (形参列表) { //方…

【GD32】02-ADC模拟数字转换器

ADC 在电子和通信技术中&#xff0c;ADC&#xff08;模拟数字转换器&#xff09;是一种将模拟信号转换为数字信号的电子设备。这种转换是电子系统中非常关键的一个环节&#xff0c;因为数字信号更易于处理、存储和传输。ADC的工作原理通常包括采样、保持、量化和编码等步骤。采…

数据结构与算法===回溯法

文章目录 原理使用场景括号生成代码 小结 原理 回溯法是采用试错的思想&#xff0c;它尝试分步骤的去解决一个问题。在分步骤解决问题的过程中&#xff0c;当它通过尝试发现现有的分步答案不能得到有效的正确的解答的时候&#xff0c;它将取消上一步甚至是上几步的计算&#x…

wsl安装Xfce桌面并设置系统语言和输入法

一、安装xfce &#xff08;有相关的依赖都会安装&#xff09; sudo apt -y install xfce4 二、 安装远程连接组件 sudo apt install xrdp -y 并重新启动 Xrdp 服务&#xff1a; sudo systemctl restart xrdp 本地windows系统中请按 winR 键 呼出运行 在运行中输入 mstsc…

最简单的Winapi编程窗口程序

以下是一个简单的使用 WinAPI 创建窗口的程序示例&#xff0c;大致了解下win32的一个窗口编程大致流程&#xff1a; #include <Windows.h>// 窗口过程函数 LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {switch (uMsg){case WM_DES…

Ubuntu24 文件目录结构——用户——权限 详解

目录 权限 用户 文件目录结构 一个目录可以有程序&#xff0c;目录&#xff0c;文件&#xff0c;以及这三者的链接。可以看到还分别有使用者和权限信息。 每个文件和目录都有与之关联的三个主要属性&#xff1a;所有者&#xff08;owner&#xff09;、组&#xff08;group&a…

【Qt 学习笔记】Qt常用控件 | 布局管理器 | 垂直布局Vertical Layout

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt常用控件 | 布局管理器 | 垂直布局Vertical Layout 文章编号&#x…

【JavaEE】Spring Boot 入门:快速构建你的第一个 Spring Boot 应用

目录 第一个SpringBoot程序介绍项目创建创建项目目录介绍输出Hello World 第一个SpringBoot程序 介绍 在学习SpringBoot之前, 我们先来认识⼀下Spring 我们看下Spring官⽅(https://spring.io/)的介绍 可以看到, Spring让Java程序更加快速, 简单和安全. Spring对于速度、简单…

【MySQL数据库】详解数据库审核工具SQLE的部署及接口调用

SQLE部署及使用 1. 部署SQLE SQLE相信大家都不陌生吧&#xff0c;它是一款开源&#xff0c;支持多场景审核&#xff0c;支持标准化上线流程&#xff0c;原生支持 MySQL 审核且数据库类型可扩展的 SQL审核工具。我们可以基于此工具进行数据库SQL审核&#xff0c;提升SQL脚本质量…

LangChain:模型 I/O 封装使用解析和感触

目录 模型 API&#xff1a;LLM vs. ChatModel OpenAI 模型封装 多轮对话 Session 封装 换个国产模型 模型的输入与输出 Prompt 模板封装 PromptTemplate ChatPromptTemplate MessagesPlaceholder 从文件加载 Prompt 模板 TXT模板 Yaml模板 Json模板 输出封装 Out…

使用模拟SPI接口驱动串行接口的LCD( STM32F4)

目录 概述 1. 硬件介绍 1.1 ST7796-LCD 1.2 MCU IO与LCD PIN对应关系 2 代码实现 2.1 STM32CubeMX 6.11生成工程 2.2 IO模拟SPI接口 2.3 实现LCD的驱动 3 测试 测试代码下载地址&#xff1a; stm32-f407-lcd-ft6336-proj资源-CSDN文库 gitee下载地址&#xff1a; h…

48. 旋转图像/240. 搜索二维矩阵 II

48. 旋转图像 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像&#xff0c;这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 示例 &#xff1a; 输入&#xff1a;matrix [[5,1,9,11],[2,4,…

NodeMCU ESP8266 获取I2C从机地址

文章目录 前言关于地址位读写位程序总结前言 I2C总线上可以挂载很多的从设备,每个设备都会有一个自己唯一的一个地址; 关于地址位 通常地址位占7位数据,主设备如果需要向从机发送/接收数据,首先要发送对应从机的地址,然后会匹配总线上挂载的从机的地址; 读写位 该位…