关于谱图理论-图傅里叶变换-谱卷积等谱图领域知识的理解

前言

之前做可解释模型的时候,看了图卷积相关的资料及论文,对谱图理论及空域图理论有一些理解。这个博文包含了自己先前总结及思考的知识点,是一个 from scratch 的学习路线图。后续会逐步更新业界常见及最新的谱图及空域图相关论文。


重点需要理解的地方

  • 傅立叶变换中的的理解,即basis
  • 图卷积的定义是为了迎合卷积定理?
  • 图卷积 f ∗ h = U ( U T f ⊙ U T h ) f*h=U(U^Tf\odot U^Th) fh=U(UTfUTh) 中的 h h h 是卷积核,既可以作为顶点的函数,也可以作为特征向量的函数。

谱图理论(Spectral Graph Theory)

谱图理论是研究图的性质与特征多项式特征值和与图相关的矩阵特征向量的关系,例如图的 邻接矩阵 和 Laplacian矩阵。1

  • Laplacian允许在离散表示(如graphs)和连续表示(如vector space和manifolds)之间建立自然链接。
  • Laplacian最重要的应用是谱聚类(spectral clustering),它对应于图的划分问题(graph partitioning problem)的计算上易于处理的解决方案。
  • Laplacian另一个应用是谱匹配(spectral matching),它解决了图匹配(graph matching)。

谱图理论应用:2

  • 谱划分(Spectral partitioning):Image Segmentation。我看了一些基于谱划分的paper,效果不是很好,远低于基于深度学习的paper。
  • 文档分类、协同推荐等
  • 流形分析(Manifold analysis):流形嵌入(Manifold embedding)、流形学习(manifold learning)、网格分割(mesh segmentation)等。

Laplacian矩阵

图解Laplacian矩阵

Laplacian矩阵简介

Laplacian矩阵是图的矩阵表示,可以看作是 有限差分法 得到的逼近负连续拉普拉斯的图上负离散拉普拉斯运算符的矩阵形式。 基于图的信号处理是基于 图傅里叶变换 ,它扩展了传统的 离散傅里叶变换 ,将 复正弦曲线的标准基 替换为对应于信号的 图拉普拉斯矩阵 的特征向量。3

Laplacian矩阵边加权图 的应用中更为常见,谱图理论 将图的属性与谱(spectrum)相关联,即与图相关的矩阵的特征值和特征向量,例如其邻接矩阵或Laplacian矩阵。不平衡的权重可能会对矩阵谱产生不利影响,导致需要归一化——矩阵条目(entries)的列/行缩放——导致归一化的邻接和Laplacian矩阵。

  • 无向图Laplacian矩阵: L = D − A L=D-A L=DA
    • D D D为度矩阵, L L L为邻接矩阵。在有向图中,度矩阵只需要考虑出度或者入度中的一个。
  • 对称标准化Laplacian矩阵 L s y m = ( D + ) 1 2 L ( D + ) 1 2 = I − ( D + ) 1 2 A ( D + ) 1 2 L^{sym}=(D^+)^{\frac 1 2}L(D^+)^{\frac 1 2}=I-(D^+)^{\frac 1 2}A(D^+)^{\frac 1 2} Lsym=(D+)21L(D+)21=I(D+)21A(D+)21
    • D + D^+ D+穆尔-彭罗斯逆矩阵4,对称归一化Laplacian矩阵是对称的当且仅当邻接矩阵是对称的,也就是说图为无向图。 对于一个有向图的非对称邻接矩阵,可以使用出度和或入度中的任何一个进行规范化。
    • 对称标准化的Laplacian矩阵有一些优秀的性质,比如它的任何图的标准化拉普拉斯矩阵的征值范围在0到2之间,见博文《kipf-GCN中提到的标准化的拉普拉斯矩阵的性质
  • 左(随机游走)和右归一化Laplacians: L r w = D + L = I − D + A L^{rw}=D^+L=I-D^+A Lrw=D+L=ID+A
  • 右归一化Laplacian矩阵: L D + = I − A D + LD^+=I-AD^+ LD+=IAD+

为什么谱图卷积使用到了拉普拉斯矩阵?(待更新)

Laplacian矩阵特征分解

