日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

利用奇异值分解(SVD)简化数据

發布時間:2025/3/19 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 利用奇异值分解(SVD)简化数据 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
  • 特征值與特征向量

  下面這部分內容摘自:強大的矩陣奇異值分解(SVD)及其應用

??? 特征值分解和奇異值分解在機器學習領域都是屬于滿地可見的方法。兩者有著很緊密的關系,在接下來會談到,特征值分解和奇異值分解的目的都是一樣,就是提取出一個矩陣最重要的特征。先談談特征值分解吧:

??? 如果說一個向量v是方陣A的特征向量,則可以表示成下面的形式:

??? 這時候λ就被稱為特征向量v對應的特征值,一個矩陣的一組特征向量是一組正交向量。特征值分解是將一個矩陣分解成下面的形式:

??? 其中Q是這個矩陣A的特征向量組成的矩陣,Σ是一個對角陣,每一個對角線上的元素就是一個特征值。首先要明確的是,一個矩陣其實就對應一個線性變換,因為一個矩陣乘以一個向量,其實就相當于對這個向量進行了線性變換。比如說下面的一個矩陣:

  它其實對應的線性變換是下面的形式:

  因為這個矩陣M乘以一個向量(x,y)T的結果是:

??? 上面的矩陣是對稱的,所以這個變換是一個對x,y軸的拉伸變換(每一個對角線上的元素將會對一個維度進行拉伸變換,當值>1時,是拉長,當值<1時時縮短),當矩陣不是對稱的時候,假如說矩陣是下面的樣子:

  它所描述的變換是下面的樣子:

  這其實是在平面上對一個軸進行的拉伸變換(如藍色的箭頭所示),在圖中,藍色的箭頭是一個最主要的變化方向(變化方向可能有不止一個),如果我們想要描述好一個變換,那我們就描述好這個變換主要的變化方向就好了。反過頭來看看之前特征值分解的式子,分解得到的Σ矩陣是一個對角陣,里面的特征值是由大到小排列的,這些特征值所對應的特征向量就是描述這個矩陣變化方向(從主要的變化到次要的變化排列)。

  當矩陣是高維的情況下,那么這個矩陣就是高維空間下的一個線性變換,這個線性變化可能沒法通過圖形來表示,但是可以想象,這個變換也同樣有很多的變換方向,我們通過特征值分解得到的前N個特征向量,那么就對應了這個矩陣最主要的N個變化方向。我們利用這前N個變化方向,就可以近似這個矩陣(變換)。也就是之前說的:提取這個矩陣最重要的特征。總結一下,特征值分解可以得到特征值與特征向量,特征值表示的是這個特征到底有多重要,而特征向量表示這個特征是什么,可以將每一個特征向量理解為一個線性的子空間,我們可以利用這些線性的子空間干很多的事情。不過,特征值分解也有很多的局限,比如說變換的矩陣必須是方陣。

  特征值分解是一個提取矩陣特征很不錯的方法,但是它只是對方陣而言的,在現實的世界中,我們看到的大部分矩陣都不是方陣,比如說有N個學生,每個學生有M科成績,這樣形成的一個N * M的矩陣就不可能是方陣,我們怎樣才能描述這樣普通的矩陣呢的重要特征呢?奇異值分解可以用來干這個事情。

  • 奇異值分解

  奇異值分解(SVD)不僅是矩陣理論和矩陣計算的最基本、最重要的工具之一,而且在最優化問題,控制理論,系統辨識和信號處理等許多領域都有直接應用。為了引入矩陣奇異值的概念,先介紹幾個引理。

引理1. 設ACm×n,則 rank(AHA)=rank(AAH)=rank(A)。

引理2. 設ACm×n,則AHAAAH的特征值均為非負實數;且其非零特征值相同,并且非零特征值的個數等于rank(A)

定義: 設ACrm×n(r>0),?AHA的特征值為λ1≥λ2≥...≥λrr+1=...=λn=0,則稱σiA的奇異值

