KAN不稳定/卡尔曼滤波 小波变换

## 郭款论文

### **整体逻辑**

*网络拓扑的生成与模拟*

- RW、RWP、RD模型：这几种随机移动模型用于模拟节点在动态网络中的移动情况，从而生成连续时间点上的网络快照（邻接矩阵）。

- ER模型：作为静态网络模型，它提供了对比基准，用于验证重构算法在无动态扰动情况下的表现。

  

  这些模型为实验提供了“真实”的网络拓扑数据（或称地面真值），即论文中构建和测试网络重构算法的基础数据来源。

  

*网络拓扑的预测*

- 卡尔曼滤波：在动态网络中，由于网络拓扑会随时间变化，直接获取每个时刻的真实拓扑通常不现实。论文利用卡尔曼滤波等预测算法，根据之前时刻网络的特征谱参数（如特征值和特征向量）来预测未来时刻的谱参数，为减少**计算复杂度和降低噪声**影响，通常只预测前 K 个最重要的特征谱参数，因为这部分信息包含了网络大部分的全局结构特征。

*网络重构过程*

- 基于对称非负矩阵分解的重构：利用预测得到的谱参数（卡尔曼滤波预测的特征值和特征向量），可以对网络邻接矩阵进行逆向重构。这一步可以看作是“从低维（特征）恢复高维（原始邻接矩阵）”的过程，但由于预测误差和噪声，得到的初步重构矩阵通常存在一定偏差。

*矢量量化算法的应用*

- 矢量量化（如改进的模糊 C 均值聚类）：为了消除初步重构矩阵中的小幅扰动和噪声，通过对矩阵元素进行聚类量化，将分散的数值映射到各自的“代表值”上，从而提高重构精度。这个步骤实际上起到了“降噪”和“修正预测误差”的作用，使得最终的重构网络拓扑更加准确。



### 矢量量化

矢量量化的基本思想是将输入数据点视为多维向量，并将其映射到一个码本（codebook）中的最接近的码字。码本是预先确定的一组离散的向量，通常通过无监督学习方法（如**K-means**）从大量训练数据中得到。在矢量量化中，输入数据点与码本中的码字之间的距离度量通常使用**欧氏距离**。通过选择最接近的码字作为量化结果，可以用较少的码字表示输入数据，从而实现数据的压缩。同一个码字能够代表多个相似的多维向量,从而实现了**多对一的映射**。



**为什么引入矢量量化理论？**

在谱分解重构过程中，由于特征值和特征向量的预测存在误差，每个矩阵元素可能会略微偏离理想值。例如，对于一个理想的 $0/1$ 邻接矩阵，真实的连接应为 $1$，而不连接应为 $0$。由于预测误差，实际重构矩阵可能出现如下数值：

$$
\begin{bmatrix}
0 & 0.98 & 0.03 \\
0.97 & 0 & 1.02 \\
0.05 & 1.01 & 0 \\
\end{bmatrix}
$$

这里，$0.98$, $0.97$, $1.02$, $1.01$ 这些数值本来应该都是 $1$，但由于误差略有偏离；同样，$0.03$ 和 $0.05$ 本应为 $0$。

**矢量量化**通过将多个离散的扰动值聚类映射到固定值（如0/1或权值），消除随机误差，提高重构精度。

理想的量化后的矩阵：

$$
\begin{bmatrix}
0 & 1 & 0 \\
1 & 0 & 1 \\
0 & 1 & 0 \\
\end{bmatrix}
$$



#### **K-means矢量量化示例**

假设我们有 4 个二维数据点，希望将它们分成 2 类，即构造一个包含 2 个码字的码本。整个过程类似于 k-means 聚类。

**1. 数据矩阵**

设原始数据矩阵为

$$
X=\begin{pmatrix}
1   & 2 \\
1.2 & 2.1 \\
3   & 4 \\
2.9 & 3.8
\end{pmatrix}.
$$

这 4 个数据点中，前两个点大致聚集在一起，后两个点大致在另一处。

2. **初始化码本**

我们希望构造一个码本矩阵 $C$，初始时可以从数据中随机选择两个点作为码字。假设选择 $x_1=(1,2)$ 和 $x_3=(3,4)$，则初始码本为

$$
C^{(0)}=\begin{pmatrix}
1 & 2 \\
3 & 4
\end{pmatrix}.
$$