Laplacian矩阵分解(Laplacian Matrix Eigendecomposition)也称为谱分解(spectral decomposition)。
因为Laplacian矩阵是实对称矩阵,所以可以被正交对角化:
L = U Λ U T =   U [ λ 1 λ 2 ⋱ λ n ] U T \begin{align} L=U\Lambda U^T=\ U \begin{bmatrix} \lambda_1 & & & \\ & \lambda_2 & & \\ & & \ddots & \\ & & & \lambda_n \\ \end{bmatrix} U^T \end{align} L=UΛUT= U λ1λ2λn UT
U U U是列向量为单位特征向量的矩阵, λ l \lambda_l λl为特征值。


从傅里叶变换到 图傅里叶变换

经典傅里叶变换

傅里叶级数知识参见:
\quad 矩形波的傅里叶级数及代码
FT参考链接:
\quad 傅里叶级数和傅里叶变换是什么关系? - 马同学的回答 - 知乎
\quad 傅里叶系列(二)傅里叶变换的推导 - 知乎
\quad 傅里叶变换 – 从 Hilbert Space 到傅里叶变换基
\quad 傅里叶变换基的疑问

傅里叶级数是针对周期函数的,为了可以处理非周期函数,需要傅里叶变换(FT)。FT有助于将傅里叶级数扩展到非周期函数,这允许将任何函数视为简单正弦曲线的总和。

  • FT将波形分解为正弦曲线,因此提供了另一种表示波形的方法。
  • FT将作为时间函数的波形分解为构成它的频率。

传统的傅里叶变换公式为:
F ( ω ) = F [ f ( t ) ] = ∫ − ∞ + ∞ f ( t ) e − i ω t d t F(\omega)=\mathcal{F}[f(t)]=\int_{-\infin}^{+\infin}f(t)e^{-i\omega t}dt F(ω)=F[f(t)]=+f(t)etdt

离散傅里叶变换及逆变换

