第十一讲:独立成分分析(Independent Components Analysis )

第十一讲:独立成分分析(Independent Components Analysis )接下来我们要讲的主体是独立成分分析(IndependentComponentsAnalysis,缩写为ICA)。这个方法和主成分分析(PCA)类似,也是要找到一组新的基向量(basis)来表征(represent)样本数据。然而,这两个方法的目的是截然不同的。还是先用“鸡尾酒会问题(cocktailpartyproblem)”为例。在一个聚会场合中,有n个人同时说话,而屋子里的任意…

大家好,又见面了,我是你们的朋友全栈君。

接下来我们要讲的主体是独立成分分析(Independent Components Analysis,缩写为 ICA)。这个方法和主成分分析(PCA)类似,也是要找到一组新的基向量(basis)来表征(represent)样本数据。然而,这两个方法的目的是截然不同的。

还是先用“鸡尾酒会问题(cocktail party problem)”为例。在一个聚会场合中,有 n 个人同时说话,而屋子里的任意一个话筒录制到底都只是叠加在一起的这 n 个人的声音。但如果假设我们也有 n 个不同的话筒安装在屋子里,并且这些话筒与每个说话人的距离都各自不同,那么录下来的也就是不同的组合形式的所有人的声音叠加。使用这样布置的 n 个话筒来录音,能不能区分开原始的 n 个说话者每个人的声音信号呢?

把这个问题用方程的形式来表示,我们需要先假设有某个样本数据 s ∈ R n s ∈ R^n sRn,这个数据是由 n 个独立的来源(independent sources)生成的。我们观察到的则为:
x = A s , x = As, x=As,

上面式子中的 A 是一个未知的正方形矩阵(square matrix),叫做混合矩阵(mixing matrix)。通过重复的观察,我们就得到了训练集 { x ( i ) ; i = 1 , . . . , m } \{x^{(i)} ; i = 1, . . . , m\} {
x(i);i=
1,...,m}
,然后我们的目的是恢复出生成这些样本 x ( i ) = A s ( i ) x^{(i)} = As^{(i)} x(i)=As(i) 的原始声音源 s ( i ) s^{(i)} s(i)

在咱们的“鸡尾酒会问题”中, s ( i ) s^{(i)} s(i) 就是一个 n 维度向量,而 s j ( i ) s_j^{(i)} sj(i) 是第 j j j 个说话者在第 i i i 次录音时候发出的声音。 x ( i ) x^{(i)} x(i) 同样也是一个 n n n 维度向量,而 s j ( i ) s_j^{(i)} sj(i)是第 j j j 个话筒在第 i i i 次录制到的声音。

设混合矩阵 A A A 的逆矩阵 W = A − 1 W = A^{−1} W=A1是混合的逆向过程,称之为还原矩阵(unmixing matrix)。那么咱们的目标就是找出这个 W W W,这样针对给定的话筒录音 x ( i ) x^{(i)} x(i),我们就可以通过计算 s ( i ) = W x ( i ) s^{(i)} = Wx^{(i)} s(i)=Wx(i) 来还原出来声音源。为了方便起见,我们就用 w i T w_i^T wiT 来表示 W W W 的第 i i i 行,这样就有:

W = [ − w 1 T − ⋮ − w n T − ] . \begin{aligned} W=\begin{bmatrix} -w_1^T-\\\vdots\\-w_n^T-\end{bmatrix}. \end{aligned} W=w1TwnT.

这样就有 w i ∈ R n w_i ∈ R^n wiRn,通过计算 s ( i ) = w j T x ( i ) s^{(i)} = w_ j^T x^{ ( i )} s(i)=wjTx(i) 就可以恢复出第 j j j 个声源了。

1 独立成分分析(ICA)的模糊性(ambiguities)

W = A − 1 W = A^{−1} W=A1 能恢复到怎样的程度呢?如果我们对声源和混合矩阵都有预先的了解(prior knowledge),那就不难看出,混合矩阵 A 当中存在的某些固有的模糊性,仅仅给定了 x ( i ) x^{(i)} x(i) 可能无法恢复出来。

