網(wǎng)站首頁 編程語言 正文
基于SVD的降維優(yōu)化
向量降維:盡量保留數(shù)據(jù)“重要信息”的基礎(chǔ)上減少向量維度。可以發(fā)現(xiàn)重要的軸(數(shù)據(jù)分布廣的軸),將二維數(shù)據(jù) 表示為一維數(shù)據(jù),用新軸上的投影值來表示各個(gè)數(shù)據(jù)點(diǎn)的值,示意圖如下。
稀疏矩陣和密集矩陣轉(zhuǎn)換:大多數(shù)元素為0的矩陣稱為稀疏矩陣,從稀疏矩陣中找出重要的軸,用更少的維度對(duì)其進(jìn)行重新表示。結(jié)果,稀疏矩陣就會(huì)被轉(zhuǎn)化為大多數(shù)元素均不為0的密集矩陣。這個(gè)密集矩陣就是我們想要的單詞的分布式表示。
奇異值分解(Singular Value Decomposition,SVD):任意的矩陣X分解為U、S、V,3個(gè)矩陣的乘積,其中U和V是列向量彼此正交的正交矩陣,S是除了對(duì)角線元素以外其余元素均為0的對(duì)角矩陣。
關(guān)于SVD是怎么回事,從代碼中分析:
代碼中使用 NumPy 的 linalg 模塊中的 svd 方法,如下。
U, S, V = np.linalg.svd(W)
我們輸出C、W、U、S、V,如下所示,可以看出,C是共現(xiàn)矩陣、W是PPMI矩陣。可以看到S矩陣是降序排列的。
[0 1 0 0 0 0 0] [1 0 1 0 1 1 0] [0 1 0 1 0 0 0] [0 0 1 0 1 0 0] [0 1 0 1 0 0 0] [0 1 0 0 0 0 1] [0 0 0 0 0 1 0] [[0. 1.807 0. 0. 0. 0. 0. ] [1.807 0. 0.807 0. 0.807 0.807 0. ] [0. 0.807 0. 1.807 0. 0. 0. ] [0. 0. 1.807 0. 1.807 0. 0. ] [0. 0.807 0. 1.807 0. 0. 0. ] [0. 0.807 0. 0. 0. 0. 2.807] [0. 0. 0. 0. 0. 2.807 0. ]] [[-3.409e-01 -1.110e-16 -3.886e-16 -1.205e-01 0.000e+00 9.323e-01 2.664e-16] [ 0.000e+00 -5.976e-01 1.802e-01 0.000e+00 -7.812e-01 0.000e+00 0.000e+00] [-4.363e-01 -4.241e-17 -2.172e-16 -5.088e-01 -1.767e-17 -2.253e-01 -7.071e-01] [-2.614e-16 -4.978e-01 6.804e-01 -4.382e-17 5.378e-01 9.951e-17 -3.521e-17] [-4.363e-01 -3.229e-17 -1.654e-16 -5.088e-01 -1.345e-17 -2.253e-01 7.071e-01] [-7.092e-01 -3.229e-17 -1.654e-16 6.839e-01 -1.345e-17 -1.710e-01 9.095e-17] [ 3.056e-16 -6.285e-01 -7.103e-01 7.773e-17 3.169e-01 -2.847e-16 4.533e-17]] [3.168e+00 3.168e+00 2.703e+00 2.703e+00 1.514e+00 1.514e+00 1.484e-16] [[ 0.000e+00 -5.976e-01 -2.296e-16 -4.978e-01 -1.186e-16 2.145e-16 -6.285e-01] [-3.409e-01 -1.110e-16 -4.363e-01 0.000e+00 -4.363e-01 -7.092e-01 0.000e+00] [ 1.205e-01 -5.551e-16 5.088e-01 0.000e+00 5.088e-01 -6.839e-01 0.000e+00] [-0.000e+00 -1.802e-01 -1.586e-16 -6.804e-01 6.344e-17 9.119e-17 7.103e-01] [-9.323e-01 -5.551e-17 2.253e-01 0.000e+00 2.253e-01 1.710e-01 0.000e+00] [-0.000e+00 7.812e-01 2.279e-16 -5.378e-01 3.390e-16 -2.717e-16 -3.169e-01] [ 0.000e+00 2.632e-16 -7.071e-01 8.043e-18 7.071e-01 9.088e-17 1.831e-17]]
下面研究U、S、V矩陣究竟是什么,添加如下代碼。
print("______________________") jym = np.dot(V, U) print(jym) print("______________________") jym2 = np.dot(U, V) print(jym2) print("______________________") V2 = np.transpose(V) jb = np.dot(V, V2) print(jb)
輸出如下,那就可以把U和V的性質(zhì)給搞懂了。從jb = np.dot(V, V2),輸出jb矩陣是單位矩陣,可知,V和U是正交矩陣。jym = np.dot(V, U),輸出jym主對(duì)角線元素全為0。U和V是列向量彼此正交的,公式里面把V轉(zhuǎn)置了也就是說,U的列向量和代碼里的V的行向量是正交的,所以用V乘U,他們的對(duì)角元是0。
[[-6.212e-17 1.000e+00 1.015e-08 2.968e-16 -5.249e-09 1.712e-16 6.754e-17] [ 1.000e+00 1.597e-16 3.967e-16 -2.653e-08 1.099e-16 -1.336e-08 -5.293e-09] [ 2.653e-08 3.025e-16 -2.284e-16 -1.000e+00 4.270e-16 1.110e-08 5.760e-09] [ 3.718e-16 -1.015e-08 -1.000e+00 1.958e-16 4.416e-10 -2.641e-16 2.132e-16] [ 1.336e-08 1.143e-16 2.378e-16 1.110e-08 3.405e-17 -1.000e+00 -2.662e-09] [-1.096e-17 5.249e-09 4.416e-10 -4.753e-16 -1.000e+00 -4.458e-17 8.307e-17] [-5.293e-09 -1.657e-16 7.657e-17 -5.760e-09 -1.925e-16 2.662e-09 1.000e+00]] [[-8.977e-18 9.539e-01 -2.775e-17 -2.497e-01 3.879e-16 7.108e-18 -1.668e-01] [ 9.539e-01 9.667e-18 1.764e-01 0.000e+00 1.764e-01 1.670e-01 0.000e+00] [ 4.757e-18 1.764e-01 5.000e-01 6.846e-01 -5.000e-01 3.262e-17 -1.578e-02] [-2.497e-01 -1.105e-16 6.846e-01 1.064e-16 6.846e-01 -2.032e-02 1.016e-16] [ 3.622e-18 1.764e-01 -5.000e-01 6.846e-01 5.000e-01 1.192e-16 -1.578e-02] [ 3.622e-18 1.670e-01 -1.220e-16 -2.032e-02 6.079e-17 9.043e-17 9.857e-01] [-1.668e-01 2.741e-17 -1.578e-02 -5.192e-17 -1.578e-02 9.857e-01 -4.663e-17]] [[ 1.000e+00 6.620e-17 7.901e-18 -1.015e-08 -8.632e-18 5.249e-09 -9.431e-17] [ 6.620e-17 1.000e+00 2.653e-08 -3.141e-18 1.336e-08 -1.414e-16 -5.293e-09] [ 7.901e-18 2.653e-08 1.000e+00 -1.074e-17 -1.110e-08 4.054e-17 5.760e-09] [-1.015e-08 -3.141e-18 -1.074e-17 1.000e+00 4.150e-18 -4.416e-10 1.171e-16] [-8.632e-18 1.336e-08 -1.110e-08 4.150e-18 1.000e+00 3.792e-17 -2.662e-09] [ 5.249e-09 -1.414e-16 4.054e-17 -4.416e-10 3.792e-17 1.000e+00 2.740e-16] [-9.431e-17 -5.293e-09 5.760e-09 1.171e-16 -2.662e-09 2.740e-16 1.000e+00]]
SVD的直觀意義
U是正交矩陣。這個(gè)正交矩陣構(gòu)成了一些空間中的基軸 (基向量),可以將矩陣U作為“單詞空間”。 S是對(duì)角矩陣,奇異值在對(duì)角線上降序排列,奇異值的大小也就意味著“對(duì)應(yīng)的基軸”的重要性。奇異值小,對(duì)應(yīng)基軸重要性就小,所以可以通過去除U矩陣中的多余的列向量來近似原始矩陣。從而把單詞向量用降維后的矩陣表示。示意圖如下。
稀疏向量W經(jīng)過 SVD 被轉(zhuǎn)化成了密集向量U。如果要對(duì)這個(gè)密集向量降維,比如把它降維到二維向量,取出U的前兩個(gè)元素即可。
text = 'You say goodbye and I say hello.' corpus, word_to_id, id_to_word = preprocess(text) vocab_size = len(id_to_word) C = create_co_matrix(corpus, vocab_size, window_size=1) W = ppmi(C) # SVD U, S, V = np.linalg.svd(W) np.set_printoptions(precision=3) # 有效位數(shù)為3位 for i in range(7): print(C[i]) print(U) # plot for word, word_id in word_to_id.items(): plt.annotate(word, (U[word_id, 0], U[word_id, 1])) plt.scatter(U[:,0], U[:,1], alpha=0.5) plt.show()
輸出的U:
[[-3.409e-01 -1.110e-16 -3.886e-16 -1.205e-01 0.000e+00 9.323e-01 2.664e-16] [ 0.000e+00 -5.976e-01 1.802e-01 0.000e+00 -7.812e-01 0.000e+00 0.000e+00] [-4.363e-01 -4.241e-17 -2.172e-16 -5.088e-01 -1.767e-17 -2.253e-01 -7.071e-01] [-2.614e-16 -4.978e-01 6.804e-01 -4.382e-17 5.378e-01 9.951e-17 -3.521e-17] [-4.363e-01 -3.229e-17 -1.654e-16 -5.088e-01 -1.345e-17 -2.253e-01 7.071e-01] [-7.092e-01 -3.229e-17 -1.654e-16 6.839e-01 -1.345e-17 -1.710e-01 9.095e-17] [ 3.056e-16 -6.285e-01 -7.103e-01 7.773e-17 3.169e-01 -2.847e-16 4.533e-17]]
用二維向量表示各個(gè)單詞,并把它們畫在圖上,畫出的圖如下:goodbye 和 hello、you 和 i 位置接近,這個(gè)結(jié)果復(fù)合之前做的基于余弦相似度的結(jié)果。
原文鏈接:https://www.cnblogs.com/jiangyiming/p/16102318.html
相關(guān)推薦
- 2023-01-26 RecyclerView?源碼淺析測(cè)量?布局?繪制?預(yù)布局_Android
- 2022-03-26 C++實(shí)現(xiàn)關(guān)機(jī)功能詳細(xì)代碼_C 語言
- 2023-03-11 Golang的Fork/Join實(shí)現(xiàn)代碼_Golang
- 2022-12-13 Android?itemDecoration接口實(shí)現(xiàn)吸頂懸浮標(biāo)題_Android
- 2022-07-03 C語言詳細(xì)講解const的用法_C 語言
- 2022-08-03 C#后端接收form-data,創(chuàng)建實(shí)體類教程_C#教程
- 2022-09-10 Python自動(dòng)打印被調(diào)用函數(shù)變量名及對(duì)應(yīng)值?_python
- 2022-07-25 Android?嵌套?Intent?隱患及解決方案_Android
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支