SVD矩阵分解
為什么要對矩陣進行分解
原始的矩陣表示數據最完整的信息,分解完之后,信息不就不完整了嗎?為什么要做矩陣分解?
假如有一批電商數據,有一些用戶購買了一些商品,假設100萬用戶,10萬個商品。用矩陣表示則有100萬*10萬的維度 ,這是一個很大的矩陣,同時也是一個稀疏的矩陣,因為每個用戶不能買所有的商品。這么龐大的矩陣中,我們也無法提取出重點信息。
因此將這個大矩陣分解成多個小矩陣相乘。
基變換
基是正交的(即內積為0,或者直觀說相互垂直),并且基是線性無關的。假設如果y軸和x軸不是正交的,也就是不是垂直,夾角小于90度,意味著y可以由x來表示,x也可以由y來表示。
當y與x垂直時,y無法表示x,x也無法表示y
我們不希望一個指標可以由另一個指標來表示。一旦可以這么表示,那么另一個指標存在的意義就不大了。
變換:數據與一個基做內積運算,結果作為第一個新的坐標分量,然后與第二個基做內積運算,結果作為第二個新坐標的分量。
特征值分解
矩陣里面有很多信息,來分一分, A=UΛU?1A=U \Lambda U^{-1}A=UΛU?1,其中UUU表示特征向量矩陣,Λ\LambdaΛ表示特征值矩陣。AAA必須是n*n的方陣,且有n個線性無關的特征向量。
這時我們就可以在對角矩陣當中找到比較大的了,他們就代表了主要信息。
SVD矩陣分解
上面提到的特征值分解不是挺好的嗎?但是它被限制住了,如果矩陣的形狀不是n*n的呢?而是m*n的形狀呢?
這時就需要使用SVD矩陣分解了。
首先選前k個的特征值(一般前10%的特征值的和就占了總體的90%)。Am?n=Um?kΛk?kVk?nA_{m*n}=U_{m*k}\Lambda_{k*k}V_{k*n}Am?n?=Um?k?Λk?k?Vk?n?,這樣就可以得到一個近似的矩陣,這個矩陣擁有與原矩陣差不多的信息,但是大小卻少了很多。
SVD推導
前提:對于一個二維矩陣M可以找到一組標準正交基v1v_1v1?和v2v_2v2?使得Mv1Mv_1Mv1?和Mv2Mv_2Mv2?是正交的。
使用另一組正交基u1u_1u1?和u2u_2u2?來表示Mv1Mv_1Mv1?和Mv2Mv_2Mv2?的方向。
其長度分別為:∣Mv1∣=σ1|Mv_1|=\sigma_1∣Mv1?∣=σ1?,∣Mv2∣=σ2|Mv_2|=\sigma_2∣Mv2?∣=σ2?,可得: Mv1=σ1u1,Mv2=σ2u2Mv_1=\sigma_1u_1,Mv_2=\sigma_2u_2Mv1?=σ1?u1?,Mv2?=σ2?u2?
對于向量xxx在這組基中的表示:x=(v1?x)v1+(v2?x)v2x=(v_1 · x)v_1 + (v_2·x)v_2x=(v1??x)v1?+(v2??x)v2?,其中(v1?x)(v_1 · x)(v1??x)表示向量的點積,點積表示投影的長度,可以通過投影到基的長度乘以基的方向來表示一個點的坐標。點積v?xv·xv?x也可以轉換成行向量乘列向量 v?x=vTxv·x=v^Txv?x=vTx
可得Mx=(v1?x)Mv1+(v2?x)Mv2,Mx=(v1?x)σ1u1+(v2?x)σ2u2Mx=(v_1·x)Mv_1 + (v_2·x)Mv_2,Mx=(v_1·x)\sigma_1u_1+(v_2·x)\sigma_2u_2Mx=(v1??x)Mv1?+(v2??x)Mv2?,Mx=(v1??x)σ1?u1?+(v2??x)σ2?u2?,從而得到:Mx=u1σ1v1Tx+u2σ2v2Tx,M=u1σ1V1T+u2σ2v2TMx=u_1\sigma_1v_1^Tx+u_2\sigma_2v_2^Tx,M=u_1\sigma_1V_1^T+u_2\sigma_2v_2^TMx=u1?σ1?v1T?x+u2?σ2?v2T?x,M=u1?σ1?V1T?+u2?σ2?v2T?,化簡得到:M=U∑VTM=U\sum V^TM=U∑VT
總結
- 上一篇: 中体会电脑的感觉谈谈你对电脑使用的感受
- 下一篇: 宏碁传奇 X16 笔记本降至 6999