例如,设 P P P 是一个 n × n n×n n×n 的置换矩阵(permutation matrix)。这就意味着矩阵 P P P 的每一行和每一列都只有一个 1。下面就是几个置换矩阵的样例:

P = [ 0 1 0 1 0 0 0 0 1 ] ; P = [ 0 1 1 0 ] ; P = [ 1 0 0 1 ] \begin{aligned} P=\begin{bmatrix}0&1&0\\1&0&0\\0&0&1 \end{bmatrix}; P=\begin{bmatrix}0&1\\1&0 \end{bmatrix}; P=\begin{bmatrix}1&0\\0&1 \end{bmatrix} \end{aligned} P=010100001;P=[0110];P=[1001]

如果 z z z 是一个向量,那么 P z P_z Pz 就是另外一个向量,这个向量包含了 z z z 坐标的置换版本(permuted version)。如果只给出 x ( i ) x^{(i)} x(i),是没有办法区分出 W W W P W PW PW 的。具体来说,原始声源的排列(permutation)是模糊的(ambiguous),这一点也不奇怪。好在大多数情况下,这个问题都并不重要。

进一步来说,就是没有什么办法能恢复出 w i w_i wi 的正确的缩放规模。例如,如果把 A A A 替换成了 2 A 2A 2A,那么每个 s ( i ) s^{(i)} s(i) 都替换成了 ( 0.5 ) s ( i ) (0.5)s^{(i)} (0.5)s(i),那么观测到的 x ( i ) = 2 A ⋅ ( 0.5 ) s ( i ) x(i) = 2A · (0.5)s^{(i)} x(i)=2A(0.5)s(i) 还是跟原来一样的。再进一步说,如果 A 当中的某一列,都用一个参数 α α α 来进行缩放,那么对应的音源就被缩放到了 1 / α 1/α 1/α,这也表明,仅仅给出 x ( i ) x^{(i)} x(i),是没办法判断这种情况是否发生的。因此,我们并不能还原出音源的“正确”缩放规模。然而,在我们应用的场景中,例如本文提到的这个“鸡尾酒会问题”中,这种不确定性并没有关系。具体来说,对于一个说话者的声音信号 s ( i ) s^{(i)} s(i) 的缩放参数 α α α 只影响说话者声音的大小而已。另外,符号变换也没有影响,因为 s j ( i ) s_j^{(i)} sj(i) − s j ( i ) −s_j^{(i)} sj(i) 都表示了扬声器中同样的声音大小。所以,如果算法找到的 w i w_i wi 被乘以任意一个非零数进行了缩放,那么对应的恢复出来的音源 s i = w i T x s_i = w_i^T x si=wiTx 也进行了同样的缩放;这通常都不要紧。(这些考量也适用于课堂上讨论的对 Brain/MEG 数据使用的 ICA 算法。)

上面这些是 ICA 算法模糊性的唯一来源么?还真是这样,只要声源 s i s_i si 是非高斯分布(non-Gaussian)的即可。如果是高斯分布的数据(Gaussian data),例如一个样本中, n = 2 n = 2 n=2, 而 s ∼ N ( 0 , I ) s ∼ N(0,I) sN(0,I) 。(译者注:即 s s s 是一个以 0 和 I I I 为参数的正态分布,正态分布属于高斯分布。)其中的 I I I 是一个 2 × 2 2×2 2×2 的单位矩阵(identity matrix)。要注意,这是一个标准正态分布,其密度(density)轮廓图(contour)是以圆点为中心的圆,其密度是旋转对称的(rotationally symmetric)。

