前不久的线性判别分析学习过程还历历在目,转瞬间,量子判别分析的学习任务却“接踵而来”,正所谓趁热打铁,在原有的LDA基础上深入了解基于量子计算的QLDA是如何加速算法,相对来说也会更为“简单”。
一 . 前情回顾
前一期博客中,我们从感性分析到理性推导,从图像理解到代码实现,非常详细的介绍了线性判别分析的前因后果,在正式进入量子判别分析算法的学习之前,温故而知新:
LDA考虑的问题是: 对于一个多类别的分类问题,把输入数据的特征空间从高维映射到低维空间中,从而达到降维的目的。为了能够服务于后续的分类任务,LDA希望能够尽可能的保留类判别信息,即希望在原始高维空间中属于一类的数据在低维空间中也属于一类;原始高维空间中属于不同类别的数据在低维空间中也属于不同的类别。上述要求可以通过数据间的“距离”来衡量,即希望类别内的数据点“离的很近”,类别之间“离的很远”,这样两个类别就会越好区分.
具体的推导过程,我们这里也给出了图片:
其中,整个算法的核心就是求出类内散度矩阵和类间散度矩阵,并分别最小化和最大化这二者,之后扫尾工作只需要线性代数的基本水平即可;
二 . QLDA 步骤
与前面介绍的量子算法相同,例如Grover算法,HHL算法,量子LDA的目标是为了加速经典LDA算法。与经典LDA算法相比,量子LDA在训练向量个数M和特征空间维度N上达到了指数级加速效果,极大的减小了计算难度和空间利用率。
本算法的主要过程大致分四步,前期数据处理和均值等基本属性的计算还是基于传统计算机算法,这里我也是在论文中总结而来,有可能不是非常恰当:
- 利用量子寄存器和 O r a c l e s Oracles Oracles 算子,记录数据并构建类间散度矩阵 S B S_{B} SB 和类间散度矩阵 S w S_{w} Sw 。
- 将原始特征方程求解问题转换一下,为后期利用相位估计算法求特征值和特征向量做铺垫,所以构建 S B 1 / 2 S W − 1 S B 1 / 2 S_{B}^{1 / 2} S_{W}^{-1} S_{B}^{1 / 2} SB1/2SW−1SB1/2。
- 利用 S B 1 / 2 S W − 1 S B 1 / 2 S_{B}^{1 / 2} S_{W}^{-1} S_{B}^{1 / 2} SB1/2SW−1SB1/2 取幂,执行相位估计算法以获取前 p p p 个较为重要的特征值和特征向量。
- 计算 w r = S B − 1 / 2 v r w_{r}=S_{B}^{-1 / 2} v_{r} wr=SB−1/2vr。
1. 构建相关矩阵
第一步,我们需要处理数据,新建一种利于量子计算的新型数据存储形式,根据前面的介绍,第一个关键点就是寻找并确定类内矩阵和类间矩阵,这里想强调的是,传统的机器学习算法和其对应的量子机器学学习算法不同的地方就在于优化和提速,本质上数学原理还是共同的,所以传统的LDA有的步骤,在量子判别分析里面是一个也不能少。
本着执果索因的法子,我们先列出目标矩阵:
S
w
=
∑
c
=
1
k
(
x
−
μ
c
)
(
x
−
μ
c
)
T
S
B
=
∑
c
=
1
k
(
μ
c
−
x
‾
)
(
μ
c
−
x
‾
)
T
S_{w}=\sum_{c=1}^{k}(x-\mu_{c})(x-\mu _{c})^{T}\\ S_{B}=\sum_{c=1}^{k}(\mu_{c}-\overline{x})(\mu_{c}-\overline{x})^{T}
Sw=c=1∑k(x−μc)(x−μc)TSB=c=1∑k(μc−x)(μc−x)T
世界起源于假设,所以假设有 M M M个输入数据向量,且每个数据向量有 k k k个类,其中每个类中数据均值用 μ c \mu_{c} μc 来表示,而所有数据向量的均值用 x ‾ \overline{x} x 表示。
曾记否,在 G r o v e r Grover Grover算法中,灵魂算子 O O O将索引目标和其他指标区别开,这里很巧,也用到了大 O O O算子,但此 O O O非彼 O O O,这里借助量子寄存器 R A M RAM RAM和 O O O算子来存储原始数据。
根据类内矩阵和类间矩阵的表达方式,这里需要存储的数据为
d
c
=
x
j
−
μ
c
j
D
c
=
μ
c
−
x
ˉ
d_{c}=x_{j}-\mu_{c_{j}}\\ D_{c}=\mu_{c}-\bar{x}
dc=xj−μcjDc=μc−xˉ
接下来就是将他们放在
R
A
M
RAM
RAM中,即通过
O
r
a
c
l
e
s
Oracles
Oracles算子:
具体是啥样的呢?我特地画了一张图解释:
基于上述假设,我们可以构建二者的密度矩阵:
∣
ψ
1
⟩
=
O
2
(
1
k
∑
c
=
1
k
∣
c
⟩
∣
0
⟩
∣
0
⟩
)
=
1
k
∑
c
=
1
k
∣
c
⟩
∣
∥
μ
c
−
x
ˉ
∥
⟩
∣
μ
c
−
x
ˉ
⟩
∣
Φ
1
⟩
=
O
1
(
1
M
∑
j
=
1
M
∣
j
⟩
∣
0
⟩
∣
0
⟩
∣
0
⟩
)
=
1
M
∑
j
=
1
M
∣
j
⟩
∣
∥
x
j
−
μ
c
j
∥
⟩
∣
x
j
−
μ
c
j
⟩
∣
c
j
⟩
\begin{array}{c} \left|\psi_{1}\right\rangle=O_{2}\left(\frac{1}{\sqrt{k}} \sum_{c=1}^{k}|c\rangle|0\rangle|0\rangle\right)=\frac{1}{\sqrt{k}} \sum_{c=1}^{k}|c\rangle\left|\left\|\mu_{c}-\bar{x}\right\|\right\rangle\left|\mu_{c}-\bar{x}\right\rangle \\ \left|\Phi_{1}\right\rangle=O_{1}\left(\frac{1}{\sqrt{M}} \sum_{j=1}^{M}|j\rangle|0\rangle|0\rangle|0\rangle\right)=\frac{1}{\sqrt{M}} \sum_{j=1}^{M}|j\rangle\left|\left\|x_{j}-\mu_{c_{j}}\right\|\right\rangle\left|x_{j}-\mu_{c_{j}}\right\rangle\left|c_{j}\right\rangle \end{array}
∣ψ1⟩=O2(k1∑c=1k∣c⟩∣0⟩∣0⟩)=k1∑c=1k∣c⟩∣∥μc−xˉ∥⟩∣μc−xˉ⟩∣Φ1⟩=O1(M1∑j=1M∣j⟩∣0⟩∣0⟩∣0⟩)=M1∑j=1M∣j⟩∣∣∥∥xj−μcj∥∥⟩∣∣xj−μcj⟩∣cj⟩
其实这一步可以理解为对多个相同维度,数据不同的已初始化好的量子寄存器进行求和而已,其中的 k k k代表类别个数, M M M代表一个类中数据个数。
接下来再将上述公式中的基态提取概率幅:
其中这里的
A
=
∑
c
=
1
k
∥
μ
c
−
x
ˉ
∥
2
,
B
=
∑
j
=
1
M
∥
x
j
−
μ
c
j
∥
2
A=\sum_{c=1}^{k}\left\|\mu_{c}-\bar{x}\right\|^{2}, B=\sum_{j=1}^{M}\left\|x_{j}-\mu_{c_{j}}\right\|^{2}
A=∑c=1k∥μc−xˉ∥2,B=∑j=1M∥∥xj−μcj∥∥2
下面就是最重要的一步,通过对密度矩阵求偏迹得到我们想要的散度矩阵,但在这之前,而我们简单理解一下偏迹运算的原理:
它的主要作用就是“复合”和“分离”,假设最简单的两个量子态如下:
是不是非常的清晰明了?再回到刚才的话题,上述两个态构成的密度矩阵执行偏迹运算之后的得到:
S
B
=
1
A
∑
c
=
1
k
∥
μ
c
−
x
ˉ
∥
2
∣
μ
c
−
x
ˉ
⟩
⟨
μ
c
−
x
ˉ
∣
S
W
=
1
B
∑
c
=
1
k
∑
i
∈
c
∥
x
i
−
μ
c
∥
2
∣
x
i
−
μ
c
⟩
⟨
x
i
−
μ
c
∣
S_{B}=\frac{1}{A} \sum_{c=1}^{k}\left\|\mu_{c}-\bar{x}\right\|^{2}\left|\mu_{c}-\bar{x}\right\rangle\left\langle\mu_{c}-\bar{x}\right| \\ S_{W}=\frac{1}{B} \sum_{c=1}^{k} \sum_{i \in c}\left\|x_{i}-\mu_{c}\right\|^{2}\left|x_{i}-\mu_{c}\right\rangle\left\langle x_{i}-\mu_{c}\right|
SB=A1c=1∑k∥μc−xˉ∥2∣μc−xˉ⟩⟨μc−xˉ∣SW=B1c=1∑ki∈c∑∥xi−μc∥2∣xi−μc⟩⟨xi−μc∣
构造矩阵就算是大功告成了,我们可以简单总结一下它是如何得到这两个目标散度矩阵的:首先假设数据存储在QRAM中,通过 ) O r a c l e )Oracle )Oracle能够获取 Q R A M QRAM QRAM中的值存到相应的量子态中;然后提取我们量子态中我们需要的数据至相应的概率幅中;最后执行偏迹运算便可得到最终的 S B S_{B} SB 和 S W S_{W} SW。
2. 化简与特征方程求解
在得到我们想要的类内矩阵和类间散度矩阵之后,正所谓不忘初心,回到问题最开始的地方,我们想求的是啥?是一个方向,一个能够使得样本点在类内间距最小,类间间距最大的一个方向,方向怎么求?线性代数告诉我们使用特征方程可以求得向量的方向!所以,此时的症结应当是特征方程的求解!
由于这个数据量的巨大,用一般的方法去求解一个高阶数的特征方程不会特别的高校,这个时候,前面抓耳挠腮铺垫的相位估计算法就起到了大作用。
熟悉量子相位估计算法的小伙伴就会知道,它也叫作量子特征值估计算法,对于给定的一个 U U U 矩阵和量子态 ∣ ψ ⟩ |\psi\rangle ∣ψ⟩,量子力学基础告诉我们 U U U矩阵的特征值为 e 2 π i θ e^{2 \pi i \theta} e2πiθ,即 U ∣ ψ ⟩ = e 2 π i θ ∣ ψ ⟩ U|\psi\rangle=e^{2 \pi i \theta}|\psi\rangle U∣ψ⟩=e2πiθ∣ψ⟩,这里的 θ \theta θ就是我们的相位,知道了相位,也就知道了特征值,就知道了特征向量。。。就没了。
在这之前,我们需要对原始问题进行转化:
这里千万别懵,前面的式子只是我们传统LDA的结果之一,这里只是用了线代的办法把它变成
H
e
r
m
i
t
i
a
n
Hermitian
Hermitian矩阵,满足相位估计的输入算法的需求:即构建密度矩阵
S
B
1
/
2
S
W
−
1
S
B
1
/
2
S_{B}^{1/2}S_{W}^{-1}S_{B}^{1/2}
SB1/2SW−1SB1/2,但是更一般的情况下,不止两个矩阵,可能换元就不是特别的方便了,所以作者又提供了一种更一般的求解方法,这也是论文作者的创新之处了,他利用了一种叫Hermitian chain product的算法来实现该矩阵的构造!
它的主要表达形式如下:
[
f
k
(
A
k
)
⋯
f
1
(
A
1
)
]
[
f
k
(
A
k
)
⋯
f
1
(
A
1
)
]
†
\left[f_{k}\left(A_{k}\right) \cdots f_{1}\left({A}_{1}\right)\right]\left[f_{k}\left(A_{k}\right) \cdots f_{1}\left(A_{1}\right)\right]^{\dagger}
[fk(Ak)⋯f1(A1)][fk(Ak)⋯f1(A1)]†
这里的 A 1 , … A k A_{1}, \ldots A_{k} A1,…Ak是已经归一化的半正定厄米矩阵,函数 f 1 , … f k f_{1}, \ldots f_{k} f1,…fk 是用收敛的泰勒级数表示的,除此之外,还需设定 { λ j l } l = 1 N \left\{\lambda_{j l}\right\}_{l=1}^{N} {λjl}l=1N 为矩阵 A j A_{j} Aj 的特征值,那么上述公式的计算时间复杂度在:
O ( X ϵ 3 ⋅ ∑ j = 1 k κ j 2 ⋅ ( max l ∣ f 1 ( λ 1 l ) ∣ min l ∣ f 1 ( λ 1 l ) ∣ ) ∏ j = 2 k ( max l ∣ f j ( λ j l ) ∣ min l ∣ f j ( λ j l ) ∣ ) 2 ) O\left(\frac{X}{\epsilon^{3}} \cdot \sum_{j=1}^{k} \kappa_{j}^{2} \cdot\left(\frac{\max _{l}\left|f_{1}\left(\lambda_{1 l}\right)\right|}{\min _{l}\left|f_{1}\left(\lambda_{1 l}\right)\right|}\right) \prod_{j=2}^{k}\left(\frac{\max _{l}\left|f_{j}\left(\lambda_{j l}\right)\right|}{\min _{l}\left|f_{j}\left(\lambda_{j l}\right)\right|}\right)^{2}\right) O(ϵ3X⋅j=1∑kκj2⋅(minl∣f1(λ1l)∣maxl∣f1(λ1l)∣)j=2∏k(minl∣fj(λjl)∣maxl∣fj(λjl)∣)2)
其中 O ( X ) O(X) O(X) 代表构造一个符合条件矩阵的时间复杂度, κ j 2 \kappa_{j}^{2} κj2 是矩阵 A j A_{j} Aj 的最大特征值与其最小特征值的比值。
从这里我们可以得到,此步骤与传统LDA构造矩阵相比为 Q L D A QLDA QLDA提供了指数加速的效果!
那么基于这里理论,为了构造矩阵 S B 1 / 2 S W − 1 S B 1 / 2 S_{B}^{1/2}S_{W}^{-1}S_{B}^{1/2} SB1/2SW−1SB1/2,只需令 A 1 = S W , A 2 = S B , f 1 ( X ) = X − 1 / 2 , f 2 ( X ) = X 1 / 2 A_{1}=S_{W}, A_{2}=S_{B}, f_{1}(X)=X^{-1 / 2}, f_{2}(X)=X^{1 / 2} A1=SW,A2=SB,f1(X)=X−1/2,f2(X)=X1/2
再代入上面的链积公式即可!
3. 收尾
接下来的主要收尾工作就是寻找到主特征向量,它需要先对 S B 1 / 2 S W − 1 S B 1 / 2 S_{B}^{1/2}S_{W}^{-1}S_{B}^{1/2} SB1/2SW−1SB1/2矩阵进行取幂操作,为了避免矩阵的极小特征值所消耗的时空资源,采用预先定义的条件数进行约束,即假设一个有效的条件数 κ e f f \kappa_{\mathrm{eff}} κeff,使得在 [ 1 / κ e f f , 1 ] \left[1 / \kappa_{\mathrm{eff}}, 1\right] [1/κeff,1]之内的特征值才被我们采用。
通过QPCA中的取幂运算和相位估计,这一步可以得到:
借此得到前
p
p
p个特征值对应的特征向量
v
r
v_{r}
vr.
再令 A 1 = v r , A 2 = S B , f 1 ( X ) = X , f 2 ( X ) = X − 1 / 2 A_{1}=v_{r}, A_{2}=S_{B}, f_{1}(X)=X, f_{2}(X)=X^{-1 / 2} A1=vr,A2=SB,f1(X)=X,f2(X)=X−1/2,代入公式 [ f k ( A k ) ⋯ f 1 ( A 1 ) ] [ f k ( A k ) ⋯ f 1 ( A 1 ) ] † \left[f_{k}\left(A_{k}\right) \cdots f_{1}\left({A}_{1}\right)\right]\left[f_{k}\left(A_{k}\right) \cdots f_{1}\left(A_{1}\right)\right]^{\dagger} [fk(Ak)⋯f1(A1)][fk(Ak)⋯f1(A1)]†可以得到QLDA降维算法的目标映射矩阵 w r = S B − 1 / 2 v r w_{r}=S_{B}^{-1 / 2} v_{r} wr=SB−1/2vr。也就自然确定了我们投影的方向了!
本期的博客学习就到这里,后期如果有代码的话也会积极的为大家献上!