奇異值分解是 lsa(潛在語義分析)即計算主題向量背後的演算法。
svd 是一種可以將任何矩陣分解成 3 個因子矩陣的演算法,而這 3 個因子矩陣可以相乘來重建原始矩陣。這類似於為乙個大整數找到恰好 3 個整數因子,但是這裡的因子不是標量整數,而是具有特殊性質的二維實矩陣。通過 svd 計算出的 3 個因子矩陣具有一些有用的數學性質,這些性質可以用於降維和 lsa。
用**來實現svd的矩陣分解:
from nlpia.book.examples.ch04_catdog_lsa_sorted import lsa_models, prettify_tdm
import numpy as np
import pandas as pd
# 11 篇文件、詞彙表大小為 6 的語料庫
bow_svd, tfidf_svd = lsa_models(
)print
("資料:\n"
, prettify_tdm(
**bow_svd)
)# 詞項-文件矩陣
tdm = bow_svd[
'tdm'
]print
("詞項-文件矩陣tdm:\n"
, tdm)
# 奇異值分解
u, s, vt = np.linalg.svd(tdm)
# 左奇異向量 u:主題-詞矩陣
# 矩陣中每個元素位置上的權重或得分,分別代表每個詞對每個主題的重要程度
print
("左奇異向量 u:\n"
, pd.dataframe(u, index=tdm.index)
.round(2
))# 奇異值向量 s:
# 奇異值給出了在新的語義(主題)向量空間中每個維度所代表的資訊量。
print
(s.round(1
))s = np.zeros(
(len
(u),
len(vt)))
# np.fill_diagonal() 填充對角線元素
np.fill_diagonal(s, s)
print
("奇異值向量 s:\n"
, pd.dataframe(s)
.round(1
))# 右奇異向量vt:該矩陣將在文件之間提供共享語義,
# 因為它度量了文件在新的文件語義模型中使用相同主題的頻率。
print
("右奇異向量vt:\n"
, pd.dataframe(vt)
.round(2
))# 詞項-文件矩陣重構誤差
# 度量lsa精確率的一種方法是看看從主題-文件矩陣重構詞項-文件矩陣的精確率如何。
print
(tdm.shape)
print
(np.product(tdm.shape)
)err =
for numdim in
range
(len
(s),0,
-1):
s[numdim -
1, numdim -1]
=0reconstructed_tdm = u.dot(s)
.dot(vt)
# 均方根誤差(rmse)
((reconstructed_tdm - tdm)
.values.flatten()**
2).sum()
/ np.product(tdm.shape)))
# 截斷的內容越多,誤差就越大
print
(np.array(err)
.round(2
))
TSVD截斷奇異值分解
tsvd經常被用在特徵提取和病態問題的解決上。從某種程度上來說,pca和svd是一對表親,pca對特徵的協方差矩陣進行分解,找到一堆特徵的線性組合,盡可能多的表示出原始特徵中成分,svd則對原始資料直接進行奇異值分解,找到原始資料中盡可能大的特徵值,以這些特徵值多對應的特徵向量作為新的特徵。對於病態...
奇異值分解
奇異值分解 singular value decomposition 是線性代數中一種重要的 矩陣分解,是矩陣分析中正規矩陣酉對角化的推廣。在訊號處理 統計學等領域有重要應用。1基本介紹 2理論描述 3幾何意義 4範數 5應用 求偽逆 平行奇異值模型 矩陣近似值 奇異值分解在某些方面與 對稱矩陣或 ...
奇異值分解
從幾何 的角度上來看奇異值分解 上圖表明任意的矩陣 a 是可以分解成三個矩陣相乘的形式。v表示了原始域的標準正交基,u表示經過a 變換後的co domain的標準正交基,表示了v 中的向量與u中相對應向量之間的關係。我們仔細觀察上圖發現,線性變換a可以分解為旋轉 縮放 旋轉這三種基本線性變換。接下來...