其中，每一行代表一个码字。

3. **分配数据点到码字**

对于每个数据点，计算它与各个码字之间的欧氏距离，并将其分配到距离最近的码字。下面计算各数据点到码字的距离（这里只计算距离的平方，便于比较）：

- **数据点 $x_1=(1,2)$：**

  - 到码字 1 $(1,2)$ 的距离平方：$ (1-1)^2+(2-2)^2=0 $
  - 到码字 2 $(3,4)$ 的距离平方：$ (1-3)^2+(2-4)^2=4+4=8 $

  分配：$x_1$ 属于码字 1。

- **数据点 $x_2=(1.2,2.1)$：**

  - 到码字 1 $(1,2)$ 的距离平方：$ (1.2-1)^2+(2.1-2)^2=0.04+0.01=0.05 $
  - 到码字 2 $(3,4)$ 的距离平方：$ (1.2-3)^2+(2.1-4)^2\approx3.24+3.61=6.85 $

  分配：$x_2$ 属于码字 1。

- **数据点 $x_3=(3,4)$：**

  - 到码字 1 $(1,2)$ 的距离平方：$ (3-1)^2+(4-2)^2=4+4=8 $
  - 到码字 2 $(3,4)$ 的距离平方：$ 0 $

  分配：$x_3$ 属于码字 2。

- **数据点 $x_4=(2.9,3.8)$：**

  - 到码字 1 $(1,2)$ 的距离平方：$ (2.9-1)^2+(3.8-2)^2\approx3.61+3.24=6.85 $
  - 到码字 2 $(3,4)$ 的距离平方：$ (2.9-3)^2+(3.8-4)^2=0.01+0.04=0.05 $

  分配：$x_4$ 属于码字 2。

可以将分配结果用指示矩阵 $Z$ 表示，每行对应一个数据点，每列对应一个码字，若数据点分配给该码字，则对应位置为 1，否则为 0。于是

$$
Z=\begin{pmatrix}
1 & 0 \\
1 & 0 \\
0 & 1 \\
0 & 1
\end{pmatrix}.
$$

4. **更新码字**

对于每个码字，计算分配给该码字的数据点的均值，更新码字。更新公式为

$$
c_k = \frac{1}{|S_k|}\sum_{x\in S_k} x,
$$

其中 $S_k$ 表示被分配给第 $k$ 个码字的点的集合。

- 对于码字 1：  
  数据点 $x_1=(1,2)$ 和 $x_2=(1.2,2.1)$，  
  新码字为
  $$
  c_1^{(1)}=\left(\frac{1+1.2}{2},\frac{2+2.1}{2}\right)
  = (1.1,\ 2.05).
  $$

- 对于码字 2：  
  数据点 $x_3=(3,4)$ 和 $x_4=(2.9,3.8)$，  
  新码字为
  $$
  c_2^{(1)}=\left(\frac{3+2.9}{2},\frac{4+3.8}{2}\right)
  = (2.95,\ 3.9).
  $$

因此，更新后的码本矩阵为

$$
C^{(1)}=\begin{pmatrix}
1.1 & 2.05 \\
2.95 & 3.9
\end{pmatrix}.
$$

5. **重复迭代**

通常，矢量量化的过程会不断迭代“分配数据点”和“更新码字”的步骤，直到码本收敛或达到预设的迭代次数。上述过程就是一次完整的迭代。实际中可能需要多次迭代来使码本更好地逼近数据的分布。



**传统Kmeans的局限：**

对初始簇中心敏感

- K-means 需要预先设定簇的数量 $K$并随机初始化簇中心，初始选择不佳可能导致算法收敛到局部最优解，而非全局最优。

对离群点敏感

- 算法使用均值来更新簇中心，离群点会显著影响均值的计算，从而使得簇中心偏离真实的“中心”位置，进而影响整体聚类效果。

硬性划分（硬聚类）

- 每个数据点只能被分配到一个簇，无法反映数据点可能同时具有多个簇的隶属关系。对于边界数据来说，这种“一刀切”的划分可能导致信息丢失。

需要预先确定$K$ 值

- 算法必须事先指定簇的数量，但在许多实际问题中，合适的$K$ 值可能难以确定，并且对最终结果有较大影响。



#### **PAM算法**

主要流程如下 ：