参考wiki百科-Discrete Fourier transform
F ( k ) = X k = ∑ n = 0 N − 1 x n ⋅ e − i 2 π N k n = ∑ n = 0 N − 1 x n ⋅ [ cos ⁡ ( 2 π N k n ) − i ⋅ sin ⁡ ( 2 π N k n ) ] , \begin{align} \mathcal{F}(k) = X_k &= \sum_{n=0}^{N-1} x_n \cdot e^{-\frac {i 2\pi}{N}kn}\\ &= \sum_{n=0}^{N-1} x_n \cdot \left[\cos\left(\frac{2 \pi}{N}kn\right) - i \cdot \sin\left(\frac{2 \pi}{N}kn\right)\right], \end{align} F(k)=Xk=n=0N1xneNi2πkn=n=0N1xn[cos(N2πkn)isin(N2πkn)],

  • 例子理解
    N = 4 N=4 N=4,且 x = ( x 0 x 1 x 2 x 3 ) = ( 1 2 − i − i − 1 + 2 i ) \mathbf{x} = \begin{pmatrix} x_0 \\ x_1 \\ x_2 \\ x_3 \end{pmatrix}= \begin{pmatrix} 1 \\ 2-i \\ -i \\ -1+2i \end{pmatrix} x= x0x1x2x3 = 12ii1+2i
    在这里,我们演示如何使用(2)式计算 x \mathbf{x} x的DFT:
    F ( 0 ) = X 0 = e − i 2 π 0 ⋅ 0 / 4 ⋅ 1 + e − i 2 π 0 ⋅ 1 / 4 ⋅ ( 2 − i ) + e − i 2 π 0 ⋅ 2 / 4 ⋅ ( − i ) + e − i 2 π 0 ⋅ 3 / 4 ⋅ ( − 1 + 2 i ) = 2 F ( 1 ) = X 1 = e − i 2 π 1 ⋅ 0 / 4 ⋅ 1 + e − i 2 π 1 ⋅ 1 / 4 ⋅ ( 2 − i ) + e − i 2 π 1 ⋅ 2 / 4 ⋅ ( − i ) + e − i 2 π 1 ⋅ 3 / 4 ⋅ ( − 1 + 2 i ) = − 2 − 2 i F ( 2 ) = X 2 = e − i 2 π 2 ⋅ 0 / 4 ⋅ 1 + e − i 2 π 2 ⋅ 1 / 4 ⋅ ( 2 − i ) + e − i 2 π 2 ⋅ 2 / 4 ⋅ ( − i ) + e − i 2 π 2 ⋅ 3 / 4 ⋅ ( − 1 + 2 i ) = − 2 i F ( 3 ) = X 3 = e − i 2 π 3 ⋅ 0 / 4 ⋅ 1 + e − i 2 π 3 ⋅ 1 / 4 ⋅ ( 2 − i ) + e − i 2 π 3 ⋅ 2 / 4 ⋅ ( − i ) + e − i 2 π 3 ⋅ 3 / 4 ⋅ ( − 1 + 2 i ) = 4 + 4 i \begin{aligned} \mathcal{F}(0) =X_0 &= e^{-i 2 \pi 0 \cdot 0 / 4} \cdot 1 + e^{-i 2 \pi 0 \cdot 1 / 4} \cdot (2-i) + e^{-i 2 \pi 0 \cdot 2 / 4} \cdot (-i) + e^{-i 2 \pi 0 \cdot 3 / 4} \cdot (-1+2i) = 2 \\ \mathcal{F}(1) =X_1 &= e^{-i 2 \pi 1 \cdot 0 / 4} \cdot 1 + e^{-i 2 \pi 1 \cdot 1 / 4} \cdot (2-i) + e^{-i 2 \pi 1 \cdot 2 / 4} \cdot (-i) + e^{-i 2 \pi 1 \cdot 3 / 4} \cdot (-1+2i) = -2-2i \\ \mathcal{F}(2) =X_2 &= e^{-i 2 \pi 2 \cdot 0 / 4} \cdot 1 + e^{-i 2 \pi 2 \cdot 1 / 4} \cdot (2-i) + e^{-i 2 \pi 2 \cdot 2 / 4} \cdot (-i) + e^{-i 2 \pi 2 \cdot 3 / 4} \cdot (-1+2i) = -2i \\ \mathcal{F}(3) =X_3 &= e^{-i 2 \pi 3 \cdot 0 / 4} \cdot 1 + e^{-i 2 \pi 3 \cdot 1 / 4} \cdot (2-i) + e^{-i 2 \pi 3 \cdot 2 / 4} \cdot (-i) + e^{-i 2 \pi 3 \cdot 3 / 4} \cdot (-1+2i) = 4+4i \\ \end{aligned} F(0)=X0F(1)=X1F(2)=X2F(3)=X3=ei2π00/41+ei2π01/4(2i)+ei2π02/4(i)+ei2π03/4(1+2i)=2=ei2π10/41+ei2π11/4(2i)+ei2π12/4(i)+ei2π13/4(1+2i)=22i=ei2π20/41+ei2π21/4(2i)+ei2π22/4(i)+ei2π23/4(1+2i)=2i=ei2π30/41+ei2π31/4(2i)+ei2π32/4(i)+ei2π33/4(1+2i)=4+4i
    X = ( X 0 X 1 X 2 X 3 ) = ( 2 − 2 − 2 i − 2 i 4 + 4 i ) \mathbf{X} = \begin{pmatrix} X_0 \\ X_1 \\ X_2 \\ X_3 \end{pmatrix} = \begin{pmatrix} 2 \\ -2-2i \\ -2i \\ 4+4i \end{pmatrix} X= X0X1X2X3 = 222i2i4+4i

图傅里叶变换及逆变换

本节的内容主要参考了Wiki百科-Graph Fourier Transform,并增加了一些便于理解的辅助知识。

这里的图傅里叶变换指的是"Graph Fourier Transform,GFT",不是图像傅里叶变换(Image Fourier Transform)。同样,图傅里叶变换也有相应的逆变换——图傅里叶逆变换(Inverse Graph Fourier Transform,IGFT)

GFT

在数学中,图傅里叶变换是一种数学变换,它将图的Laplacian矩阵分解成特征值和特征向量。类似于经典傅立叶变换, L L L的特征值代表频率,特征向量形成所谓的图傅里叶基(DFT的基为 e − i 2 π N k n e^{-\frac {i 2\pi}{N}kn} eNi2πkn)。

