day 20 奇異值SVD分解

一、什么是奇異值

?二、核心思想:

三、奇異值的主要應用

1、降維:


2、數據壓縮:

原理:圖像可以表示為一個矩陣,矩陣的元素對應圖像的像素值。對這個圖像矩陣進行 SVD 分解后,小的奇異值對圖像的主要結構貢獻很小,它們往往對應于圖像中的細節和噪聲。通過丟棄這些小的奇異值,只保留較大的奇異值及其對應的列向量,再用保留的部分重建圖像矩陣,就可以在盡量保持圖像主要內容的同時,大幅減少存儲圖像所需的數據量。

3、去噪:

在很多實際數據中,噪聲往往表現為在各個方向上的微小干擾,反映在奇異值上就是一些較小的奇異值。通過丟棄這些小的奇異值及其對應的奇異向量,然后用剩下的較大奇異值部分重建數據矩陣,就可以有效地去除噪聲,提高數據的質量。

4、推薦系統:

在推薦系統中,用戶-物品評分矩陣通常存在很多缺失值,對評分矩陣R進行SVD分解后,保留前k個較大的奇異值及其對應的U、V的部分列向量,構建低秩矩陣來近似R。這樣就可以利用已知的評分來預測缺失的評分值,從而為用戶推薦可能感興趣的內容。

四、矩陣代碼實例

import numpy as np# 創建一個矩陣 A (5x3)
A = np.array([[1, 2, 3],[4, 5, 6],[7, 8, 9],[10, 11, 12],[13, 14, 15]])
print("原始矩陣 A:")
print(A)# 進行 SVD 分解
# full_matrices=False表示不計算完整的 U 和 V 矩陣,而是計算經濟規模的分解,用于降維場景
U, sigma, Vt = np.linalg.svd(A, full_matrices=False)
print("\n奇異值 sigma:")
print(sigma)# 分別保留前 k 個奇異值進行降維
for k in [1, 2, 3]:U_k = U[:, :k] # 取 U 的前 k 列,因為要保持行數不變sigma_k = sigma[:k] # 取前 k 個奇異值Vt_k = Vt[:k, :] # 取 Vt 的前 k 行,因為要保持列數不變# 近似重構矩陣 A,p.diag() 將 sigma_k 轉換為對角矩陣。@ 運算符表示矩陣乘法。A_approx = U_k @ np.diag(sigma_k) @ Vt_k# 近似誤差等于差異程度的弗羅貝尼烏斯范數(fro 值)占原始矩陣fro值的比例。error = np.linalg.norm(A - A_approx, 'fro') / np.linalg.norm(A, 'fro')print(f"k={k} 時的近似誤差: {error:.6f}")

k=1 時:原始3維列空間降為1維,使用U的第1列和Vt的第1行,結合第一個奇異值,重新擬合原矩陣,近似誤差僅為4.19%。

k=2 時:原始3維列空間降為2維,使用U的前2列Vt的前2行,結合前兩個奇異值,重新擬合原矩陣,此時已完全重構原始矩陣(誤差為0)。

k=3 時:使用全部3個左/右奇異向量,但第三個奇異值為0,沒有額外價值。

想象一個三維數據點云,SVD 分解會找到三個正交方向:

  • 第一個方向(對應最大奇異值):數據方差最大的方向,即數據點最 “伸展” 的方向。
  • 第二個方向(次大奇異值):與第一個方向正交且方差次大的方向。
  • 第三個方向(最小奇異值):與前兩個方向正交且方差最小的方向。

當用?k=1?降維時,相當于將數據投影到第一個方向上,保留最主要的特征。如果選擇第三個方向(最小奇異值),則會丟失所有重要信息。

五、機器學習代碼實例

1、如何確保測試集和訓練集降維到同?k 個特征空間?

訓練集和測試集需經過相同變換來保證數據分布一致,這是確保模型評估和泛化有效性的關鍵。