接下来,假如我们观测到了某个 x = A s x = As x=As,其中的 A A A 就是混合矩阵(mixing matrix)。这样得到的 x x x 也是一个高斯分布的,均值为 0,协方差 E [ x x T ] = E [ A s s T A T ] = A A T E[xx^T ] = E[Ass^T A^T ] = AA^T E[xxT]=E[AssTAT]=AAT。 然后设 R 为任意的正交矩阵(不太正式地说,也可以说成是旋转(rotation)矩阵或者是反射(reflection)矩阵),这样则有 R R T = R T R = I RR^T = R^TR = I RRT=RTR=I,然后设 A ′ = A R A'= AR A=AR。如果使用 A ′ A' A 而不是 A A A 作为混合矩阵,那么观测到的数据就应该是 x ′ = A ′ s x'= A's x=As。这个 x ′ x' x 也还是个高斯分布,依然是均值为 0,协方差为 E [ x ′ ( x ′ ) T ] = E [ A ′ s s T ( A ′ ) T ] = E [ A R s s T ( A R ) T ] = A R R T A T = A A T E[x'(x')T ] = E[A′ss^T (A')^T ] = E[ARss^T (AR)^T ] = ARR^T A^T = AA^T E[x(x)T]=E[AssT(A)T]=E[ARssT(AR)T]=ARRTAT=AAT。看到没,无论混合矩阵使用 A A A 还是 A ′ A' A ,得到的数据都是一个正态分布 N ( 0 , A A T ) N (0, AA^T ) N(0,AAT),以 0 为均值,协方差为 A A T AA^T AAT。这样就根本不能区分出来混合矩阵使用的是 A 还是 A′。所以,只要混合矩阵中有一个任意的旋转分量(arbitrary rotational component),并且不能从数据中获得,那么就不能恢复出原始数据源了。

上面这些论证,是基于多元标准正态分布(multivariate standard normal distribution)是旋转对称(rotationally symmetric)的这个定理。这些情况使得 ICA 面对高斯分布的数据(Gaussian data)的时候很无力,但是只要数据不是高斯分布的,然后再有充足的数据,那就还是能恢复出 n 个独立的声源的。

2 密度(Densities)和线性变换(linear transformations)

在继续去推导 ICA 算法之前,我们先来简要讲一讲对密度函数进行线性变换的效果(effect)。

假如我们有某个随机变量 s s s,可以根据某个密度函数 p s ( s ) p_s(s) ps(s) 来绘制。简单起见,咱们现在就把 s s s 当做是一个实数,即 s ∈ R s ∈ R sR。然后设 x x x 为某个随机变量,定义方式为 x = A s x = As x=As (其中 x ∈ R , A ∈ R x ∈ R, A ∈ R xR,AR)。然后设 p x p_x px x x x 的密度函数。那么这个 p x p_x px 是多少呢?

W = A − 1 W = A^{−1} W=A1。要计算 x x x 取某一个特定值的“概率(probability)”,可以先计算对于 s = W x s = Wx s=Wx,在这一点上的 p s p_s ps,然后推导出“ p x ( x ) = p s ( W x ) p_x(x) = p_s(Wx) px(x)=ps(Wx)”。然而,这是错误的。例如,假设 s ∼ U n i f o r m [ 0 , 1 ] s ∼ Uniform[0, 1] sUniform[0,1],即其密度函数 p s ( s ) = 1 { 0 ≤ s ≤ 1 } p_s(s) = 1\{0 ≤ s ≤ 1\} ps(s)=1{
0
s1}
。然后设 A = 2 A = 2 A=2,这样 x = 2 s x = 2s x=2s。很明显, x x x 在 [0,2] 这个区间均匀分布(distributed uniformly)。所以其密度函数也就是 p x ( x ) = ( 0.5 ) 1 { 0 ≤ x ≤ 2 } p_x(x) = (0.5)1\{0 ≤ x ≤ 2\} px(x)=(0.5)1{
0
x2}
。这并不等于 p s ( W x ) p_s (W x) ps(Wx),其中的 W = 0.5 = A − 1 W = 0.5 = A^{−1} W=0.5=A1。所以正确的推导公式应该是 p x ( x ) = p s ( W x ) ∣ W ∣ p_x(x) = p_s(W x)|W | px(x)=ps(Wx)W

推广一下,若 s s s 是一个向量值的分布,密度函数为 p s p_s ps,而 x = A s x = As x=As,其中的 A A A 是一个可逆的正方形矩阵,那么 x x x 的密度函数则为:

p x ( x ) = p s ( W x ) ⋅ ∣ W ∣ , \begin{aligned} p_x(x)=p_s(Wx)\cdot|W|, \end{aligned} px(x)=ps(Wx)W,

上式中 W = A − 1 W = A^{−1} W=A1.

备注:可能你已经看到了用 A A A 映射 [ 0 , 1 ] n [0, 1]^n [0,1]n 得到的就是一个由 volume ∣ A ∣ |A| A 组成的集合(译者注:这里的 volume 我不确定该怎么翻译),然后就又有了一个办法可以记住上面给出的关于 p x p_x px 的公式了,这也是对之前讨论过的 1 维样例的一个泛化扩展。具体来说,设给定了 A ∈ R n × n A ∈ R^{n×n} ARn×n,然后还按照惯例设 W = A − 1 W = A^{−1} W=A1。接着设 C 1 = [ 0 , 1 ] n C_1 = [0, 1]^n C1=[0,1]n 是一个 n n n 维度超立方体,然后设 C 2 = { A s : s ∈ C 1 } ⊆ R n C_2 =\{As:s∈C_1\}⊆R^n C2={
As:
sC1}Rn
为由 A A A 给定的映射下的 C 1 C_1 C1 的投影图像。这就是线性代数里面,用 ∣ A ∣ |A| A 来表示 C 2 C_2 C2 的体积的标准结果,另外也是定义行列式(determinants)的一种方式。接下来,设 s s s [ 0 , 1 ] n [0, 1]^n [0,1]n 上均匀分布(uniformly distributed),这样其密度函数为 p s ( s ) = 1 s ∈ C 1 。 然 后 很 明 显 , p_s(s) = 1{s ∈ C_1}。然后很明显, ps(s)=1sC1x$ 也是在 C 2 C_2 C2 内均匀分布(uniformly distributed)。因此可以知道其密度函数为 p x ( x ) = 1 { x ∈ C 2 } / v o l ( C 2 ) p_x(x) = 1\{x ∈ C_2\}/vol(C_2) px(x)=1{
x
C2}/vol(C2)
,必须在整个 C 2 C_2 C2 累积为1(integrate to 1,这是概率的性质)。但利用逆矩阵的行列式等于行列式的倒数这个定理,就有了 1 / v o l ( C 2 ) = 1 / ∣ A ∣ = ∣ A − 1 ∣ = ∣ W ∣ 1/vol(C_2) = 1/|A| = |A^{−1}| = |W| 1/vol(C2)=1/A=A1=W。所以则有 p x ( x ) = 1 { x ∈ C 2 } ∣ W ∣ = 1 { W x ∈ C 1 } ∣ W ∣ = p s ( W x ) ∣ W ∣ p_x(x) = 1\{x ∈ C_2\}|W| = 1\{Wx ∈ C_1\}|W | = p_s(W x)|W | px(x)=1{
x
C2}W=1{
Wx
C1}W=ps(Wx)W

3 独立成分分析算法(ICA algorithm)

现在就可以推导 ICA 算法了。我们这里描述的算法来自于 Bell 和 Sejnowski,然后我们对算法的解释也是基于他们的算法,作为一种最大似然估计(maximum likelihood estimation)的方法。(这和他们最初的解释不一样,那个解释里面要涉及到一个叫做最大信息原则(infomax principal) 的复杂概念,考虑到对 ICA 的现代理解,推导过程已经不需要那么复杂了。)

我们假设每个声源的分布 s i s_i si 都是通过密度函数 p s p_s ps 给出,然后联合分布 s s s 则为:

p ( s ) = ∏ i = 1 n p s ( s i ) . \begin{aligned} p(s)=\prod_{i=1}^n p_s(s_i). \end{aligned} p(s)=i=1nps(si).

这里要注意,通过在建模中将联合分布(joint distribution)拆解为边界分布(marginal)的乘积(product),就能得出每个声源都是独立的假设(assumption)。利用上一节推导的公式,这就表明对 x = A s = W − 1 s x = As = W^{−1}s x=As=W1s 的密度函数为:

p ( x ) = ∏ i = 1 n p s ( w i T x ) ⋅ ∣ W ∣ . \begin{aligned} p(x)=\prod_{i=1}^n p_s(w_i^Tx)\cdot|W|. \end{aligned} p(x)=i=1nps(wiTx)W.

剩下的就只需要去确定每个独立的声源的密度函数 p s p_s ps 了。

回忆一下,给定某个实数值的随机变量 z z z,其累积分布函数(cumulative distribution function,cdf) F F F 的定义为: F ( z 0 ) = P ( z ≤ z 0 ) = ∫ − ∞ z 0 p z ( z ) d z . F(z_0)=P(z\leq z_0)=\int_{-\infty}^{z_0}p_z(z)dz. F(z0)=P(zz0)=z0pz(z)dz. 然后,对这个累积分布函数求导数,就能得到 z z z 的密度函数: p z ( z ) = F ′ ( z ) p_z(z) = F'(z) pz(z)=F(z)

因此,要确定 s i s_i si 的密度函数,首先要做的就是确定其累积分布函数(cdf)。这个 cdf 函数必然是一个从 0 到 1 的单调递增函数。根据我们之前的讨论,这里不能选用高斯分布的 cdf,因为 ICA 不适用于高斯分布的数据。所以这里我们选择一个能够保证从 0 增长到 1 的合理的“默认(default)” 函数就可以了,比如 s s s 形函数(sigmoid function) g ( s ) = 1 / ( 1 + e − s ) g(s) = 1/(1 + e^{−s}) g(s)=1/(1+es)。这样就有, p s ( s ) = g ′ ( s ) p_s(s) = g'(s) ps(s)=g(s)1

W W W 是一个正方形矩阵,是模型中的参数。给定一个训练集合 { x ( i ) ; i = 1 , . . . , m } \{x^{(i)};i = 1,…,m\} {
x(i);i=
1,...,m}
,然后对数似然函数(log likelihood)则为:

