svd降維 python案例_SVD(奇異值分解)Python實現

注: 在《SVD(異值分解)小結 》中分享了SVD原理,但其中只是利用了numpy.linalg.svd函數應用了它,并沒有提到如何自己編寫代碼實現它,在這里,我再分享一下如何自已寫一個SVD函數。但是這里會利用到SVD的原理,如何大家還不明白它的原理,可以去看看《SVD(異值分解)小結 》,或者自行百度/google。

1、SVD算法實現

1.1 SVD原理簡單回顧

有一個\(m \times n\)的實數矩陣\(A\),我們可以將它分解成如下的形式

\[

A = U\Sigma V^T

\tag{1-1}

\]

其中\(U\)和\(V\)均為單位正交陣,即有\(UU^T=I\)和\(VV^T=I\),\(U\)稱為左奇異矩陣,\(V\)稱為右奇異矩陣,\(\Sigma\)僅在主對角線上有值,我們稱它為奇異值,其它元素均為0。上面矩陣的維度分別為\(U \in \mathbf{R}^{m\times m},\ \Sigma \in \mathbf{R}^{m\times n}\),\(\ V \in \mathbf{R}^{n\times n}\)。

正常求上面的\(U,V,\Sigma\)不便于求,我們可以利用如下性質

\[

AA^T=U\Sigma V^TV\Sigma^TU^T=U\Sigma \Sigma^TU^T

\tag{1-2}

\]

\[

A^TA=V\Sigma^TU^TU\Sigma V^T=V\Sigma^T\Sigma V^T

\tag{1-3}

\]

1.2 SVD算法

據1.1小節,對式(1-3)和式(1-4)做特征值分解,即可得到奇異值分解的結果。但是樣分開求存在一定的問題,由于做特征值分解的時候,特征向量的正負號并不影響結果,比如,我們利用式(1-3)和(1-4)做特征值分解

\[

AA^T\mathbf{u}_i = \sigma_i \mathbf{u}_i\quad \text{or} \quad AA^T(-\mathbf{u}_i) = \sigma_i (-\mathbf{u}_i)\\

A^TA\mathbf{v}_i = \sigma_i \mathbf{v}_i\quad \text{or} \quad A^TA(-\mathbf{v}_i) = \sigma_i (-\mathbf{v}_i)

\]

