一 SVD的数学模型
设有样本数据 X = ( x i j ) n ∗ p ; i = 1... p , j = 1... n , ∀ x i j ∈ R X=(x_{ij})_{n*p}; i=1...p,j=1...n ,\forall{x_{ij}}\in \mathbb R X=(xij)n∗p;i=1...p,j=1...n,∀xij∈R ; n n n为样本数, p p p是样本的观察指标数目。将样本数据中的一行也就是一个观察样本看成是P维空间的一个点, n n n个样本也就是P维空间中的 n n n点.
矩阵 X X X有如下分解: X = U Σ V t X=U\Sigma V^t X=UΣVt,其中 U ∈ R n ∗ n U \in R^{n*n} U∈Rn∗n, V ∈ R p ∗ p V\in R^{p*p} V∈Rp∗p,$\Sigma \in R^{n*p},v_{ij}=0 , \forall{ i\neq j } , 并 且 ,并且 ,并且S, D$均为正交阵。
1.1 SVD与PCA的关系
事实上,只要找到 H = X t X H=X^{t}X H=XtX的特征向量矩阵V,令 Y = X ∗ V Y=X*V Y=X∗V,则有 Y t Y = Λ Y^tY=\Lambda YtY=Λ, Λ \Lambda Λ的非对角线元素全为零,即Y个各列之间正交,只需要将Y的每列进行单位化就可以得到单位正交阵的p个列,补齐其余n-p列得到单位正交阵 U U U,即 Y = U Σ Y=U\Sigma Y=UΣ,因此有 X = U Σ V t X=U\Sigma V^t X=UΣVt成立。
首先,令 H = X t ∗ X H=X^t*X H=Xt∗X,根据SVD分解,有 H = U Σ t V t V Σ U t = U Σ t Σ U t = U t Λ U H=U\Sigma^t V^tV\Sigma U^t=U\Sigma^t \Sigma U^t=U^t\Lambda U H=UΣtVtVΣUt=UΣtΣUt=UtΛU。可见,U是H的特征向量矩阵,特征值为 λ i = σ i i 2 \lambda _{i}=\sigma_{ii}^2 λi=σii2。
其次,令 H ∗ = X ∗ X t H^*=X*X^t H∗=X∗Xt,根据SVD分解,有 H = V Σ Σ t V t = V t Λ ∗ V H=V\Sigma \Sigma^t V^t=V^t\Lambda^* V H=VΣΣtVt=VtΛ∗V。可见,V是 H ∗ H^* H∗的特征向量矩阵,特征值根为 λ i ∗ = σ i i 2 \lambda _{i}^*=\sigma_{ii}^2 λi∗=σii2。
由此知道任意的实数矩阵 X X X, 对称阵 X ∗ X t , X t ∗ X X*X^t,X^t*X X∗Xt,Xt∗X有相同的非零特征值,他们的特征向量矩阵,对应于SVD分解的U和V。
1.2 最优化方法看SVD
用
u
⃗
,
v
⃗
,
λ
\vec u ,\vec v,\lambda
u,v,λ逼近
X
X
X,建立如下最优化方法:
m
i
n
(
Q
(
X
,
u
⃗
,
v
⃗
,
λ
)
)
=
m
i
n
(
∑
i
=
1
n
∑
j
=
1
p
(
x
i
j
−
λ
u
i
v
j
)
2
)
s
t
.
{
∑
i
=
1
n
u
i
2
=
1
∑
j
=
1
p
v
i
2
=
1
min( Q(X,\vec u ,\vec v,\lambda))=min( \sum_{i=1}^n \sum_{j=1}^p(x_{ij}-\lambda u_i v_j)^2) \\ st. \begin{cases} \sum_{i=1}^n u_i^2 &=1\\ \\ \sum_{j=1}^p v_i^2 & =1 \end{cases}
min(Q(X,u,v,λ))=min(i=1∑nj=1∑p(xij−λuivj)2)st.⎩⎪⎨⎪⎧∑i=1nui2∑j=1pvi2=1=1
运用拉格朗日方法,可以得到下面的方程组:
{
u
⃗
t
X
v
⃗
=
λ
X
v
⃗
=
λ
u
⃗
(
1
)
X
t
u
⃗
=
λ
v
⃗
\begin{cases} \vec u^t X \vec v & =\lambda\\ X \vec v & =\lambda \vec u & & & & (1) \\ X ^t\vec u &=\lambda \vec v \end{cases}
⎩⎪⎨⎪⎧utXvXvXtu=λ=λu=λv(1)
由(1)可以得到,$XX ^t\vec u =\lambda X\vec v =\lambda^2 \vec u KaTeX parse error: Expected 'EOF', got '&' at position 2: ,&̲nbsp; 容易看到 \vec u 是 是 是XX ^t$的特征向量。
假设有两组解满足(1)式,分别为
(
u
⃗
1
,
v
⃗
1
,
λ
1
)
,
(
u
⃗
2
,
v
⃗
2
,
λ
2
)
(\vec u _1,\vec v_1,\lambda_1),(\vec u _2,\vec v_2,\lambda_2)
(u1,v1,λ1),(u2,v2,λ2),且有
λ
1
2
≠
λ
2
2
\lambda_1^2 \neq \lambda_2^2
λ12̸=λ22则有:
u
⃗
1
t
X
X
t
u
⃗
2
=
λ
1
2
u
⃗
1
t
u
⃗
2
=
λ
2
2
u
⃗
1
t
u
⃗
2
\vec u _1^t XX ^t \vec u _2=\lambda_1^2 \vec u _1^t\vec u _2= \lambda_2^2 \vec u _1^t\vec u _2
u1tXXtu2=λ12u1tu2=λ22u1tu2,则必有
u
⃗
1
t
u
⃗
2
=
0
\vec u _1^t\vec u _2=0
u1tu2=0,同理还有
v
⃗
1
t
v
⃗
2
=
0
\vec v_1^t\vec v_2=0
v1tv2=0
满足(1)式的所有解,构成了X的SVD分解。
1.3 SVD分解算法
事实上(1)给出了一个迭代算法求解SVD;基本步骤如下:
-
初始化 v ⃗ = ( 1 , 1 , … , 1 ) t \vec v=(1,1,…,1)^t v=(1,1,…,1)t, λ 1 = 0 \lambda_1=0 λ1=0,指定一个比较小的数值 e , e > 0 e,e>0 e,e>0
-
计算 X v ⃗ = u ⃗ ′ X \vec v =\vec u' Xv=u′, u ⃗ = u ⃗ ′ / ∣ u ⃗ ′ ∣ \vec u ={\vec u'}/{|\vec u'|} u=u′/∣u′∣
-
计算 v ⃗ ′ = X t u ⃗ \vec v'=X^t\vec u v′=Xtu, λ 2 = ∣ v ⃗ ′ ∣ \lambda_2={|\vec v'|} λ2=∣v′∣, v ⃗ = v ⃗ ′ / λ 2 \vec v ={\vec v'}/\lambda_2 v=v′/λ2
-
计算 判断 ∣ λ 2 − λ 1 ∣ < e |\lambda_2-\lambda_1|<e ∣λ2−λ1∣<e,为真,返回 ( λ 2 , u ⃗ , v ⃗ ) (\lambda_2,\vec u,\vec v) (λ2,u,v),否则 λ 1 ← λ 2 \lambda_1 \leftarrow \lambda_2 λ1←λ2跳转到第2步。
上面给出的分解SVD算法,只给出了一组解,为了求得剩余的解,只需要将X做如下的变换:
X
:
=
X
−
λ
∗
u
⃗
∗
v
⃗
t
X:=X-\lambda * \vec u *\vec v^t
X:=X−λ∗u∗vt然后按照上面的算法再计算即可,
#####下面验证第二组解满足(1)式:
事实上,假设两轮计算得到了两组解: ( λ 1 , u ⃗ 1 , v ⃗ 1 ) , ( λ 2 , u ⃗ 2 , v ⃗ 2 ) (\lambda_1,\vec u_1,\vec v_1),(\lambda_2,\vec u_2,\vec v_2) (λ1,u1,v1),(λ2,u2,v2),先验证若: λ 1 2 ≠ λ 2 2 \lambda_1^2 \neq \lambda_2^2 λ12̸=λ22有 u ⃗ 1 , u ⃗ 2 \vec u_1,\vec u_2 u1,u2正交。
(
X
t
−
λ
1
∗
v
⃗
1
∗
u
⃗
1
t
)
u
⃗
1
=
X
t
u
⃗
1
−
λ
1
∗
v
⃗
1
=
0
(X^t-\lambda_1 * \vec v_1*\vec u_1^t)\vec u_1=X^t\vec u_1-\lambda_1 * \vec v_1=0
(Xt−λ1∗v1∗u1t)u1=Xtu1−λ1∗v1=0
所以有:
0
=
u
⃗
2
t
(
X
−
λ
1
∗
u
⃗
1
∗
v
⃗
1
t
)
(
X
t
−
λ
1
∗
v
⃗
1
∗
u
⃗
1
t
)
u
⃗
1
=
λ
2
2
u
⃗
2
t
u
⃗
1
0=\vec u_2^t(X-\lambda_1 * \vec u_1 *\vec v_1^t)(X^t-\lambda_1 * \vec v_1*\vec u_1^t)\vec u_1= \lambda_2^2\vec u_2^t\vec u_1
0=u2t(X−λ1∗u1∗v1t)(Xt−λ1∗v1∗u1t)u1=λ22u2tu1
可见: u ⃗ 2 t u ⃗ 1 = 0 \vec u_2^t\vec u_1=0 u2tu1=0,同样,还有: v ⃗ 2 t v ⃗ 1 = 0 \vec v_2^t\vec v_1=0 v2tv1=0,所以有: λ 2 = u ⃗ 2 t ( X − λ 1 ∗ u ⃗ 1 ∗ v ⃗ 1 t ) v ⃗ 2 = u ⃗ 2 t X v ⃗ 2 − λ 1 u ⃗ 2 t ∗ u ⃗ 1 ∗ v ⃗ 1 t v ⃗ 2 = u ⃗ 2 t X v ⃗ 2 λ 2 v ⃗ 2 = ( X − λ 1 ∗ u ⃗ 1 ∗ v ⃗ 1 t ) t u ⃗ 2 = X t u ⃗ 2 λ 2 u ⃗ 2 = ( X − λ 1 ∗ u ⃗ 1 ∗ v ⃗ 1 t ) v ⃗ 2 = X v ⃗ 2 \lambda_2 =\vec u_2^t(X-\lambda_1 * \vec u_1 *\vec v_1^t)\vec v_2=\vec u_2^tX\vec v_2-\lambda_1\vec u_2^t * \vec u_1 *\vec v_1^t\vec v_2=\vec u_2^tX\vec v_2 \\ \lambda_2 \vec v_2=(X-\lambda_1 * \vec u_1 *\vec v_1^t)^t\vec u_2=X^t\vec u_2\\ \lambda_2 \vec u_2=(X-\lambda_1 * \vec u_1 *\vec v_1^t)\vec v_2=X\vec v_2 λ2=u2t(X−λ1∗u1∗v1t)v2=u2tXv2−λ1u2t∗u1∗v1tv2=u2tXv2λ2v2=(X−λ1∗u1∗v1t)tu2=Xtu2λ2u2=(X−λ1∗u1∗v1t)v2=Xv2
可见: ( λ 1 , u ⃗ 1 , v ⃗ 1 ) , ( λ 2 , u ⃗ 2 , v ⃗ 2 ) (\lambda_1,\vec u_1,\vec v_1),(\lambda_2,\vec u_2,\vec v_2) (λ1,u1,v1),(λ2,u2,v2)都是X的SVD分解的特征。
事实上,可以通过计算 H = X t ∗ X H=X^t*X H=Xt∗X,然后用上面的办法求解H的特征分解,算法可以进一步优化。但是当H或者X数据量特别大的时候,需要进行并行加速。上述算法可以进行并行运算,只需要对X进行分块即可。
二 、SVD的应用
SVD分解的应用十分广泛,在数据压缩,推荐,经济结构分析等等方面,并且在应用方面与因子分析、对应分析方法极为相似。
2.1 数据压缩
在大数据时代,存在大型数值矩阵,比如客户与购买的商品关系矩阵,网名点击网站数据等等,样本数据量为
n
∗
p
n*p
n∗p,而样本矩阵的秩
R
(
X
)
=
r
R(X)=r
R(X)=r,则SVD分解之后的去掉零后只剩
(
n
+
p
+
1
)
∗
r
(n+p+1)*r
(n+p+1)∗r个数据需要存储。这是还是无损压缩。
假设
n
=
100
∗
1
0
5
,
p
=
1
0
5
,
r
=
1
0
3
n=100*10^5,p=10^5,r=10^3
n=100∗105,p=105,r=103,则存储原始数据量为
1
0
12
10^{12}
1012,而通过SVD分解后,存储数据量为
(
100
∗
1
0
5
+
1
0
5
+
1
)
∗
1
0
3
≈
1
0
10
(100*10^5+10^5+1)*10^3 \approx10^{10}
(100∗105+105+1)∗103≈1010,所需存储空间缩小两个数量级。
除此之外,参照PCA(主成分分析),可将特征值从大到小排列,取方差和占比前80%的特征分量,还可以进一步压缩数据,降低噪音。
2.2 缺失值估计,商品推荐
在很多时候,X是稀疏矩阵,比如若X的每行代表某人购买不同商品数量或者金额的样本数据。将样本中缺失的数据视为潜在的消费需求,那么估计样本中缺失数据的值,就可以用来做商品推荐。
1.2节中讨论了二乘法逼近样本的最优化方法,并且从中给出了SVD分解的算法,现在稍微修改一下该方法,在此之前定义一个函数:
s
(
x
)
=
{
0
x
=
0
1
x
≠
0
s(x)= \begin{cases} 0 &x=0\\ 1 & x\neq0 \end{cases}
s(x)={01x=0x̸=0
然后定义极值函数:
m
i
n
(
Q
(
X
,
u
⃗
,
v
⃗
,
λ
)
)
=
m
i
n
(
∑
i
=
1
n
∑
j
=
1
p
[
s
(
x
i
j
)
∗
(
x
i
j
−
λ
u
i
v
j
)
2
]
)
s
t
.
{
∑
i
=
1
n
u
i
2
=
1
∑
j
=
1
p
v
i
2
=
1
min( Q(X,\vec u ,\vec v,\lambda))=min( \sum_{i=1}^n \sum_{j=1}^p[s(x_{ij})*(x_{ij}-\lambda u_i v_j)^2] ) \\ st. \begin{cases} \sum_{i=1}^n u_i^2 &=1\\ \\ \sum_{j=1}^p v_i^2 & =1 \end{cases}
min(Q(X,u,v,λ))=min(i=1∑nj=1∑p[s(xij)∗(xij−λuivj)2])st.⎩⎪⎨⎪⎧∑i=1nui2∑j=1pvi2=1=1
极小化目标函数
Q
(
X
,
u
⃗
,
v
⃗
,
λ
)
Q(X,\vec u ,\vec v,\lambda)
Q(X,u,v,λ),可以得到一组解
(
λ
,
u
⃗
,
v
⃗
)
(\lambda,\vec u,\vec v)
(λ,u,v),具体求解算法类似于 1.2节中介绍的SVD
分解的迭代算法,对于某个缺失值
x
i
j
x_{ij}
xij,只需要计算
λ
u
i
v
j
\lambda u_iv_j
λuivj,就估计得到某人对某种商品的潜在需求,从而进行推荐。
2.3 代替因子分析和对应分析
未加指明时默认SVD分解中V的对角线元素是是左上到右下,按照元素平方从大到小排列的。
假定大家熟悉因子分析(不懂的自行补脑_),因子分析分为R型因子分析和Q型因子分析,对于同一组样本,将两种分析结合起来,就是对应分析。
2.3.1 简单介绍因子分析模型
因子分析主要思想是将观测指标或者观测样本视为某些隐藏的因素叠加而来的。比如样本矩阵X的p个指标,分别记为
x
⃗
i
,
i
=
1..
p
\vec x_i,i=1..p
xi,i=1..p,
x
⃗
i
\vec x_i
xi是X的第i列。假设有r个隐藏因子记为
F
j
,
j
=
1..
r
F_j,j=1..r
Fj,j=1..r,建立如下模型:
x
⃗
i
=
u
i
+
a
i
k
∗
F
k
+
e
i
,
∀
i
=
1...
p
,
k
=
1...
r
,
e
i
∼
N
(
0
,
ε
)
,
∑
i
=
1
p
a
i
k
2
=
1
\vec x_i=u_i+a_{ik}*F_k+e_i,\forall i=1...p,k=1...r,e_i \sim N(0,\varepsilon),\sum_{i=1}^pa_{ik}^2=1
xi=ui+aik∗Fk+ei,∀i=1...p,k=1...r,ei∼N(0,ε),i=1∑paik2=1
e
i
e_i
ei噪音,
a
i
j
a_{ij}
aij是指标
x
⃗
i
\vec x_{i}
xi在隐藏因子
F
j
F_j
Fj上的得分,并且要求
c
o
v
(
F
i
,
F
j
)
=
0
,
∀
i
≠
j
cov(F_i,F_j)=0, \forall i\neq j
cov(Fi,Fj)=0,∀i̸=j。
表述成矩阵形式,就有:
X
=
(
x
⃗
1
,
x
⃗
2
,
.
.
.
,
x
⃗
p
)
=
U
+
(
F
1
,
F
2
,
.
.
.
,
F
r
)
∗
A
+
e
=
U
+
F
∗
A
+
e
,
A
∈
R
r
∗
p
X=(\vec x_1,\vec x_2,...,\vec x_p)=U+(F_1,F_2,...,F_r)*A+\mathbb e=U+\mathbb F*A+\mathbb e,A\in R^{r*p}
X=(x1,x2,...,xp)=U+(F1,F2,...,Fr)∗A+e=U+F∗A+e,A∈Rr∗p
2.3.2 对比因子分析模型与SVD模型
对照这个模型,重新审视SVD,假定X的值为k,选择
r
r
r满足
r
<
k
r<k
r<k。记
u
⃗
i
,
i
=
1...
k
\vec u_i,i=1...k
ui,i=1...k,
u
⃗
i
\vec u_i
ui是U的第i列,对应
v
⃗
i
,
i
=
1...
k
\vec v_i,i=1...k
vi,i=1...k,
v
⃗
i
t
\vec v_i^t
vit是V的第i列,$ \sigma_{i},i=1…k
,
,
, \sigma_i
是
是
是 \Sigma
的
第
i
个
对
角
线
元
素
。
重
新
用
普
分
解
的
方
式
可
以
将
X
表
示
为
的第i个对角线元素。重新用普分解的方式可以将X表示为
的第i个对角线元素。重新用普分解的方式可以将X表示为
X
=
∑
i
=
1
k
σ
i
u
⃗
i
∗
v
⃗
i
t
=
∑
i
=
1
r
σ
i
u
⃗
i
∗
v
⃗
i
t
+
∑
i
=
r
+
1
k
σ
i
u
⃗
i
∗
v
⃗
i
t
X=\sum_{i=1}^k \sigma_i\vec u_i*\vec v_i^t=\sum_{i=1}^r \sigma_i\vec u_i*\vec v_i^t+\sum_{i=r+1}^k \sigma_i\vec u_i*\vec v_i^t
X=∑i=1kσiui∗vit=∑i=1rσiui∗vit+∑i=r+1kσiui∗vit$
设
e
=
∑
i
=
r
+
1
k
σ
i
u
⃗
i
∗
v
⃗
i
t
\mathbb e=\sum_{i=r+1}^k \sigma_i\vec u_i*\vec v_i^t
e=∑i=r+1kσiui∗vit,
对照R型因子分析,记
F
=
(
σ
1
u
⃗
1
,
σ
2
u
⃗
2
,
.
.
.
,
σ
r
u
⃗
r
)
=
S
′
V
′
\mathbb F=(\sigma_1\vec u_1,\sigma_2\vec u_2,...,\sigma_r\vec u_r)=S'V'
F=(σ1u1,σ2u2,...,σrur)=S′V′;
模型比较总结如下:
记 A = V ^ t = ( v ⃗ 1 , v ⃗ 2 , . . . v ⃗ r ) t A=\hat V^t=(\vec v_1,\vec v_2,...\vec v_r)^t A=V^t=(v1,v2,...vr)t,有 F ∗ A = ∑ i = 1 r σ i u ⃗ i ∗ v ⃗ i t \mathbb F*A=\sum_{i=1}^r \sigma_i\vec u_i*\vec v_i^t F∗A=∑i=1rσiui∗vit,有 X = F ∗ A + e X=\mathbb F* A+\mathbb e X=F∗A+e,于是:
1、对应于因子分析中的因子得分 ∑ i = 1 p a i k 2 = 1 \sum_{i=1}^pa_{ik}^2=1 ∑i=1paik2=1,有 v ⃗ i t ∗ v ⃗ i = 1 \vec v_i^t*\vec v_i=1 vit∗vi=1;
2、对应于因子分析中的 c o v ( F i , F j ) = 0 cov(F_i,F_j)=0 cov(Fi,Fj)=0,有 σ i σ j u ⃗ i t ∗ u ⃗ j = { 0 i f i ≠ j u i 2 i f i = j \sigma_i \sigma_j\vec u_i^t*\vec u_j=\begin{cases}0 & if & i\neq j\\u_i^2 & if & i=j\end{cases} σiσjuit∗uj={0ui2ififi̸=ji=j
3、对应于 e i ∼ N ( 0 , ε ) e_i \sim N(0,\varepsilon) ei∼N(0,ε),有 ( ∑ i = r + 1 k σ i u ⃗ i ) t ∗ ( ∑ i = r + 1 k σ i u ⃗ i ) = ∑ i = r + 1 k σ i 2 = ε (\sum_{i=r+1}^k \sigma_i\vec u_i)^t*(\sum_{i=r+1}^k \sigma _i\vec u_i)=\sum_{i=r+1}^k\sigma_i^2=\varepsilon (∑i=r+1kσiui)t∗(∑i=r+1kσiui)=∑i=r+1kσi2=ε
2.3.3分析总结
1. 可以看出,除了中心化的要求外,SVD分解与因子分析严格对应,而且SVD集R型和Q型分析两种分析于一体,是接近于对应分析的一种分析方案。
2. 更进一步,参照普分解理论,参考因子分析,对于某个样本的某个指标值 x i j x_{ij} xij,可以将SVD解理为: x i j = ∑ k = 1 r σ k u i k ∗ v k j + ε i j , ∀ i = 1... n , j = 1.. p x_{ij}=\sum_{k=1}^r\sigma _ku_{ik}*v_{kj}+\varepsilon_{ij},\forall i=1...n,j=1..p xij=k=1∑rσkuik∗vkj+εij,∀i=1...n,j=1..p
- σ k \sigma _k σk代表第k个隐藏因子的对指标得分的基准权重; u i k u_{ik} uik代表第i个样本值对应第k个因子的得分; v k j v_{kj} vkj代表第j个指标对应第k个因子的得分,绝对值较小特征值代表的隐藏因子视为噪音。