\quad 连续傅里叶变换离散傅立叶变换图傅立叶变换
变换基 e − i 2 π f t e^{-i2\pi ft} ei2πft e − i 2 π N k n e^{-\frac {i 2\pi}{N}kn} eNi2πkn U T U^T UT
维度 ∞ \infin N N N(序列个数) N N N(顶点个数)

对于无向带权图 G = ( V , E ) G=(V,E) G=(V,E),V是图结点(node)的集合, ∣ V ∣ = N |V|=N V=N是node的个数, E E E是边(edge)的集合。
图信号(graph signal) f : V → R f: V \rightarrow \mathbb{R} f:VR 是定义在图G顶点上的函数, f f f 将每一个顶点(vertex5) { v i } i = 1 , … , N \{v_i\}_{i=1,\ldots,N} {vi}i=1,,N 映射为一个实数 f ( i ) f(i) f(i) 。任何图信号都可以被映射在Laplacian矩阵 L L L 的特征向量上。设 λ l \lambda_l λl μ l ∈ R N × 1 \mu_l\in \mathbb{R}^{N\times 1} μlRN×1 为Laplacian矩阵 L L L 的第 l t h l_{th} lth 个特征值和特征向量(特征值已经排序, 0 = λ 0 ≤ λ 1 ≤ ⋯ ≤ λ N − 1 0= \lambda_0\leq\lambda_1\leq\cdots\leq\lambda_{N-1} 0=λ0λ1λN1),图信号 f f f G G G 顶点上的图傅里叶变换 f ^ \hat{f} f^ f f f L L L的 本征函数 (eigenfunctions)6 方面的扩展。定义为:
G F [ f ] ( λ l ) = f ^ ( λ l ) = ⟨ f , μ l ⟩ = ∑ i = 1 N f ( i ) μ l ∗ ( i ) , \begin{align} \mathcal{G F}[f](\lambda_{l})= \hat{f}\left(\lambda_{l}\right)= \langle f, \mu_{l}\rangle= \sum_{i=1}^{N} f(i) \mu_{l}^*(i), \end{align} GF[f](λl)=f^(λl)=f,μl=i=1Nf(i)μl(i),其中, μ l ∗ = μ l T \mu_l^* = \mu_l^\text{T} μl=μlT μ l ( i ) \mu_l(i) μl(i) L L L的第 l l l个特征向量 μ l \mu_l μl的第 i i i个分量; f ( i ) f(i) f(i)图信号 f ∈ R N × 1 f\in \mathbb{R}^{N\times 1} fRN×1的第 i i i个分量,关于图信号 f f f的通俗解释,参见博文

将上述式子展开成矩阵的形式如下:
( f ^ ( λ 1 ) f ^ ( λ 2 ) ⋮ f ^ ( λ n ) ) = [ u 1 ( 1 ) u 1 ( 2 ) ⋯ u 1 ( n ) u 2 ( 1 ) u 2 ( 2 ) ⋯ u 2 ( n ) ⋮ ⋮ ⋮ u n ( 1 ) u 2 ( 2 ) ⋯ u n ( n ) ] ⋅ [ f ( 1 ) f ( 2 ) ⋮ f ( n ) ] \begin{pmatrix} \hat{f}(\lambda_1) \\ \hat{f}(\lambda_2) \\ \vdots \\ \hat{f}(\lambda_n) \end{pmatrix}= \begin{bmatrix} u_1(1) & u_1(2) & \cdots & u_1(n) \\ u_2(1) & u_2(2) & \cdots & u_2(n) \\ \vdots & \vdots & & \vdots \\ u_n(1) & u_2(2) & \cdots & u_n(n) \\ \end{bmatrix} \centerdot \begin{bmatrix} f(1) \\ f(2) \\ \vdots \\ f(n) \end{bmatrix} f^(λ1)f^(λ2)f^(λn) = u1(1)u2(1)un(1)u1(2)u2(2)u2(2)u1(n)u2(n)un(n) f(1)f(2)f(n) 所以GFT的向量形式为:
f ^ = U T f \begin{align} \hat{f}=U^Tf \end{align} f^=UTf 其中, U T U^T UT 的每一行是一个特征向量。

  • 也有文献将其写作 f ^ = U − 1 f \hat{f}=U^{-1}f f^=U1f,其实两者是等价的,因为拉普拉斯矩阵 L L L 是实对称矩阵,其特征向量矩阵是正交矩阵, U − 1 = U T U^{-1}=U^{T} U1=UT,可参考如下博文《拉普拉斯矩阵特征向量的几个关键性质证明》