定理:設ACrm×n(r>0),則存在m階酉矩陣U和n階酉矩陣V,使得

  其中Σ=diag(σ12,...,σi),而σi為A的非零奇異值,將上式改寫為

  則稱之為矩陣A的奇異值分解

  其中,U的每一列稱作左奇異向量;Σ是對角矩陣;V的每一列(即V的共軛轉置矩陣VH的每一行)稱作右奇異向量;對角線上的值按照從大到小排列,稱作奇異值。U的列向量是AAH的單位正交特征向量,V的列向量是AHA的單位正交特征向量,Σ矩陣對角線上的值實際就是AAH或者AHA特征值的平方根。計算SVD實際上就是計算AHA或者AAH的特征值和特征向量,然后將它們組合成上面表達式的形式(注意所得結果需要進行檢驗——參考矩陣論簡明教程P121)。

  例:對矩陣A進行奇異值分解

$$A=\left(\begin{array}{c}0 \\-1 \\0 \\1\end{array}\begin{array}{c}1 \\0 \\2 \\0\end{array}\right)$$

  解:因為

$$A^HA=\left(\begin{array}{cc}2 & 0 \\0 & 5\end{array}\right)$$

則A的非零奇異值為$\sqrt{2}$,$\sqrt{5}$,AHA對應特征值5和2的標準正交特征向量為$u_1=\left(\begin{array}{c}0 \\1\end{array}\right)$,$u_2=\left(\begin{array}{c}1 \\0\end{array}\right)$,而AAH對應特征值5和2的標準正交特征向量為:$v_1=\left(\begin{array}{c}\frac{1}{\sqrt{5}} \\0 \\\frac{2}{\sqrt{5}} \\0\end{array}\right)$,$v_2=\left(\begin{array}{c}0 \\\frac{-1}{\sqrt{2}} \\0 \\\frac{1}{\sqrt{2}}\end{array}\right)$,AAH對應特征值0的標準正交特征向量為:$v_3=\left(\begin{array}{c}\frac{-2}{\sqrt{5}} \\0 \\\frac{1}{\sqrt{5}} \\0\end{array}\right)$,$v_4=\left(\begin{array}{c}0 \\\frac{1}{\sqrt{2}} \\0 \\\frac{1}{\sqrt{2}}\end{array}\right)$. 因此矩陣A的奇異值分解為:

  • 使用numpy進行矩陣奇異值分解

?  Numpy中linalg線性代數模塊含有SVD函數,可以方便的進行奇異值分解。以矩陣[[1,1],[1,7]]為例使用numpy中的函數進行分解:

  注意Sigma矩陣以一維行向量的形式返回(Sigma矩陣中除了對角元素其它均為0),這種僅返回對角元素的方式能夠節省空間。

  再以如下矩陣為例進行SVD分解

  計算結果為:
  >>>Sigma
  array([ 9.72140007e+00,   5.29397912e+00,   6.84226362e-01,  7.16251492e-16,  4.85169600e-32])

  前三個奇異值比其他的值大很多,于是可以將最后兩個值去掉(在很多情況下,數據中的一小段攜帶了數據集中的大部分信息,其他的信息要么是噪聲,要么就是毫不相關的信息。一般在某個奇異值的數目(r個)之后,其它奇異值都為0,這就意味著數據集中僅有r個重要特征,而其它特征都是噪聲或冗余特征)。接下來,原始數據集就可以用如下結果來近似:

? ? ? ? 中間矩陣∑為對角陣,對角元素值為Data矩陣的奇異值,且已經從大到小排序,即使去掉特征值小的那些特征,依然可以很好地重構出原始矩陣。如下圖:其中陰影部分代表去掉小奇異值,近似重構時的三個矩陣。這三個矩陣的面積之和(從存儲觀點來說,矩陣面積越小,存儲量就越小)要遠遠小于原始的矩陣,我們如果想要壓縮空間來表示原矩陣,則存儲U、Σ、V就好了。

  接下來我們驗證一下近似的效果。首先構建一個3×3的對角矩陣Sig3:>>>Sig3=np.diagflat([Sigma[0], Sigma[1], Sigma[2]])

  取矩陣U的前3列和矩陣VT的前3行進行計算: >>>np.dot(U[:,:3], ?np.dot(Sig3 ,VT[:3,:])) ? ?

  結果如下圖所示,可以看出用近似矩陣成功的重構出被分解的矩陣,即通過三個矩陣對原始矩陣進行了近似。

  那么如何確定要保留前幾個奇異值呢?確定要保留的奇異值的數目有很多種策略,其中一個典型的做法就是保留矩陣中90%的能量信息。為了計算總能量信息,將所有的奇異值求平方和。于是可以將奇異值的平方和累加到總值的90%為止。另一個策略就是,當矩陣上有上萬的奇異值時,那么就保留前面的2000或3000個。盡管后一種方法不太優雅,但是在實際中更容易實施。之所以說它不夠優雅,就是因為在任何數據集上都不能保證前3000個奇異值就能夠包含90%的能量信息。但在通常情況下,使用者往往都對數據有足夠的了解,從而就能夠做出類似的假設了。

  • ?基于協同過濾的推薦引擎

  推薦引擎利用基于內容、基于用戶行為、基于社交關系網絡等多種方法,為用戶推薦其喜歡的商品或內容。協同過濾是通過將用戶和其他用戶的數據進行對比來實現推薦的。
  當知道了兩個用戶或兩個物品之間的相似度,我們就可以利用已有的數據來預測未知的用戶喜好。例如,我們試圖對某個用戶喜歡的電影進行預測。推薦引擎發現有一部電影該用戶還沒看過。然后,它就會計算該電影和用戶看過的電影之間的相似度,如果其相似度很高,推薦算法就會認為用戶喜歡這部電影。假如我們要為食品銷售網站做一個推薦系統,則可以根據食品的配料、熱量、烹調類型等特征進行相似度的計算。如果該網站改為銷售電子產品,則描述電子產品的屬性和描述食品的屬性又有所不同。我們不利用專家所給出的重要特征來描述物品從而計算它們之間的相似度,而是利用用戶對它們的意見來計算相似度。這就是協同過濾中所使用的方法。它并不關心物品的描述屬性,而是嚴格地按照不同用戶的觀點來計算相似度。
  下圖給出了由一些用戶對部分菜肴的評級信息所組成的矩陣。用戶可以采用1 到5 之間的任意一個整數來對菜評級,如果沒有嘗過某道菜,則評級為0

  我們計算一下手撕豬肉和烤牛肉之間的相似度。首先使用歐氏距離來計算,手撕豬肉和烤牛肉的歐氏距離為:

  而手撕豬肉和鰻魚飯之間的歐氏距離為:

  

  由于手撕豬肉和烤牛肉的距離小于手撕豬肉和鰻魚飯的距離, 因此手撕豬肉與烤牛肉比與鰻魚飯更為相似。另一個常用的距離計算方法就是余弦相似度(cosine similarity),其計算的是兩個向量夾角的余弦值。如果夾角為90度,則相似度為0;如果兩個向量的方向相同,則相似度為1。兩個向量A和B的余弦相似度的定義如下:

  余弦距離使用兩個向量夾角的余弦值作為衡量兩個個體間差異的大小。相比歐氏距離,余弦距離更加注重兩個向量在方向上的差異。從下圖可以看出,歐氏距離衡量的是空間各點的絕對距離,跟各個點所在的位置坐標直接相關;而余弦距離衡量的是空間向量的夾角,更加體現在方向上的差異,而不是位置。如果保持A點位置不變,B點朝原方向遠離坐標軸原點,那么這個時候余弦距離是保持不變的(因為夾角沒有發生變化),而A、B兩點的歐氏距離顯然在發生改變,這就是歐氏距離和余弦距離之間的不同之處。

  歐氏距離和余弦距離各自有不同的計算方式和衡量特征,因此它們適用于不同的數據分析模型:歐氏距離能夠體現個體數值特征的絕對差異,所以更多的用于需要從維度的數值大小中體現差異的分析,如使用用戶行為指標分析用戶價值的相似度或差異。余弦距離更多的是從方向上區分差異,而對絕對的數值不敏感,更多的用于使用用戶對內容評分來區分興趣的相似度和差異,同時修正了用戶間可能存在的度量標準不統一的問題(因為余弦距離對絕對數值不敏感)。

  計算相似度時可以采用基于物品(item-based)的相似度或基于用戶(user-based)的相似度。矩陣行與行之間比較的是基于用戶的相似度,列與列之間比較的是基于物品的相似度。到底使用哪一種相似度,取決于用戶或物品的數目。如果用戶數目很多,那么我們可能傾向于使用基于物品相似度的計算方法。對于大部分推薦引擎而言,用戶數量往往大于商品的數量。

  推薦未嘗過的菜肴:
  推薦系統的工作過程是給定一個用戶,系統會為此用戶返回N個最好的推薦菜。為了實現這一點,需要我們做到:
(1)尋找用戶沒有評級的菜肴,即在用戶—物品矩陣中的0值?
(2)在用戶沒有評級的所有物品中,對每個物品預計一個可能的評級分數
(3)對這些物品的評分從高到低進行排序,返回前N個物品

?  假定真實的評價矩陣如下表所示,其中很多物品都沒有評分。

  下面我們對該矩陣進行SVD分解,了解其需要多少維特征。首先對奇異值求平方和,然后計算總能量的90%:

  U, sigma, VT = np.linalg.svd(mat)
  Sig2 = sigma**2
  sum(Sig2)*0.9

  結果為487.8,然后計算前幾個元素累加所包含的能量達到90%,當計算到前4個元素時(sum(Sig2[:,3]=500.5>487.8),就可以了。用戶的評分數據是稀疏矩陣,可以用SVD將數據映射到低維空間,然后計算低維空間中的item之間的相似度,對用戶未評分的item進行評分預測,最后將預測評分高的item推薦給用戶。

  下面代碼將給第1號用戶Rob推薦3個估計評分最高的食物:

# -*- coding: utf-8 -*- import numpy as np# 計算歐氏距離相似度(距離為0時相似度為1,距離非常大時相似度趨于0) def ecludSim(inA, inB):return 1.0 / (1.0 + np.linalg.norm(inA - inB))# 計算余弦相似度 def cosSim(inA, inB):num = np.inner(inA, inB)denom = np.linalg.norm(inA) * np.linalg.norm(inB)return 0.5 + 0.5 * (num / denom) # 歸一化到0到1之間# 計算在給定相似度計算方法的條件下,用戶對物品的估計評分值 # 參數dataMat表示數據矩陣,user表示用戶編號,simMeas表示相似度計算方法,item表示物品編號 def standEst(dataMat, user, simMeas, item):n = dataMat.shape[1] # 獲取物品數目U, Sigma, VT = np.linalg.svd(dataMat) # 進行奇異值分解transform = np.dot(U[:,:4].T, dataMat) # 對行進行壓縮 simTotal = 0.0; ratSimTotal = 0.0for j in range(n): # 遍歷每個物品userRating = dataMat[user,j] # 用戶對第j個用品的評分if userRating == 0:continuesimilarity = simMeas(transform[:,item], transform[:,j] ) # 比較item列與第j列物品的相似度print 'the %d and %d similarity is: %f' % (item, j, similarity)simTotal += similarityratSimTotal += similarity * userRatingif simTotal == 0: return 0else: print "item %d rating: %f" % (item, ratSimTotal/simTotal )return ratSimTotal/simTotal # 用戶評分歸一化到0-5# 產生最高的N個推薦結果,不過不指定N,默認值為3 def recommend(dataMat, user, N=3, simMeas=cosSim):unratedItems = np.nonzero(dataMat[user,:] == 0)[0] # 尋找未評級的物品if len(unratedItems) == 0: # 如果不存在未評分物品,則退出函數return 'you rated everything'itemScores = []for item in unratedItems: # 對所有未評分物品進行預測得分estimatedScore = standEst(dataMat, user, simMeas, item)itemScores.append((item, estimatedScore))# 對itemScores進行從大到小排序,返回前N個未評分物品return sorted(itemScores, key=lambda jj: jj[1], reverse=True)[:N] if __name__ == "__main__":mat=np.array([[0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 5],\[0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 3],\[0, 0, 0, 0, 4, 0, 0, 1, 0, 4, 0],\[3, 3, 4, 0, 0, 0, 0, 2, 2, 0, 0],\[5, 4, 5, 0, 0, 0, 0, 5, 5, 0, 0],\[0, 0, 0, 0, 5, 0, 1, 0, 0, 5, 0],\[4, 3, 4, 0, 0, 0, 0, 5, 5, 0, 1],\[0, 0, 0, 4, 0, 4, 0, 0, 0, 0, 4],\[0, 0, 0, 2, 0, 2, 5, 0, 0, 1, 2],\[0, 0, 0, 0, 5, 0, 0, 0, 0, 4, 0],\[1, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0]])ret = recommend(mat, 1, N=3, simMeas=cosSim)print ret

  輸出結果如下所示:

the 0 and 3 similarity is: 0.498297 the 0 and 5 similarity is: 0.498702 the 0 and 10 similarity is: 0.540399 item 0 rating: 3.324381 the 1 and 3 similarity is: 0.497432 the 1 and 5 similarity is: 0.497414 the 1 and 10 similarity is: 0.539074 item 1 rating: 3.324277 the 2 and 3 similarity is: 0.497835 the 2 and 5 similarity is: 0.497894 the 2 and 10 similarity is: 0.539558 item 2 rating: 3.324300 the 4 and 3 similarity is: 0.495847 the 4 and 5 similarity is: 0.500120 the 4 and 10 similarity is: 0.501394 item 4 rating: 3.334001 the 6 and 3 similarity is: 0.750797 the 6 and 5 similarity is: 0.636231 the 6 and 10 similarity is: 0.623186 item 6 rating: 3.316499 the 7 and 3 similarity is: 0.500010 the 7 and 5 similarity is: 0.502570 the 7 and 10 similarity is: 0.544420 item 7 rating: 3.324867 the 8 and 3 similarity is: 0.500932 the 8 and 5 similarity is: 0.502238 the 8 and 10 similarity is: 0.544006 item 8 rating: 3.324616 the 9 and 3 similarity is: 0.530070 the 9 and 5 similarity is: 0.518088 the 9 and 10 similarity is: 0.517555 item 9 rating: 3.330896 [(4, 3.3340010557993547), (9, 3.3308956173494804), (7, 3.3248674803258673)] View Code

  代碼中最關鍵的地方(標黃色背景的兩行)在于如何利用SVD將高維數據映射成低維數據。

  假設矩陣A的每一行表示一個樣本,每一列表示一個特征,將一個m*n的矩陣變換成一個m*r的矩陣,這樣就會使得本來有n個feature的矩陣,變成了有r個feature了(r < n),這其實就是對矩陣信息的一種提煉。用數學語言表示就是:

  根據之前提過的使用奇異值分解來近似A矩陣:

  在上式兩邊同時乘上一個矩陣V,由于V是一個正交的矩陣,所以V轉置乘以V得到單位陣I,所以可以化成下面的式子:$$A_{m\times n}V_{n\times r}\approx U_{m\times r}\Sigma _{r\times r}V^T{}_{r\times n}V_{n\times r}=U_{m\times r}\Sigma _{r\times r}=\tilde{A}_{m\times r}$$

  這里是將一個m*n的矩陣壓縮成一個m*r的矩陣,也就是對列進行壓縮,如果我們想對行進行壓縮(可以理解為,將一些相似的sample合并在一起,或者將一些沒有太大價值的sample去掉)怎么辦呢?同樣我們寫出一個通用的行壓縮例子:

?  這樣就從一個m行的矩陣壓縮到一個r行的矩陣了,對SVD來說也是一樣的,我們對SVD分解的式子兩邊乘以U的轉置UT,這樣我們就得到了對行進行壓縮的式子:$$U_{m\times r}^TA_{m\times n}\approx U_{m\times r}^TU_{m\times r}\Sigma _{r\times r}V_{r\times n}^T=\Sigma _{r\times r}V_{r\times n}^T=\tilde{A}_{r\times n}$$

  如此則將m行數據壓縮成r行數據,其含義就是去除那些十分相近的數據。

  • ?基于SVD的圖像壓縮

  下面將對一張手寫的數字圖像進行壓縮。原始的圖像大小是32×32=1024像素 ,我們能否使用更少的像素來表示這張圖呢?如果能對圖像進行壓縮,那么就可以節省空間或帶寬開銷了。我們可以使用SVD來對數據降維,從而實現圖像的壓縮。

00000000000000110000000000000000
00000000000011111100000000000000
00000000000111111110000000000000
00000000001111111111000000000000
00000000111111111111100000000000
00000001111111111111110000000000
00000000111111111111111000000000
00000000111111100001111100000000
00000001111111000001111100000000
00000011111100000000111100000000
00000011111100000000111110000000
00000011111100000000011110000000
00000011111100000000011110000000
00000001111110000000001111000000
00000011111110000000001111000000
00000011111100000000001111000000
00000001111100000000001111000000
00000011111100000000001111000000
00000001111100000000001111000000
00000001111100000000011111000000
00000000111110000000001111100000
00000000111110000000001111100000
00000000111110000000001111100000
00000000111110000000011111000000
00000000111110000000111111000000
00000000111111000001111110000000
00000000011111111111111110000000
00000000001111111111111110000000
00000000001111111111111110000000
00000000000111111111111000000000
00000000000011111111110000000000
00000000000000111111000000000000

# -*- coding: cp936 -*- import numpy as np from matplotlib import pyplot as pltdef printMat(inMat, thresh=0.8):for i in range(32):for k in range(32):if float(inMat[i,k]) > thresh:print 1,else: print 0,print ''def imgCompress(numSV=3, thresh=0.8):myl = []for line in open('data.txt').readlines():newRow = []for i in range(32):newRow.append(int(line[i]))myl.append(newRow)myMat = np.mat(myl)#print "****original matrix******"#printMat(myMat, thresh)U,Sigma,VT = np.linalg.svd(myMat)SigRecon = np.mat(np.zeros((numSV, numSV)))for k in range(numSV): #construct diagonal matrix from vectorSigRecon[k,k] = Sigma[k]reconMat = U[:,:numSV]*SigRecon*VT[:numSV,:]#print "****reconstructed matrix using %d singular values******" % numSV#printMat(reconMat, thresh)return (myMat, reconMat)if __name__ == "__main__":img1, img2 = imgCompress()plt.subplot(121),plt.imshow(img1,cmap ='gray'),plt.title('Original')plt.subplot(122),plt.imshow(img2,cmap ='gray'),plt.title('Reconstruction')plt.show()

  結果如下圖所示,左邊為原始矩陣圖像,右邊為重建矩陣的灰度圖。

?  可以看到,只需要3個奇異值就能相當精確地對圖像實現重構。U和VT都是32×3的矩陣,因此這些矩陣中包含的元素為32×3+32×3+3=195。和原來的1024相比獲得了5倍的壓縮比。

?  下面用一幅普通的圖片來進行一下測試。用OpenCV以灰度圖模式讀入,然后分別選用100,50,20,10,5這五個奇異值進行壓縮并重建。

# -*- coding: cp936 -*- import numpy as np import cv2 from matplotlib import pyplot as pltdef imgCompress(img, numSV=3):U, Sigma, VT = np.linalg.svd(img)SigRecon = np.asmatrix(np.diag(Sigma[:numSV]))reconMat = U[:,:numSV] * SigRecon * VT[:numSV,:]return reconMatif __name__ == "__main__":myMat = cv2.imread('data.jpg',0) # Loads image in grayscale modenumSV = [100, 50, 20, 10, 5]img = []for i in range(5):img.append(imgCompress(myMat, numSV=numSV[i]))plt.subplot(231),plt.imshow(myMat, cmap='gray'),plt.title('Original')for i in range(5):plt.subplot(232+i),plt.imshow(img[i], cmap='gray'),plt.title('numSV='+str(numSV[i]))plt.show()

  效果如下圖,可以看出壓縮到10個奇異值的時候,圖片特征還算明顯,可以看出這是homer simpson...

  處理彩色圖片上要復雜一點,因為有RGB三個通道的數據,對應的矩陣形狀是3維的。要用OpenCV中的split和merge函數分離三個通道數據最后再合并處理,我嘗試了幾次沒有成功就懶得再試了...
  有一點需要注意:cv2.imread()讀入彩色圖像時,返回的ndarray是按照B,G,R的順序排列的,而matplotlib中的plt.imshow()顯示彩色圖像時,是按照RGB的順序顯示的。可以用cv2.cvtColor(image , cv2.COLOR_BGR2RGB)進行轉換。

  • ?總結

  SVD是一種強大的降維工具,我們可以利用SVD來逼近矩陣并從中提取重要特征。

?

參考:

Machine Learning in Action ?chapter 14?Simplifying data?with the singular?value decomposition

《矩陣論》 戴華,科學出版社

《矩陣論簡明教程》 徐仲,科學出版社

《數學之美》 吳軍,第15章 矩陣運算和文本處理中的兩個分類問題

SVD分解算法及其應用

強大的矩陣奇異值分解(SVD)及其應用

談談SVD和LSA

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的利用奇异值分解(SVD)简化数据的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。