1. **初始化**  
   通过谱分解方法获得重构后的网络邻接矩阵，并根据预先确定的簇数 K 初始化 K 个簇中心。

2. **分配阶段**  
   计算矩阵中每个元素 \( $a_{ij} $\) 与所有簇中心之间的欧氏距离 \( $d_{ij}$ \)（即 \($\sqrt{(a_{ij} - C_k)^2}$\)），并将该元素分配给距离最近的簇。
   时间复杂度：$O(nk)$
   
3. **更新簇中心**  

   - 对于某个簇 $C_k$，我们先将该簇中所有的数据点(除去原簇中心)都作为候选中心，即构成集合 $P$。

   - 对于集合 $P$ 中的每一个候选点 $p$，计算它与同一簇中其他所有点的距离总和：

   $$
   D(p) = \sum_{q \in C_k, \, q \neq p} d(p, q)
   $$

   其中 $d(p, q)$ 通常用欧氏距离或其他合适的距离度量表示。

   - 选取使 $D(p)$ 最小的那个候选点作为新的簇中心 $C_k$。

     时间复杂度分析：需要尝试的替换次数：$k \times (n-k)$​
     每次替换需要对所有(n)个元素重新分配并计算代价，则该阶段在一次完整迭代中的最坏情况下复杂度为
     $$
     O\bigl(k \times (n - k) \times n\bigr)\,.
     $$

     当 \(k\) 相对 \(n\) 不是特别大时，可近似视为
     $$
     O(n^2 k)\,.
     $$

     

4. **迭代**  
   重复“分配阶段”和“更新簇中心”两个步骤，直到簇中心值不再发生变化或元素的分配不再改变为止。

5. **量化处理**  
   聚类完成后，对原矩阵中每个元素进行量化，即将其映射为其所属簇的中心值，得到误差被有效消除的量化重构矩阵。

6. **输出结果**  
   最终输出经过量化处理后的矩阵，该矩阵的重构误差明显降低，尤其在**存在较大扰动或离群值**的情况下，PAM 算法可以较好地缓解这些因素带来的负面影响。

PAM 改进了离群点的问题，但它依然属于硬性聚类方法，且计算成本大



#### **FCM算法**

FCM的目标是将矩阵中的元素聚类到$K$个簇中，每个元素通过**隶属度**（概率值）表示其属于各簇的程度。以下是算法的详细步骤：

**1. 初始化**

- 输入：待聚类的矩阵 $A$（例如邻接矩阵）。
- 设置：簇数 $K$ 、模糊因子 $m$（通常取2）、收敛精度 $\epsilon$ 、最大迭代次数。
- 初始化：随机生成隶属度矩阵 $U$ 和簇中心  $C$ 。

**2. 更新隶属度**

对于每个元素 $a_{ij} $，计算其属于簇 $k$ 的隶属度 $ \mu_k(a_{ij})$ ：
$$
\mu_k(a_{ij}) = \frac{1}{\sum_{l=1}^{K} \left( \frac{\|a_{ij} - c_k\|}{\|a_{ij} - c_l\|} \right)^{2/(m-1)}}
$$

-  \|$a_{ij} - c_k$\| ：元素 \($ a_{ij}$ \) 到簇中心 \( $c_k$ \) 的距离（通常用欧氏距离）。

- $m$ ：模糊因子，控制聚类的模糊程度( $m$ =2 \) 时，隶属度更平滑）。
  时间复杂度：

  计算单个隶属度需要$O(K)$ 的(遍历所有 \($l=1,\dots,K$\)\)

  由于要计算对 $K$个簇的隶属度，单个数据点的隶属度更新是 $O(K^2)$。

**3. 更新簇中心**

对于每个簇 $k$ ，计算新的簇中心  $c_k$ ：
$$
c_k = \frac{\sum_{i,j} [\mu_k(a_{ij})]^m a_{ij}}{\sum_{i,j} [\mu_k(a_{ij})]^m}
$$

- \($ [\mu_k(a_{ij})]^m $)：隶属度的加权值，表示元素对簇的贡献。

**4. 判断收敛**

- 计算簇中心的变化量 \( $\Delta C$ = \|$C_{\text{new}} - C_{\text{old}}$\| \)。
- 如果 \( $\Delta C < \epsilon $\)，则停止迭代；否则返回步骤2。

**5. 量化处理**