?任何線性變換(如矩陣乘法)都可以分解為旋轉 → 縮放 → 再旋轉三個步驟。?

為什么使用右奇異向量而不是左奇異向量??

2、代碼實例

import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score# 設置隨機種子以便結果可重復
np.random.seed(42)# 模擬數據:1000 個樣本,50 個特征
n_samples = 1000
n_features = 50
# 隨機生成特征數據,并改變數據尺度,使范圍大致在均值 0 附近,標準差變為 10
X = np.random.randn(n_samples, n_features) * 10 
y = (X[:, 0] + X[:, 1] > 0).astype(int)  # 模擬二分類標簽# 劃分訓練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
print(f"訓練集形狀: {X_train.shape}")
print(f"測試集形狀: {X_test.shape}")# 對訓練集進行 SVD 分解
U_train, sigma_train, Vt_train = np.linalg.svd(X_train, full_matrices=False)
print(f"Vt_train 矩陣形狀: {Vt_train.shape}")# 選擇保留的奇異值數量 k
k = 10
Vt_k = Vt_train[:k, :]  # 保留前 k 行,形狀為 (k, 50)
print(f"保留 k={k} 后的 Vt_k 矩陣形狀: {Vt_k.shape}")# 降維訓練集:X_train_reduced = X_train @ Vt_k.T
X_train_reduced = X_train @ Vt_k.T
print(f"降維后訓練集形狀: {X_train_reduced.shape}")# 使用相同的 Vt_k 對測試集進行降維:X_test_reduced = X_test @ Vt_k.T
X_test_reduced = X_test @ Vt_k.T
print(f"降維后測試集形狀: {X_test_reduced.shape}")# 訓練模型(以邏輯回歸為例)
model = LogisticRegression(random_state=42)
model.fit(X_train_reduced, y_train)# 預測并評估
y_pred = model.predict(X_test_reduced)
accuracy = accuracy_score(y_test, y_pred)
print(f"測試集準確率: {accuracy}")# 計算訓練集的近似誤差(可選,僅用于評估降維效果)
X_train_approx = U_train[:, :k] @ np.diag(sigma_train[:k]) @ Vt_k
error = np.linalg.norm(X_train - X_train_approx, 'fro') / np.linalg.norm(X_train, 'fro')
print(f"訓練集近似誤差 (Frobenius 范數相對誤差): {error}")

六、注意的問題?

1、標準化數據

不同特征可能具有不同的量綱(比如一個特征表示年齡,范圍可能是 0 - 100,另一個特征表示收入,可能是 0 - 1000000),如果不進行標準化,具有較大數值范圍的特征可能會在 SVD 計算中占據主導地位,從而影響降維結果。

標準化可以將所有特征轉化到相同的尺度,使得每個特征對降維的貢獻更加公平。可以使用 sklearn.preprocessing.StandardScaler。

from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)

對測試集?X_test調用transform方法,使用在訓練集上計算得到的均值和方差對測試集數據進行標準化。不能在測試集上使用fit_transform,否則會導致數據泄漏,會使模型評估結果過于樂觀。?

2、選擇合適的 k

可以通過累計方差貢獻率(explained variance ratio)選擇 k ,通常選擇解釋 90%-95% 方差的 k ?值,它可以幫助我們確定保留多少個奇異值能夠解釋大部分的數據方差。

# 表示前k個奇異值所解釋的方差(奇異值平方的累積和)占總方差的比例。
explained_variance_ratio = np.cumsum(sigma_train**2) / np.sum(sigma_train**2)
print(f"前 {k} 個奇異值的累計方差貢獻率: {explained_variance_ratio[k-1]}")

3、使用 sklearn 的 TruncatedSVD

對于大規模數據,完整的 SVD 計算可能非常耗時且占用大量內存。TruncatedSVD類專門用于高效降維,它直接計算前k個奇異值和向量,避免了完整 SVD 的計算開銷,提高了計算效率。

