兩個三維向量相乘公式 SVD截斷損失公式推導

2021-10-16 10:45:32 字數 2662 閱讀 9867

給定乙個

其中等價與第

到第個奇異值構成的向量的l2範數。

svd分解是將乙個

的矩陣分解為三個矩陣的乘積。也就是

。其中,

以及是左奇異矩陣和右奇異矩陣,它們分別是通過

以及在通過特徵值分解後得到的歸一化的特徵向量矩陣生成的。(在這裡,如果是涉及到複數就需要換成共軛轉置)。通過剛剛的特徵值分解使用的是轉置可以看出,這裡的特徵值是正交的(其實這是對稱矩陣,這裡留給讀者思考)。為了方便svd的計算(不用歸一化奇異值對角化矩陣),這裡的特徵向量是歸一化的。所以可以發現,

和是標準正交的。

接下來談談矩陣乘法的不同視角。給定矩陣

和,從矩陣乘法的定義出發我們可以得到矩陣乘法後生成的新矩陣

的第行第

列個值是

的第個行向量和

的第個列向量的內積,畢竟這兩個向量的長度是一樣的,否則兩個矩陣無法相乘。這也就是「左行右列」原則。那麼如果反過來思考會怎麼樣: 考慮

的第個列向量和

的個行向量做外積,也就是

,這會產生乙個和

一樣大小的矩陣,然後列舉

,可以發現這個就是和

的公共指標。那麼將產生的這些子矩陣相加,即矩陣的對應位置的元素相加,就的到了最後的結果

。因此,奇異值分解可以寫為:

也就是中的特徵值向量和

中的特徵值向量的轉置對應相乘然後通過奇異值分配權重,加權的到

矩陣。

b乎抽風,這個公式顯示不出來....

在上面的式子中,

是第個奇異值對應的左奇異向量與右奇異向量的外積得到的矩陣。

如果將矩陣範數(也就是一種l2範數)去掉,那麼問題就變成了

矩陣在加權下求和後的平方後的對應位置的元素和,可以理解為一種廣義的hadamard積。

在證明之前先考慮乙個簡單的情況:

如果有兩個矩陣

,,那麼如果有矩陣

,那麼它們之間的矩陣範數滿足什麼關係?

可以考慮矩陣

有乙個元素

,矩陣對應位置有乙個元素

,那麼矩陣

對應位置的元素就是

。如果要求矩陣範數,必然先將矩陣的所有元素平方再求和,易得:

。也就是說,矩陣

的範數不僅要考慮

和還要考慮

和某種變換後的矩陣,這個矩陣其實也很簡單,也就是

和對應位置乘積得到的矩陣,和cnn網路中的卷積如出一轍。

那麼思考上面的公式,我們可以發現,公式中的矩陣範數顯然也可以分成兩種項,一種是

和自己本身的對應位置乘積得到的新矩陣的hadamard積,另一種自然是

和的hadamard積了。

對於前者可以發現:

考慮到,所以上面的式子恒為1。

最後,我們對於:

右邊恒為0,左邊的範數恒為1,所以原式為:

我們可以發現這邊是等於號。但是我們發現了一些問題:在最上面的式子中,這裡明明是不等號但是這裡經過我們證明後確實是等號。我認為的原因應該是在實際應用中,svd的數值演算法給出的值不一定是完全正確的,由於浮點數運算或者是使用迭代法計算,會顯然產生截斷誤差或者數值解可能的不穩定(這一點待**)。於是之前證明用到的左右奇異矩陣的正交與歸一化性質無法保證,但由於解足夠接近,所以可以填約等號。

舉例:

numpy.linalg.eig()

x = np.mat([[1,2,4],[1,-1,8],[-2,4,3]])

print(linalg.eig(x)[1][1],linalg.norm(linalg.eig(x)[1][1]))

執行結果:

[[-0.89442719 -0.43652118  0.6249178 ]] 1.1751906232746996
迭代法:

def iterate(m,iter):

assert check_dim(m) == true

dim = m.shape[0]

eigens =

for index in range(dim):

eigen = np.zeros((dim))

eigen[index] = 1.0

eigen = np.asmatrix(eigen).t

pass

for i in range(iter):

for vec_id in range(dim):

eigens[vec_id] = m*eigens[vec_id]

norm = eigens[vec_id].t.dot(eigens[vec_id])

eigens[vec_id] /= np.sqrt(norm)

#print(eigens[0].t.dot(eigens[0]))

pass

return eigens

輸出結果

[[0.64091977]

[0.6249178 ]

[0.44575733]]

可以發現,numpy的求特徵值的演算法存在誤差,其求出的特徵向量的l2範數為1.1,其第二個分量和使用迭代法求出的最大特徵值對應的特徵向量的第三個分量一致,說明numpy求出的特徵向量存在一定誤差。

兩個三維向量的夾角計算

a cos v1 v 2 v1 v2 需要注意的 的範圍再0 pi之間,怎麼解決0 2pi的問題呢?這裡就需要用到向量的叉乘,根據叉乘後的向量與螢幕方向來確定角度是否超過180 如下 float angle osg vec3f line1,osg vec3f line2,osg vec3f dire...

兩個三維向量叉積 兩個向量的叉積

精品文件 1.8兩向量的向量積 定義1.8.1 兩個向量a與 b的向量積 外積 是乙個向量,記作 a,它的模是ab sin二其中 v為a與 b間的夾角 a4的方向與a與 b都垂直,並且按ab ab的順序構成右 手標架 oa ba4 下圖 a定理 1.8.1 兩個不共線向量a與 b的向量積的模,等於以...

兩個三維向量叉積 S14 3 空間向量和外積

二維的座標平面可以誕生二維向量,那麼更高維的空間是不是也有更高維的向量呢?它們之間會有什麼性質?類似於二維向量,我們定義 對於有序的陣列 其所組成的空間就叫n維向量空間。實際上你也能把實數看作是一維的向量。在這裡我們重點討論三維空間向量 x,y,z 類似於二維向量,我們定義其加法 數乘 模長 內積運...