- 根据隶属度将元素分配到概率最大的簇，并用簇中心值替换元素值。

---

**具体矩阵例子**

假设有一个$3×3$的邻接矩阵 \( A \)：
$$
A = \begin{bmatrix}
0.1 & 0.9 & 0.3 \\
0.8 & 0.2 & 0.7 \\
0.4 & 0.6 & 0.5 \\
\end{bmatrix}
$$
目标是将矩阵元素聚类为2个簇( $K=2$ ），分别表示“连接”（簇1）和“断开”（簇2）。

**步骤1：初始化**

- 随机初始化簇中心：
  $$
  c_1 = 0.2, \quad c_2 = 0.8
  $$

- 随机初始化隶属度矩阵 $U$（每行和为1）：
  $$
  U = \begin{bmatrix}
  0.6 & 0.4 \\
  0.3 & 0.7 \\
  0.5 & 0.5 \\
  0.8 & 0.2 \\
  0.4 & 0.6 \\
  0.7 & 0.3 \\
  0.9 & 0.1 \\
  0.2 & 0.8 \\
  0.5 & 0.5 \\
  \end{bmatrix}
  $$

**步骤2：更新隶属度**

以元素 \( $a_{11}$ = 0.1 \) 为例：

- 计算到簇1的距离：
  $$
  \|a_{11} - c_1\| = |0.1 - 0.2| = 0.1
  $$

- 计算到簇2的距离：
  $$
  \|a_{11} - c_2\| = |0.1 - 0.8| = 0.7
  $$

- 计算隶属度：
  $$
  \mu_1(a_{11}) = \frac{1}{\left( \frac{0.1}{0.1} \right)^2 + \left( \frac{0.1}{0.7} \right)^2} \approx 0.98
  $$

  $$
  \mu_2(a_{11}) = 1 - \mu_1(a_{11}) \approx 0.02
  $$

**步骤3：更新簇中心**

以簇1为例：

- 计算加权和：
  $$
  \sum_{i,j} [\mu_1(a_{ij})]^2 a_{ij} = (0.98)^2 \times 0.1 + (0.3)^2 \times 0.8 + \dots
  $$

- 计算新的簇中心：
  $$
  c_1 = \frac{\text{加权和}}{\sum_{i,j} [\mu_1(a_{ij})]^2}
  $$

**步骤4：判断收敛**

- 如果簇中心变化小于 \($ \epsilon $\)，停止迭代。

**步骤5：量化处理**

- 根据隶属度将元素分配到簇1或簇2，并用簇中心值替换元素值。



#### **初始簇中心选取优化方法**

**优化过程**：

1. 设邻接矩阵最大元素值为$p$，设定初始簇间距阈值$\theta = \frac{p}{K}$（$K$为预设簇数）

2. 初始化候选集合$S_0$包含所有矩阵元素

3. 迭代选择簇中心：

   - 计算当前候选集中元素间最小距离$d_{min}$

   - 选择具有$d_{min}$的两个元素，计算中心点作为新簇中心$C_i$

   - 根据阈值$\theta$划分集合：
     $$
     S_1 = \{ x \in S_0 \ | \ \|x - C_i\| \leq \theta \}
     $$

     $$
     S_2 = S_0 \setminus S_1
     $$

   - 将$S_2$作为新的候选集，重复直到选出$K$个簇中心

**数学约束**：
对于选定的簇中心需满足：
$$
\forall i,j \in [1,K], \ \|C_i - C_j\| \geq \theta
$$
其中$\theta = \frac{\max(A)}{K}$，$A$为邻接矩阵。



#### FCM算法时间复杂度分析

网络节点数目为 $n$（不是矩阵的维度！），聚类簇数$K$

**初始化步骤**

- 初始化簇中心和隶属度矩阵 $U$：需要为每个数据点生成 $K$ 个隶属度值，需要 $O(nK)$

**更新隶属度**

- 每个数据点 $a_{ij}$ 计算与每个簇中心 $c_k$ 的距离：$O(K)$
- 更新所有数据点的隶属度矩阵：$O(nK^2)$

**更新簇中心**

- 计算每个簇的新中心（加权平均）：$O(nK)$
- 总体簇中心更新：$O(nK)$

**判断收敛**

计算簇中心变化量 $\Delta C$：$O(K)$

**量化处理**

将元素分配到簇并替换值：$O(nK)$

**每次迭代的总时间复杂度：**
$$
O(nK^2) + O(nK) + O(K) \approx O(nK^2)
$$

其中：

- $n$：数据点数量
- $K$：簇数量



**如果初始簇中心选取优化方法**

- 选择 $K$ 个簇中心时：
  - 需要计算候选集内元素间最小距离
  - 每次选择复杂度：$O(n^2)$
- 总体选择复杂度：$O(Kn^2)$

整个FCM时间复杂度：$O(Kn^2)+O(TnK^2)$，$T$为迭代次数



### 网络重构

对称非负矩阵分解（SNMF）要求输入矩阵 $A$ 是**对称且非负**的，分解之后的矩阵 $U$ 是非负的。
$$
A \approx U U^T.
$$
对称非负矩阵分解来构造网络的**低维嵌入**表示，从而实现对高维网络邻接矩阵的精确重构。

低维指的是分解后的 $U$ 矩阵维度小->秩小->重构后的矩阵秩也小。

只需计算 $U U^T$ 就能重构出 $A$ 的**低秩**近似版本。如果选择保留全部特征（即 $r = n$），则可以精确还原 $A$；如果只取部分（$r < n$），那么重构结果就是 $A$ 的低秩近似。



#### 节点移动模型

**模拟随机网络中节点的移动方式**，进而间接模拟网络拓扑在不同时刻的变化。它们是用来在仿真环境下产生“网络结构随时间动态变化”的数据，从而让后续的网络重构或网络分析算法有一个逼近真实场景的测试环境。

**RW（Random Walk，随机游走）模型**

- 基本概念：在 **随机游走（RW）** 模型中，节点在一个定义的区域内随即选择方向并开始移动。每当节点到达区域的边界时，它会反弹并继续前进。节点的移动时间是固定的，且每个移动步骤都是独立的。
- 特点
  - 节点移动过程中，节点的行进方向是完全随机的。
  - 节点在到达区域边界时会选择一个新的角度进行反弹，并继续随机移动。
  - 节点的移动是不规则的，每次运动的时间或距离是固定的，直到达到边界。
- 适用场景：适用于需要模拟节点在空间中随机漂移或无规律移动的场景，如某些类型的无人机网络或粒子运动模型。

**RD（Random Direction，随机方向）模型**

- 基本概念：在 **随机方向（RD）** 模型中，节点每次选择一个随机的方向，并在该方向上移动直到达到区域的边界。到达边界后，节点会随机选择一个新的目标方向，并继续移动。
- 特点
  - 节点在每个时间片段内选择一个**随机的方向**，而不是随机选择目标。
  - 节点在到达边界时会停留一段时间，然后选择一个新的随机方向。
  - 该模型中，节点的运动行为更有方向性，与RW模型相比有更强的运动规律性。
- 适用场景：适用于需要模拟节点在特定方向上移动的情况，如某些类型的车载网络或定向通信网络。

**RWP（Random Waypoint，随机路点）模型**

- 基本概念：在 **随机路点（RWP）** 模型中，节点选择一个**随机的位置**作为目标点，然后以固定速度沿直线移动到该位置。到达目标点后，节点选择一个新的随机目标位置，并再次以相同的速度移动。
- 特点
  - 节点移动到随机选定的目标位置，并在到达后停留一段时间。
  - 该过程重复进行，每次都选择新的随机目标位置。
  - 节点在任意时刻都有一个目标位置，而不是随机选择一个方向。
- 适用场景：适用于模拟节点有明确目标且周期性移动的网络场景，比如无线传感器网络和移动广告网络等。
  

**参数**

**节点数量**决定了在该活动半径内随机分布并移动的节点数量

**通信半径** 决定了网络中“谁能跟谁连边”，对 **拓扑连通性** 影响极大（如果两节点之间的距离小于等于通信半径，就认为它们之间存在连边）；

**活动半径** 决定了节点分布和移动范围，对 **网络整体的稀疏/稠密程度**、节点之间的平均距离都有重要影响。



#### 基于 SNMF 的网络嵌入

文献[60]提出一种基于**简化特征分解**和**整体旋转**的近似方法(reduced Eigenvalue Decomposition，rEVD)：

1. 先通过截断特征值/向量，构造一个 $B = X \Lambda^{1/2}$；  
2. 不断“旋转” $B$（乘以酉矩阵 $Q$）并对负值做截断，从而让最终的 $U$ 既接近 $B$ 又满足非负性。  
   这相当于把一部分“逼近”工作用特征分解先做了，然后只用旋转矩阵 $Q$ 来调整局部负值，再配合 $\max(0,\cdot)$ 截断满足非负约束。

**矩阵分解的重构算法步骤为：**

1. **输入**  
   - 预测特征向量矩阵 $X$  
   - 特征值矩阵 $\Lambda$

2. **初始化**  
   $$
   B = X \Lambda^{\frac{1}{2}}, \quad Q = I, \quad U = \text{rand}(n, r)
   $$

3. **交替更新 $U$, $Q$**  
   $$
   U = \max\bigl(0, B Q\bigr)
   $$

4. **继续更新 $Q$**  
   $$
   F = U^T B \quad \Rightarrow \quad [H, \Sigma, V] = \text{svd}(F), \quad Q = V H^T
   $$

5. **重复步骤 3、4，直到满足迭代停止条件**  
   $$
   \|U^T(U - BQ)\|_F^2 \le \varepsilon
   $$

6. **令**  
   $$
   A' = U U^T
   $$
   并通过后续 FCM 算法进行聚类

7. **输出嵌入矩阵**





假设我们有一个 $2 \times 2$ 对称非负矩阵

$$
A = \begin{pmatrix} 3 & 1 \\ 1 & 3 \end{pmatrix}.
$$

---

**1. 初始步骤：构造 $B$ 和 $Q$**

首先*对 $A$ 做谱分解*，*或者卡尔曼滤波预测*得到（已知结果）：

- 特征值：$\lambda_1=4, \lambda_2=2$  

- 对应的单位特征向量：  
  $$
  x_1 = \begin{pmatrix} \frac{1}{\sqrt{2}} \\ \frac{1}{\sqrt{2}} \end{pmatrix}, \quad
  x_2 = \begin{pmatrix} \frac{1}{\sqrt{2}} \\ -\frac{1}{\sqrt{2}} \end{pmatrix}.
  $$

构造  
$$
X = \begin{bmatrix} x_1 & x_2 \end{bmatrix} = \begin{pmatrix} \frac{1}{\sqrt{2}} & \frac{1}{\sqrt{2}} \\ \frac{1}{\sqrt{2}} & -\frac{1}{\sqrt{2}} \end{pmatrix}, \quad
\Lambda = \begin{pmatrix} 4 & 0 \\ 0 & 2 \end{pmatrix}.
$$

取 $r=2$（通常𝑟 ≪ $n$，这里仅作例子），定义  
$$
B = X \Lambda^{\frac{1}{2}} \quad \text{其中} \quad \Lambda^{\frac{1}{2}} = \begin{pmatrix} 2 & 0 \\ 0 & \sqrt{2} \end{pmatrix}.
$$

因此，
$$
B = X \Lambda^{\frac{1}{2}} =
\begin{pmatrix} \frac{1}{\sqrt{2}} & \frac{1}{\sqrt{2}} \\ \frac{1}{\sqrt{2}} & -\frac{1}{\sqrt{2}} \end{pmatrix}
\begin{pmatrix} 2 & 0 \\ 0 & \sqrt{2} \end{pmatrix}
= \begin{pmatrix} \frac{2}{\sqrt{2}} & \frac{\sqrt{2}}{\sqrt{2}} \\ \frac{2}{\sqrt{2}} & -\frac{\sqrt{2}}{\sqrt{2}} \end{pmatrix}
= \begin{pmatrix} \sqrt{2} & 1 \\ \sqrt{2} & -1 \end{pmatrix}.
$$

同时，初始令 $Q = I_2$（$2 \times 2$ 单位矩阵）。

---

**2. 初始 $U$ 的计算**

按照迭代初始公式：
$$
U \approx \max\Bigl(0, B Q \Bigr).
$$
由于 $Q = I_2$，初始 $U$ 就是
$$
U^{(0)} = \max\Bigl(0, B \Bigr) = \max\left(0, \begin{pmatrix} \sqrt{2} & 1 \\ \sqrt{2} & -1 \end{pmatrix}\right)
= \begin{pmatrix} \sqrt{2} & 1 \\ \sqrt{2} & 0 \end{pmatrix}.
$$

---

**3. 更新 $Q$ 的步骤**

接下来计算中间矩阵  
$$
F = U^{(0)T} B.
$$
计算 $U^{(0)T}$：
$$
U^{(0)T} = \begin{pmatrix} \sqrt{2} & \sqrt{2} \\ 1 & 0 \end{pmatrix}.
$$
因此，
$$
F = U^{(0)T} B = \begin{pmatrix} \sqrt{2} & \sqrt{2} \\ 1 & 0 \end{pmatrix} \begin{pmatrix} \sqrt{2} & 1 \\ \sqrt{2} & -1 \end{pmatrix}= \begin{pmatrix} 4 & 0 \\ \sqrt{2} & 1 \end{pmatrix}.
$$
接下来，对 $F$ 进行奇异值分解（SVD）：设  
$$
F = H \Sigma V^T.
$$
（在实际数值计算中可以得到具体 $H, \Sigma, V$；此处我们只说明流程。）  
然后按照更新公式，令  
$$
Q \leftarrow V H^T.
$$

这一步的作用是“旋转” $B$ 的基，使得 $U$ 更贴近满足 $A \approx U U^T$ 的目标。

---

**4. 迭代更新 $U$**

在更新了 $Q$ 后，再更新 $U$ 的公式仍为：
$$
U \leftarrow \max\bigl(0, B Q \bigr).
$$
也就是说，用新的 $Q$ 重新计算 $B Q$，再将负值截断为零。

然后再重复“计算 $F = U^T B$ → SVD 得到新 $Q$ → 更新 $U$”这一过程，直至满足收敛条件（例如 $\|U^T(U - B Q)\|_F^2 \le \varepsilon$）。

---

**5. 迭代结束后的意义**

当迭代停止时，得到的 $U$ 满足  
$$
A \approx U U^T.
$$
此时 $U$（尺寸为 $2 \times 2$ 的矩阵）就是对 $A$ 进行低维嵌入得到的“特征表示”，它不仅满足非负性，而且通过内积 $U U^T$ 能近似重构出原矩阵 $A$。



#### 疑问

郭和颜的论文都说满足低秩或者具有低秩性条件的矩阵，SNMF分解出的矩阵是唯一的。可能指的是经过特定算法，输入固定，输出也是固定的。

但是：

- **旋转自由度**：若 $(U, U^T)$ 是一个解，则对任意正交矩阵 $R$（满足 $RR^T=I$），$(UR, R^TU^T)$ 也是有效解。

  

#### **时间复杂度分析**

(1) 初始构造阶段（假设特征值 特征向量已提前获取，不做分析）

**构造矩阵** $B = X\Lambda^{1/2}$  

$X$ 是 $n \times r$，$\Lambda^{1/2}$ 是 $r \times r$ 对角矩阵。

$$\mathcal{O}(nr^2) \quad (r \ll n)$$



(2) 迭代过程

**计算 $U = \max(0, B Q)$**

$B$ 是 $n \times r$，$Q$ 是 $r \times r$。

$\mathcal{O}(n r^2)$

**计算 $F = U^T B$**

$U^T$ 是 $r \times n$，$B$ 是 $n \times r$。

$\mathcal{O}(n r^2)$

**对 $F$ 进行 SVD**

$F$ 是 $r \times r$ 的矩阵。

SVD 的时间复杂度：$\mathcal{O}(r^3)$。

**更新 $Q = V H^T$**

$V$ 和 $H$ 是 $r \times r$。

$\mathcal{O}(r^3)$

(3) 由于通常 $n \gg r$，$\mathcal{O}(n r^2)$ 是主导项，故总复杂度（其中 $T$ 为迭代次数）
$$
T \cdot \mathcal{O}(nr^2)
$$




**两种求对称非负矩阵分解的方法**

1. **纯梯度下降**  
   - 优点：实现原理简单，对任意大小/形状的矩阵都能做。  
   - 缺点：收敛速度有时较慢，且对初始值敏感。  

2. **rEVD + 旋转截断**  （示例方法）
   - 优点：利用了特征分解，可以先一步把主要信息“压缩”进 $B$，后续只需解决“如何把负数修正掉”以及“如何微调逼近”。  
   - 缺点：需要先做特征分解，适合于对称矩阵或低秩场景。