ℓ ( W ) = ∑ i = 1 m ( ∑ j = 1 n log ⁡ g ′ ( w j T x ( i ) ) + log ⁡ ∣ W ∣ ) \begin{aligned} \ell(W)=\sum_{i=1}^m \left(\sum_{j=1}^n\log g'(w_j^Tx^{(i)})+\log |W|\right) \end{aligned} (W)=i=1m(j=1nlogg(wjTx(i))+logW)

我们要做的就是上面这个函数找出关于 W W W 的最大值。通过求导,然后利用前面讲义中给出的定理 ∇ W ∣ W ∣ = ∣ W ∣ ( W − 1 ) T ∇_W|W| = |W|(W^{−1})^T WW=W(W1)T,就可以很容易推导出随机梯度上升(stochastic gradient ascent)学习规则(learning rule)。对于一个给定的训练样本 x ( i ) x^{(i)} x(i),这个更新规则为:

W : = W + α ( [ 1 − 2 g ( w 1 T x ( i ) ) 1 − 2 g ( w 2 T x ( i ) ) ⋮ 1 − 2 g ( w n T x ( i ) ) ] x ( i ) T + ( W T ) − 1 ) , \begin{aligned} W:=W+\alpha\left(\begin{bmatrix} 1-2g(w_1^Tx^{(i)})\\1-2g(w_2^Tx^{(i)})\\\vdots\\1-2g(w_n^Tx^{(i)})\end{bmatrix}{x^{(i)}}^T+(W^T)^{-1}\right), \end{aligned} W:=W+α12g(w1Tx(i))12g(w2Tx(i))12g(wnTx(i))x(i)T+(WT)1,

上式中的 α α α 是学习速率(learning rate)。在算法收敛(converges)之后,就能计算出 s ( i ) = W x ( i ) s^{(i)} = Wx^{(i)} s(i)=Wx(i),这样就能恢复出原始的音源了。

备注:在写下数据的似然函数的时候,我们隐含地假设了这些 x ( i ) x^{(i)} x(i) 都是彼此独立的(这里指的是对于不同的 i i i 值来说彼此独立;注意这个问题并不是说 x ( i ) x^{(i)} x(i) 的不同坐标是独立的),这样对训练集的似然函数则为 ∏ i p ( x ( i ) ; W ) \prod_ip(x^{(i)};W) ip(x(i);W)。很显然,对于语音数据和其他 x ( i ) x^{(i)} x(i) 有相关性的时间序列数据来说,这个假设是不对的,但是这可以用来表明,只要有充足的数据,那么有相关性的训练样本并不会影响算法的性能。但是,对于成功训练的样本具有相关性的问题,如果我们把训练样本当做一个随机序列来进行访问,使用随机梯度上升(stochastic gradient ascent)的时候,有时候也能帮助加速收敛。(也就是说,在训练集的一个随机打乱的副本中运行随机梯度上升。)


  1. 如果你对声源的密度函数的形式有了事先的了解,那么在这个位置替换过来就是个很好的办法。不过如果没有这种了解,就可以用 s s s 形函数(sigmoid function),可以把这个函数当做是一个比较合理的默认函数,在很多问题中,这个函数用起来效果都不错。另外这里讲述的是假设要么所有的数据 x ( i ) x^{(i)} x(i) 已经被证明均值为 0,或者可以自然预期具有 0 均值,比如声音信号就是如此。这很有必要,因为我们的假设 p s ( s ) = g ′ ( s ) p_s(s) = g'(s) ps(s)=g(s) 就意味着期望 E [ s ] = 0 E[s] = 0 E[s]=0(这个逻辑函数(logistic function)的导数是一个对称函数,因此给出的就是均值为 0 的随机变量对应的密度函数),这也意味着 E [ x ] = E [ A s ] = 0 E[x] = E[As] = 0 E[x]=E[As]=0↩︎

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/145675.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • jquery unbind_java主函数

    jquery unbind_java主函数PHPuniqid()函数uniqid()函数基于以微秒计的当前时间,生成一个唯一的ID。PHPPHPuniqid()函数uniqid()函数基于以微秒计的当前时间,生成一个唯一的ID。注释:由于基于系统时间,通过该函数生成的ID不是最佳的。如需生成绝对唯一的ID,请使用md5()函数(请在字符串函数参考中查找)。echouniqid();?>本例产生32个字符的独…

    2022年10月23日
  • 排序算法汇总总结

    排序算法汇总总结

  • Spring Batch 之 Hello World教程

    Spring Batch 之 Hello World教程SpringBatch之HelloWorld教程本文我们基于springboot和springbatch实现一个简单helloworld入门批处理程序。如果你刚刚接触springbatch,这篇教程会让你花最短时间理解springbatch框架。SpringBatch框架介绍开始代码之前,我们先了解框架中的核心组件,见下图:批处理过程有Job组成,job是封装整…

  • gltranslatef函数_sql translate函数怎么用

    gltranslatef函数_sql translate函数怎么用TranslateMessage(&msg);TranslateMessage是用来把快捷键消息转换为字符消息,并将转换后的新消息投递到调用线程的消息队列中。由于Windows对所有键盘编码都是采用虚拟键的定义,这样当按键按下时,并不得字符消息,需要键盘映射转换为字符的消息。字符消息被投递到调用线程的消息队列中,当下一次调用GetMessage函数时被取出。当我们敲击键盘上的某个字符键时,…

  • 分享测试自动化的19个教训

    分享测试自动化的19个教训

  • Log4j配置详解「建议收藏」

    Log4j配置详解「建议收藏」来自: http://www.blogjava.net/zJun/archive/2006/06/28/55511.htmlLog4J的配置文件(ConfigurationFile)就是用来设置记录器的级别、存放器和布局的,它可接key=value格式的设置或xml格式的设置信息。通过配置,可以创建出Log4J的运行环境。1.配置文件Log4J配置文件的基本格式如下:

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号