GFT 是变换 U U U 在顶点函数 f f f 上执行的变化,将其表示为Laplacian特征函数的线性组合。根据上面的讨论,这可以被视为傅里叶变换的离散模拟。

IGFT

因为 L L L是实对称矩阵,它的特征向量 { μ l } l = 0 , ⋯   , N − 1 \{\mu_l\}_{l=0,\cdots, N-1} {μl}l=0,,N1形成正交基,因此存在图傅里叶逆变换:
I G F [ f ^ ] ( i ) = f ( i ) = ∑ l = 0 N − 1 f ^ ( λ l ) μ l ( i ) \begin{align} \mathcal{I} \mathcal{G} \mathcal{F}[\hat{f}](i)= f(i)= \sum_{l=0}^{N-1} \hat{f}(\lambda_l) \mu_l(i) \end{align} IGF[f^](i)=f(i)=l=0N1f^(λl)μl(i) 所以IGFT的向量形式为:
[ f ( 1 ) f ( 2 ) ⋮ f ( n ) ] = [ u 1 ( 1 ) u 2 ( 1 ) ⋯ u n ( 1 ) u 1 ( 2 ) u 2 ( 2 ) ⋯ u n ( 2 ) ⋮ ⋮ ⋮ u 1 ( n ) u 2 ( n ) ⋯ u n ( n ) ] ⋅ ( f ^ ( λ 1 ) f ^ ( λ 2 ) ⋮ f ^ ( λ n ) ) \begin{bmatrix} f(1) \\ f(2) \\ \vdots \\ f(n) \end{bmatrix}= \begin{bmatrix} u_1(1) & u_2(1) & \cdots & u_n(1) \\ u_1(2) & u_2(2) & \cdots & u_n(2) \\ \vdots & \vdots & & \vdots \\ u_1(n) & u_2(n) & \cdots & u_n(n) \\ \end{bmatrix} \centerdot \begin{pmatrix} \hat{f}(\lambda_1) \\ \hat{f}(\lambda_2) \\ \vdots \\ \hat{f}(\lambda_n) \end{pmatrix} f(1)f(2)f(n) = u1(1)u1(2)u1(n)u2(1)u2(2)u2(n)un(1)un(2)un(n) f^(λ1)f^(λ2)f^(λn) 其中, U U U 的每一列是一个特征向量。
IGFT的向量形式为:
f = U f ^ \begin{align} f=U\hat{f} \end{align} f=Uf^

GFT和IGFT小结

前两小节可以看到,图的傅里叶变换及其逆变换可以总结为:

对于 L = U Λ U T L=U \Lambda U^T L=UΛUT,图的傅立叶变换及逆变换为 { G F T : f ^ = U T f I G F T : f = U f ^ \begin{cases} GFT:\hat{f}=U^Tf \\ IGFT:f=U\hat{f} \end{cases} {GFT:f^=UTfIGFT:f=Uf^

类似于经典的傅里叶变换,图傅里叶变换提供了一种在两个不同的域中表示信号的方法:顶点域(vertex domain)和谱域(spectral domain)。请注意,图傅里叶变换及其逆的定义取决于拉普拉斯特征向量的选择,它们不一定是唯一的。 归一化拉普拉斯矩阵的特征向量也是定义正向和反向图傅里叶变换的可能基础。

有文献将GFT和IGFT中 U U U 的写法对调,即其写作 { f ^ = U f f = U T f ^ \begin{cases} \hat{f}=Uf \\ f=U^T\hat{f} \end{cases} {f^=Uff=UTf^,比如哈佛大学图书馆学术委员为办公室发布的讲义《Graph Convolutions and Machine Learning》,因为该文献的拉普拉斯矩阵相似对角化定义为 L = U T Λ U L=U^T \Lambda U L=UTΛU
此外,推荐使用 L = U Λ U T L=U \Lambda U^T L=UΛUT表示,kipf-GCN就是使用这种表示方法。

举个GFT的例子理解

本小结已移入另一篇博客中,参见《图傅立叶变换的理解及例子》


谱图卷积

在图神经网络,存在两种卷积,一个是谱图卷积(Spectral Graph Convolution),一个是空域图卷积。谱图卷积在早期就进入深入研究,直到kipf发表GCN引起Deep learning 界的广泛关注。空域卷积在GraphSage之后进入人们的视线。本节着重讲解谱图卷积。

卷积定理表明,两个函数(或信号)的卷积的傅里叶变换是它们傅里叶变换的逐点乘积。类似于离散时域/频域卷积定理,图的傅立叶变换也满足卷积定理。

传统卷积定义及卷积定理

本节请参阅我的两个博文,可以跟好地理解卷积:
卷积定义:《连续卷积和离散卷积定义及积分计算》
卷积定理:《时域卷积定理及频域卷积定理》

谱图卷积定义及谱卷积定理

  • 谱卷积定义

定义:设两个定义在图上的函数 f , h : V → R f,h:V\to \mathbb{R} f,h:VR ,谱图卷积定义为:
f ∗ h = U ( U T f ⊙ U T h ) = U [ h ^ ( λ 1 ) h ^ ( λ 2 ) ⋱ h ^ ( λ n ) ] U T f \begin{align} f*h=U(U^Tf\odot U^Th)= U\begin{bmatrix} \hat{h}(\lambda_1) \\ & \hat{h}(\lambda_2) & \\ & & \ddots\\ & & &\hat{h}(\lambda_n) \\ \end{bmatrix}U^Tf \end{align} fh=U(UTfUTh)=U h^(λ1)h^(λ2)h^(λn) UTf 其中, ⊙ \odot 表示点积: ( u ⊙ v ) i = u i ⋅ v i (u\odot v)_i=u_i \cdot v_i (uv)i=uivi h h h是卷积核。

(8)式等号后面的两种定义是等价的,证明请参考《GCN中的等式证明》

  • 谱卷积定理
    空间域 ⇒ \rArr 谱域: G F [ f ∗ g ] = f ∗ g ^ = U T ( U ( U T f ⊙ U T h ) ) = U T f ⊙ U T h = f ^ ⊙ h ^ \mathcal{GF}[f*g]=\widehat{f*g}=U^T\Bigg(U\Big(U^Tf\odot U^Th\Big)\Bigg)=U^Tf\odot U^Th=\hat{f}\odot \hat{h} GF[fg]=fg =UT(U(UTfUTh))=UTfUTh=f^h^
    谱域 ⇒ \rArr 空间域:(目前还没有发现相关文献)

谱图卷积在深度学习中的应用

本节只简单介绍谱图卷积在深度学习中的使用,后续会有相关博文对第一代GCN、第二代GCN及kipf-GCN进行解读。

论文通常会将谱图卷积写成如下形式:
g θ ⋆ x = U g θ U T x \begin{align} g_\theta\star x = Ug_\theta U^Tx \end{align} gθx=UgθUTx 其中, x ∈ R N x\in\mathbb{R}^N xRN 是输入(每个顶点都是一个常数,一共 N N N 个顶点)。 g θ = d i a g ( θ ) g_\theta=diag(\theta) gθ=diag(θ) 是卷积核( θ ∈ R N \theta\in\mathbb{R}^N θRN) ,且为 L L L 特征值的函数,所以可以写为 g θ ( Λ ) g_\theta(\Lambda) gθ(Λ)。式(9)与式(8)是等价的。

最简单的情况,输入层为 x x x,则输出层为 U g θ U T x Ug_\theta U^Tx UgθUTx θ \theta θ 是可训练参数。按照这种形式就可以一层一层堆叠。可以参考kipf的论文:《Semi-Supervised Classification With Graph Convolutional Networks》,ICLR,2017。






参考文献:


  1. 维基百科-Spectral graph theory ↩︎

  2. 图拉普拉斯、拉普拉斯嵌入和谱聚类的简短教程 ↩︎

  3. 维基百科-Laplacian matrix ↩︎

  4. 穆尔彭罗斯伪逆 ↩︎

  5. 注意,vertex与node,关系紧密但略有不同,每一个vertex都将以node的形式在计算机中被表示和实现。参见链接 ↩︎

  6. 维基百科-Eigenfunction ↩︎

  • 7
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值