如果在計算過程取,取上面的\(\mathbf{u}_i\)組成左奇異矩陣\(U\),取\(-\mathbf{v}_i\)組成右奇異矩陣\(V\),此時\(A\ne U\Sigma V^T\)。因此求\(\mathbf{v}_i\)時,要根據\(\mathbf{u}_i\)來求,這樣才能保證\(A= U\Sigma V^T\)。因此,我們可以得出如下1.1計算SVD的算法。它主要是先做特性值分解,再根據特征值分解得到的左奇異矩陣\(U\)間接地求出部分的右奇異矩陣\(V'\in \mathbf{R}^{m\times n}\)。

算法1.1:SVD

輸入:樣本數據

輸出:左奇異矩陣,奇異值矩陣,右奇異矩陣

計算特征值: 特征值分解\(AA^T\),其中\(A \in \mathbf{R}^{m\times n}\)為原始樣本數據

\[

AA^T=U\Sigma \Sigma^TU^T

\]

得到左奇異矩陣\(U \in \mathbf{R}^{m \times m}\)和奇異值矩陣\(\Sigma' \in \mathbf{R}^{m \times m}\)

間接求部分右奇異矩陣: 求\(V' \in \mathbf{R}^{m \times n}\)

利用\(A=U\Sigma'V'\)可得

\[

V' = (U\Sigma')^{-1}A = (\Sigma')^{-1}U^TA

\tag{1-4}

\]

返回\(U,\ \Sigma',\ V'\),分別為左奇異矩陣,奇異值矩陣,右奇異矩陣。

注: 這里得到的\(\Sigma'\)和\(V'\)與式(1-2)所得到的\(\Sigma,\ V\)有區別,它們的維度不一樣。\(\Sigma'\)是只取了前\(m\)個奇異值形成的對角方陣,即\(\Sigma' \in \mathbf{R}^{m \times m}\);\(V'\)不是一個方陣,它只取了\(V \in \mathbf{R}^{m \times n}\)的前\(m\)行(假設\(m < n\)),即有\(V' = V(:m,\cdot)\)。這樣一來,我們同樣有類似式(1-1)的數學關系成立,即

\[

A = U\Sigma' (V')^T\tag{1-5}

\]

我們可以利用此關系重建原始數據。

2、SVD的Python實現

以下代碼的運行環境為python3.6+jupyter5.4。

2.1 SVD實現過程

讀取數據

這里面的數據集大家隨便找一個數據就好,如果有需要我的數據集,可以下在面留言。

import numpy as np

import pandas as pd

from scipy.io import loadmat

# 讀取數據,使用自己數據集的路徑。

train_data_mat = loadmat("../data/train_data2.mat")

train_data = train_data_mat["Data"]

print(train_data.shape)

特征值分解

# 數據必需先轉為浮點型,否則在計算的過程中會溢出,導致結果不準確

train_dataFloat = train_data / 255.0

# 計算特征值和特征向量

eval_sigma1,evec_u = np.linalg.eigh(train_dataFloat.dot(train_dataFloat.T))

計算右奇異矩陣

#降序排列后,逆序輸出

eval1_sort_idx = np.argsort(eval_sigma1)[::-1]

# 將特征值對應的特征向量也對應排好序

eval_sigma1 = np.sort(eval_sigma1)[::-1]

evec_u = evec_u[:,eval1_sort_idx]

# 計算奇異值矩陣的逆

eval_sigma1 = np.sqrt(eval_sigma1)

eval_sigma1_inv = np.linalg.inv(np.diag(eval_sigma1))

# 計算右奇異矩陣

evec_part_v = eval_sigma1_inv.dot((evec_u.T).dot(train_dataFloat))

上面的計算出的evec_u, eval_sigma1, evec_part_v分別為左奇異矩陣,所有奇異值,右奇異矩陣。

2.2 SVD降維后重建數據

取不同個數的奇異值,重建圖片,計算出均方誤差,如圖2-1所示。從圖中可以看出,隨著奇異值的增加,均方誤差(MSE)在減小,且奇異值和的比率正快速上升,在100維時,奇異值占總和的53%。

圖2-1 奇值分解維度和均方誤差變化圖

注: 均方誤差MSE有如下計算公式

\[

\text{MSE} = \frac{1}{n}\left((y_1-y_1')^2+(y_2-y_2')^2+\cdots+(y_n-y_n')^2\right)

\]

我們平時聽到的\(\text{RMSE}=\sqrt{\text{MSE}}\)。

將圖和10、50、100維的圖進行比較,如圖3-2所示。在直觀上,100維時,能保留較多的信息,此時能從圖片中看出車輛形狀。

圖2-2 原圖與降維重建后的圖比較

總結

SVD與特征值分解(EVD)非常類似,應該說EVD只是SVD的一種特殊懷況。我們可以通這它們在實際的應用中返過來理解特征值/奇異值的含義:它代表著數據的信息量,它的值越大,信息越多。

最近作業是真的多呀,冒著生命危險來分享,希望能給大家帶來幫助

By ? 2017 likecs 版權所有.

粵ICP備12038626號-2

Powered By WordPress . Theme by Luju

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/533991.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/533991.shtml
英文地址,請注明出處:http://en.pswp.cn/news/533991.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

salt 啟動mysql_saltsack自動化配置day03:服務部署mysql部署

一、MySQL集群需求分享1、抽象&#xff1a;功能模塊把基礎的寫成通用服務部署也要抽象出來模塊redis內存有的多&#xff0c;有的少&#xff0c;可以config set在線更改redis 安裝、配置、啟動mysql 安裝、配置(my.cnf可以統一 目錄默認配置可以統一)master: server_id 1111slav…

jtag引腳定義_從逆向分析的角度學習硬件調試技巧JTAG,SSD和固件提取

我想從逆向的角度做了深入了解JTAG&#xff0c;JTAG是許多嵌入式CPU使用的硬件級別調試機制&#xff0c;我希望通過這篇文章從逆向工程師的角度解釋如何使用JTAG&#xff0c;并在此過程中提供一些實際示例。0x01 研究目標通過這篇文章&#xff0c;我希望做到以下幾點&#xff1…

python virtualenv conda_在vscode中啟動conda虛擬環境的思路詳解

問題&#xff1a;cudatoolkit cudnn 通過conda 虛擬環境安裝&#xff0c;先前已經使用virtualenv安裝tf&#xff0c;需要在conda虛擬環境中啟動外部python虛擬環境思路&#xff1a;conda prompt即將 [虛擬環境位置] 以參數形式傳入 [activate.bat]VSOCDE中的設置添加以下語句{&…

python如何導入圖片imread_OpenCV 使用imread()函數讀取圖片的六種正確姿勢

經常看到有人在網上詢問關于imread()函數讀取圖片失敗的問題。今天心血來潮&#xff0c;經過實驗&#xff0c;總結出imread()調用的四種正確姿勢。通常我要獲取一張圖片的絕對路徑是這樣做的&#xff1a;在圖片上右鍵——屬性——安全——對象名稱。然后復制對象名稱就得到了圖…

python2.7與3.7腳本轉換_python 2.7 - python 3.7 升級記錄

更換的模塊python 3.7 模塊名python 2.7 模塊名python 3.7 包python 2.7包pymysqlMySQLdbPyMySQLMySQL-pythonpdfminerpdfminerpdfminer.sixpdfminerurllib.parseurlparse自帶自帶htmlHTMLParser自帶HTMLparser語法變化1. print 修改為 print()2. except Exception, e 修改為 e…

遠程過程調用失敗_Java開發大型互聯網RPC遠程調用服務實現之問題處理方案

引言RPC(Remote Procedure Call Protocol)——遠程過程調用協議&#xff0c;它是一種通過網絡從遠程計算機程序上請求服務&#xff0c;而不需要了解底層網絡技術的協議。RPC協議假定某些傳輸協議的存在&#xff0c;如TCP或UDP&#xff0c;為通信程序之間攜帶信息數據。在OSI網絡…

chrome 新的session 設置_為什么還是由這么多人搞不懂Cookie、Session、Token?

作者&#xff1a;不學無數的程序員鏈接&#xff1a;https://urlify.cn/Yfm6Vr# Cookie洛&#xff1a;大爺&#xff0c;樓上322住的是馬冬梅家吧&#xff1f; 大爺&#xff1a;馬都什么&#xff1f; 夏洛&#xff1a;馬冬梅。 7大爺&#xff1a;什么都沒啊&#xff1f; 夏洛…

mysql for update用處_for update的作用和用法

一、for update定義for update是一種行級鎖&#xff0c;又叫排它鎖&#xff0c;一旦用戶對某個行施加了行級加鎖&#xff0c;則該用戶可以查詢也可以更新被加鎖的數據行&#xff0c;其它用戶只能查詢但不能更新被加鎖的數據行&#xff0e;如果其它用戶想更新該表中的數據行&…

python大數據零基礎_零基礎學習大數據人工智能,學習路線篇!

大數據處理技術怎么學習呢?首先我們要學習Python語言和Linux操作系統&#xff0c;這兩個是學習大數據的基礎&#xff0c;學習的順序不分前后。Python&#xff1a;Python 的排名從去年開始就借助人工智能持續上升&#xff0c;現在它已經成為了語言排行第一名。從學習難易度來看…

python刪除文件和linux刪除文件區別_使用Python批量刪除文件列表

使用Python批量刪除文件列表環境&#xff1a;已知要刪除的文件列表&#xff0c;即確定哪些文件要刪除。代碼如下&#xff1a;#!/usr/bin/env python#codingutf-8#目的&#xff1a;本程序主要為刪除給定的文件列表import osimport shutil#引入模塊&#xff0c;os為包含普遍的操作…

華為python有必要學嗎_【華為云技術分享】這個 Python 庫有必要好好學學

這里看一個最基本的例子&#xff0c;這里給到一個 User 的 Class 定義&#xff0c;再給到一個 data 數據&#xff0c;像這樣&#xff1a;1 class User(object):2 def __init__(self, name, age):3 self.name name4 self.age age56 data [{7 name: Germey,8 age: 239 }, {10 nam…

python求平行四邊形面積_python 已知平行四邊形三個點,求第四個點的案例

我就廢話不多說了&#xff0c;大家還是直接看代碼吧&#xff01;import numpy as np#已知平行四邊形三個點&#xff0c;求第四個點#計算兩點之間的距離def CalcEuclideanDistance(point1,point2):vec1 np.array(point1)vec2 np.array(point2)distance np.linalg.norm(vec1 -…

eview面板數據之混合回歸模型_【視頻教程】Eviews系列25|面板數據回歸分析之Hausman檢驗及本章常見問題解答...

點擊上方關注我們!本期我們學習Eviews統計建模最后一部分--面板數據回歸分析Hausman檢驗及本章常見問題解答。實操&#xff1a;Hausman檢驗判斷是固定效應模型還是隨機效應模型上期我們講到模型判斷若選擇模型2,需進一步通過Hausman檢驗判斷固定效應還是隨機效應&#xff0c;接…

python打出由邊框包圍的_python opencv 圖像邊框(填充)添加及圖像混合的實現方法(末尾實現類似幻燈片漸變的效果)...

圖像邊框的實現圖像邊框設計的主要函數cv.copyMakeBorder()——實現邊框填充主要參數如下&#xff1a;參數一&#xff1a;源圖像——如&#xff1a;讀取的img參數二——參數五分別是&#xff1a;上下左右邊的寬度——單位&#xff1a;像素參數六&#xff1a;邊框類型&#xff1…

mysql5.7.21備份腳本_Shell腳本使用匯總整理——mysql數據庫5.7.8以后備份腳本

#!/bin/sh#db_backups_conf.txt文件路徑db_backups_conf"/wocloud/shell/db_backups_conf.txt"#判斷文件是否存在if [ -f "${db_backups_conf}" ];thenecho $(date %Y-%m-%d %H:%M:%S)" 數據庫配置信息文件存在&#xff0c;開始進行數據備份"#獲…

python嵌套列表操作_python基礎(list列表的操作,公共方法,列表嵌套,元祖)...

list 列表索引&#xff0c;切片與str相同。列表的操作(增刪改查)1&#xff0c;增加.append()  追加&#xff0c;增加到最后li [alex,wusir,egon,女神,taibai]li.append(ppp)print(li).insert()  中間插入&#xff0c;通過索引li [alex,wusir,egon,女神,taibai]li.insert(…

mybatis mysql selectkey_Mybatis示例之SelectKey的應用

SelectKey在Mybatis中是為了解決Insert數據時不支持主鍵自動生成的問題&#xff0c;他可以很隨意的設置生成主鍵的方式。不管SelectKey有多好&#xff0c;盡量不要遇到這種情況吧&#xff0c;畢竟很麻煩。SelectKey需要注意order屬性&#xff0c;像Mysql一類支持自動增長類型的…

python程序設計上機實踐第三章答案_20192419 實驗三《Python程序設計》實驗報告

學號 2019-2020-2 《Python程序設計》實驗3報告課程&#xff1a;《Python程序設計》班級&#xff1a;1924姓名&#xff1a; 萬騰陽學號&#xff1a;20192419實驗教師&#xff1a;王志強實驗日期&#xff1a;2020年5月16日必修/選修&#xff1a; 公選課1.實驗內容創建服務端和客…

完成數獨的算法 python_python實現數獨算法實例

本文實例講述了python實現數獨算法的方法。分享給大家供大家參考。具體如下&#xff1a;# -*- coding: utf-8 -*-Created on 2012-10-5author: Administratorfrom collections import defaultdictimport itertoolsa [[ 0, 7, 0, 0, 0, 0, 0, 0, 0], #0[ 5, 0, 3, 0, 0, 6, 0, …

python讀取多個文件csv_Python:讀取多個文本文件并寫入相應的csv文件

我在別處找不到這個問題的答案&#xff0c;所以我將繼續把它貼在這里&#xff1a;我有一個Python腳本&#xff0c;它將讀取文本文件的內容&#xff0c;將其內容拆分為單詞&#xff0c;然后輸出一個CSV文件&#xff0c;該文件將文本縮減為單詞頻率列表。(最后&#xff0c;我將插…