SDR算法的应用 2021-12-20

SDR算法的使用

  • 回顾
  • EVD 分解
  • 高斯随机化
  • 参考链接

回顾

接上面的工作 SDR,SDR处理的QCQP问题形式为:
min ⁡ x ∈ R n    x T C x                                     s . t .    x T A i x ⊵ i b i ,   i = 1 , ⋯   , m , \min_{x \in \mathbb{R} ^n} ~~ x^TCx \\ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ \mathrm {s.t.} ~~x^TA_ix \unrhd_i b_i, ~i = 1,\cdots,m, xRnmin  xTCx                                   s.t.  xTAixibi, i=1,,m,

  • 该问题定义在实数域 R n \mathbb{R} ^n Rn,复数域类似。
  • ⊵ i \unrhd_i i 可以表示为 ≥ \geq , ≤ \leq , = = =,只要约束条件是二次约束即可。
  • C C C, A i A_i Ai 都是对称矩阵, C ,   A i (   i = 1 , ⋯   , m ) ∈ S n C, ~A_i (~i = 1,\cdots,m) \in \mathbb{S} ^n C, Ai( i=1,,m)Sn
  • x T A i x ≥ 0 x^TA_ix \geq 0 xTAix0 x T A i x = 0 x^TA_ix = 0 xTAix=0时可行域并不是一个凸集,QCQP并不是一个凸问题。

利用SDR方法, 引入一个新的变量 X = x x T X=xx^T X=xxT 作为优化变量, 那么上述问题可以写为
min ⁡ X ∈ S n    T r ( C X )                                     s . t .    T r ( A i X ) ⊵ i b i ,   i = 1 , ⋯   , m ,                             X ⪰ 0 , r a n k ( X ) = 1. \min_{X \in \mathbb{S} ^n} ~~ \mathrm {Tr}(CX) \\ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ \mathrm {s.t.} ~~\mathrm {Tr}(A_iX) \unrhd_i b_i, ~i = 1,\cdots,m, \\ ~~~~~~~~~~~~~~~~~~~~~~~~~~~ X \succeq 0, \mathrm {rank} (X) =1. XSnmin  Tr(CX)                                   s.t.  Tr(AiX)ibi, i=1,,m,                           X0,rank(X)=1.

通过松弛掉 r a n k ( X ) = 1 \mathrm {rank} (X) =1 rank(X)=1 约束,直接使用CVX求解这一凸问题, 得到最优解 X ∗ X^* X 。接下来主要围绕如何从一个并不满足秩为1的矩阵 X ∗ X^* X 中恢复出原QCQP问题所需要的向量 x x x

EVD 分解

一种最直观的想法就是, 要从 X ∗ X^* X 中恢复 x x x。通过求解下面问题来获得一个次优解:
min ⁡ x ∥ X ∗ − x T x ∥ F 2 \min_x \| X^* - x^Tx \|_F^2 xminXxTxF2
该问题的最优解, 则由 x x x 等于 X ∗ X^* X 的 “最大特征向量” 乘以 “最大特征值的根” 给出。
X ∗ X^* X 做 EVD 分解得到其最大特征向量, 则是一种直截了当的 SDR恢复方式。matlab 代码如下:

 [V,D] = eig(X);
 [value,num] = max(diag(D));
 x = sqrt(value)*V(:,num);

为什么最优解是最大特征向量?
可以延伸到一个更general的问题, 即低秩矩阵近似问题。涉及 瑞利熵问题

高斯随机化

EVD分解法恢复 x x x 虽然简单, 但显然有着较高的误差,从而带来不可避免的损失。 那么类似于常见于梯度下降法中,使用多组随机初始点,再挑选性能最优的作为解 这样的 “枚举思想”, SDR也有类似的并不高明但行之有效的性能优化手段。

具体做法为:
首先生成 L L L 组随机向量
ξ ℓ ∼ N ( 0 , X ∗ ) \xi_{\ell} \sim N (0, X^*) ξN(0,X)
然后找出令目标函数最小的 ξ ℓ \xi_{\ell} ξ,即令 ξ ∗ = a r g m i n ℓ   ξ ℓ T C ξ ℓ \xi^* = \mathrm {arg min}_{\ell} ~\xi_{\ell}^T C\xi_{\ell} ξ=argmin ξTCξ.