from sklearn.decomposition import TruncatedSVD
svd = TruncatedSVD(n_components=k, random_state=42)
X_train_reduced = svd.fit_transform(X_train)
X_test_reduced = svd.transform(X_test)
print(f"累計方差貢獻率: {sum(svd.explained_variance_ratio_)}")

@浙大疏錦行?

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

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

相關文章

符合Python風格的對象(對象表示形式)

對象表示形式 每門面向對象的語言至少都有一種獲取對象的字符串表示形式的標準方 式。Python 提供了兩種方式。 repr()   以便于開發者理解的方式返回對象的字符串表示形式。str()   以便于用戶理解的方式返回對象的字符串表示形式。 正如你所知,我們要實現_…

springboot配置tomcat端口的方法

在Spring Boot中配置Tomcat端口可通過以下方法實現: 配置文件方式 properties格式 在application.properties中添加:server.port8081YAML格式 在application.yml中添加:server:port: 8082多環境配置 創建不同環境的配置文件(如app…

DeepSeek指令微調與強化學習對齊:從SFT到RLHF

后訓練微調的重要性 預訓練使大模型獲得豐富的語言和知識表達能力,但其輸出往往與用戶意圖和安全性需求不完全匹配。業內普遍采用三階段訓練流程:預訓練 → 監督微調(SFT)→ 人類偏好對齊(RLHF)。預訓練階段模型在大規模語料上學習語言規律;監督微調利用人工標注的數據…

Maven 插件擴展點與自定義生命周期

🧑 博主簡介:CSDN博客專家,歷代文學網(PC端可以訪問:https://literature.sinhy.com/#/?__c1000,移動端可微信小程序搜索“歷代文學”)總架構師,15年工作經驗,精通Java編…

ecmascript 第6版特性 ECMA-262 ES6

https://blog.csdn.net/zlpzlpzyd/article/details/146125018 在之前寫的文章基礎上,ES6在export和import的基礎外,還有如下特性 特性說明let/const塊級作用域變量聲明>箭頭函數Promise異步編程

CT重建筆記(五)—2D平行束投影公式

寫的又回去了,因為我發現我理解不夠透徹,反正想到啥寫啥,盡量保證內容質量好簡潔易懂 2D平行束投影公式 p ( s , θ ) ∫ ∫ f ( x , y ) δ ( x c o s θ y s i n θ ? s ) d x d y p(s,\theta)\int \int f(x,y)\delta(x cos\theta ysi…

記一次緩存填坑省市區級聯獲取的操作

先說緩存是什么? 緩存主要是解決高并發,大數據場景下,熱點數據快速訪問。緩存的原則首先保證數據的準確和最終數據一致,其次是距離用戶越近越好,同步越及時越好。 再說我們遇到的場景: 接手項目后&#…

無法加載文件 E:\Program Files\nodejs\npm.ps1,因為在此系統上禁止運行腳本

遇到“無法加載文件 E:\Program Files\nodejs\npm.ps1,因為在此系統上禁止運行腳本”這類錯誤,通常是因為你的 PowerShell 執行策略設置為不允許運行腳本。在 Windows 系統中,默認情況下,出于安全考慮,PowerShell 可能會阻止運行未…

OpenWebUI新突破,MCPO框架解鎖MCP工具新玩法

大家好,Open WebUI 迎來重要更新,現已正式支持 MCP 工具服務器,但 MCP 工具服務器需由兼容 OpenAPI 的代理作為前端。mcpo 是一款實用代理,經測試,它能讓開發者使用 MCP 服務器命令和標準 OpenAPI 服務器工具&#xff…

松下SMT貼片機選型與高效應用指南

內容概要 在電子制造領域,SMT貼片機作為核心生產設備,其選型與應用直接關系到企業產能與產品質量。本文聚焦松下SMT貼片機系列,通過系統性梳理設備選型邏輯與技術特性,為制造企業提供多維度的決策參考。重點涵蓋主流機型性能參數…

計算機網絡(1)——概述

1.計算機網絡基本概念 1.1 什么是計算機網絡 計算機網絡的產生背景 在計算機網絡出現之前,計算機之間都是相互獨立的,每臺計算機只能訪問自身存儲的數據,無法與其他計算機進行數據交換和資源共享。這種獨立的計算機系統存在諸多局限性&#…

React學習(二)-變量

也是很無聊,竟然寫這玩意,畢竟不是學術研究,普通工作沒那么多概念性東西,會用就行╮(╯▽╰)╭ 在React中,變量是用于存儲和管理數據的基本單位。根據其用途和生命周期,React中的變量可以分為以下幾類&…

完整卸載 Fabric Manager 的方法

目錄 ? 完整卸載 Fabric Manager 的方法 1?? 停止并禁用服務 2?? 卸載 Fabric Manager 軟件包 3?? 自動清理無用依賴(可選) 4?? 檢查是否卸載成功 ? 補充(僅清除服務,不刪包) ? 完整卸載 Fabric Mana…

ABP vNext 多租戶開發實戰指南

🚀 ABP vNext 多租戶開發實戰指南 🛠? 環境:.NET 8.0 ABP vNext 8.1.5 (C# 11, EF Core 8) 📚 目錄 🚀 ABP vNext 多租戶開發實戰指南🏠 一、什么是多租戶?📦 二、ABP 多租戶的核…

【WIN】筆記本電腦忘記密碼解決辦法/筆記本電腦重裝系統筆記/bitlocker忘記密碼的解決辦法

通過安全模式下的CMD命令找回 具體的步驟就是: 首先通過筆記本的對應的一個進入安全模式的一個方式 進入安全模式之后,一直點著這個診斷,然后高級選項進去就可以看到了。 但是這種方法應該是屬于安全漏洞,所以只適合老版本。如果是…

人工智能100問?第25問:什么是循環神經網絡(RNN)?

目錄 一、通俗解釋 二、專業解析 三、權威參考 循環神經網絡(RNN)是一種通過“記憶”序列中歷史信息來處理時序數據的神經網絡,可捕捉前后數據的關聯性,擅長處理語言、語音等序列化任務。 一、通俗解釋 想象你在和朋友聊天,每說一句話都會根據之前的對話內容調整語氣…

實驗八 基于Python的數字圖像問題處理

一、實驗目的 ? 培養利用圖像處理技術解決實際問題的能力。 ? 培養利用圖像處理技術綜合設計實現的能力。 ? 掌握在Python環境下解決實際問題的能力。 ? 熟練掌握使用cv2庫對圖像進行處理 ? 熟練掌握使用區域生長法提取圖片中感興趣的區域 二、實驗內容 本次實驗內容為…

STM32F10xx 參考手冊

6. 什么是寄存器 本章參考資料:《STM32F10xx 參考手冊》、《STM32F10xx數據手冊》、 學習本章時,配合《STM32F10xx 參考手冊》“存儲器和總線架構”及“通用I/O(GPIO)”章節一起閱讀,效果會更佳,特別是涉及到寄存器說明的部分。…

TCVectorDB 向量數據庫簡介

簡介 盡管目前大多數開源向量數據庫來自海外,配置簡單且性能優異,但由于網絡原因,如果向量數據庫部署在海外,而產品面向國內市場,網絡延遲將是必須考慮的問題。因此,選擇國內服務提供商的云向量數據庫往往是…

力扣-比特位計數(統計一個數二進制下1的個數)

下面是題面 1.用c的內置函數__builtin_popcount() 語法:__builtin_popcount(int x),函數會返回一個二進制下x所含的1的個數 2.直接數位枚舉 這是最慢也是暴力做法,寫法也很簡單 用一個while循環…