需要指出的是, 如果 ξ ℓ \xi_{\ell} ξ 不满足原QCQP问题中的约束, 那么需要进行稍微的“魔改”,使得满足原限制条件。然后再利用修改后的 ξ ℓ \xi_{\ell} ξ 进行上述操作。 针对不同的问题, 我们可能需要不同的“魔改”。

  • 如假设原问题要求 x i 2 = 1 x_i^2=1 xi2=1, 这常出现在二元检测中。 那么此时, 我们先要对生成的 ξ ℓ \xi_{\ell} ξ 进行如下操作:
    [ ξ ℓ ] i = s g n ( [ ξ ℓ ] i ) [\xi_{\ell}]_i = \mathrm {sgn} ([\xi_{\ell}]_i ) [ξ]i=sgn([ξ]i)
  • 如果原问题的限制条件为 x T A i x ≥ 0 , ∀ i x^TA_ix \geq 0, \forall i xTAix0,i ,那么我们需要进行的操作就是:
    ξ = ξ min ⁡ i ξ T A i ξ \xi = \frac{\xi}{\sqrt{\min_i \xi^TA_i \xi}} ξ=miniξTAiξ ξ
  • 如果原问题的限制条件是在HBF问题和IRS问题中大放异彩的恒模约束 ∣ x i ∣ = 1 , ∀ i |x_i| = 1, \forall i xi=1,i,我们需要进行的操作就是:
    [ ξ ℓ ] i = [ ξ ℓ ] i ∣ [ ξ ℓ ] i ∣ [\xi_{\ell}]_i = \frac{[\xi_{\ell}]_i} {|[\xi_{\ell}]_i |} [ξ]i=[ξ]i[ξ]i

由上可见,作为一种启发式算法, 魔改的方式不唯一,也不固定,核心要义是要随机出来的向量能满足原问题的限制条件。

具体流程:

  1. 求解SDP问题得到 X ∗ X^* X
  2. 生成 L L L 组随机向量 ξ ℓ ∼ N ( 0 , X ∗ ) \xi_{\ell} \sim N (0, X^*) ξN(0,X)
  3. ξ ℓ \xi_{\ell} ξ 魔改为符合原QCQP问题约束的可行解
  4. 找出最优的 ξ ∗ = a r g m i n ℓ   ξ ℓ T C ξ ℓ \xi^* = \mathrm {arg min}_{\ell} ~\xi_{\ell}^T C\xi_{\ell} ξ=argmin ξTCξ
  5. 最优解 x = ξ ∗ x=\xi^* x=ξ

matlab代码方面, 关键点则在于如何生成 一个 服从 N ( 0 , X ∗ ) N (0, X^*) N(0,X) 的向量呢?

已知 v = randn(n) 可以得到一个 服从 N ( 0 , 1 ) N (0, 1) N(0,1) 的 n 维向量 v。
如果我们对 v 进行乘法操作 v = A v,其分布则变为 N ( 0 , A A H ) N (0, AA^H) N(0,AAH)。 也就是说, 我们只需要找到能使得 A A H = X ∗ AA^H = X^* AAH=X A A A,就可以使用 v = A v 获得满足分布的 v 向量。 而获得这样的 A A A, 则只需要对 X ∗ X^* XCholesky 分解即可, 对一个半正定矩阵 X X X 作该分解为:
X = A A H X = AA^H X=AAH

for i = 1 : L
	v = randn(n);
	A = chol(Xstar); # chol 是内置matlab函数, 得到的是 A^H
	V(:, i) = A' * v;
end

另,两个工程实例代码详见 HBF 和 RIS

参考链接

【1】https://blog.csdn.net/weixin_39274659/article/details/121619619
【2】https://blog.csdn.net/weixin_39274659/article/details/103818469
【3】Wu Q , Zhang R . Intelligent Reflecting Surface Enhanced Wireless Network via Joint Active and Passive Beamforming[J]. IEEE Transactions on Wireless Communications, 2019, PP(99):1-1.

你可能感兴趣的:(优化知识学习,算法,matlab,线性代数)