python打卡day20

特征降維------特征組合(以SVD為例)

知識點回顧:

奇異值的應用:

  • 特征降維:對高維數據減小計算量、可視化
  • 數據重構:比如重構信號、重構圖像(可以實現有損壓縮,k 越小壓縮率越高,但圖像質量損失越大)
  • 降噪:通常噪聲對應較小的奇異值。通過丟棄這些小奇異值并重構矩陣,可以達到一定程度的降噪效果。
  • 推薦系統:在協同過濾算法中,用戶-物品評分矩陣通常是稀疏且高維的。SVD (或其變種如 FunkSVD, SVD++) 可以用來分解這個矩陣,發現潛在因子 (latent factors),從而預測未評分的項。這里其實屬于特征降維的部分。

作業:嘗試利用svd來處理心臟病預測,看下精度變化

對于任何矩陣,均可做等價的奇異值SVD分解?A=UΣV?,對于分解后的矩陣,可以選取保留前K個奇異值及其對應的奇異向量,重構原始矩陣,可以通過計算Frobenius 范數相對誤差來衡量原始矩陣和重構矩陣的差異。

  • U矩陣:描述行之間的關系,列向量來自AA?的特征向量,而AA?計算的是行之間的相似性(因為A的每一行代表一個樣本)
  • Σ矩陣:告訴我們哪些模式最重要(奇異值越大越重要,是按降序排列的)
  • V?矩陣:描述列之間的關系,列向量來自A?A的特征向量,而A?A計算的是列之間的相似性(因為A的每一列代表一個特征)

應用:結構化數據中,將原來的m個特征降維成k個新的特征,新特征是原始特征的線性組合,捕捉了數據的主要方差信息,降維后的數據可以直接用于機器學習模型(如分類、回歸),通常能提高計算效率并減少過擬合風險。

ps:在進行 SVD 之前,通常需要對數據進行標準化(均值為 0,方差為 1),以避免某些特征的量綱差異對降維結果的影響。

具體說說通過奇異值來降維,本質上通過數學變換創造新特征,這種方法是許多降維算法(如 PCA)和數據處理技術的基礎,具體三步搞定:

  • 分解:對原始矩陣A做SVD得到?A?= UΣV?
  • 篩選:選擇前k個奇異值(如何選k見下方規則)
  1. 固定數量法(最簡單):直接指定保留前k個(如k=10),適用于對數據維度有明確要求時
  2. 能量占比法(最常用):計算奇異值平方和(總能量),選擇使前k個奇異值平方和占比>閾值(如95%)
  3. 拐點法(可視化判斷):奇異值下降曲線明顯變平緩的點作為k
  • 重構:用U的前k列、Σ的前k個值、V?的前k行重構近似矩陣?A??= U?Σ?V??

1.初步理解

下面用一個簡單的矩陣實現SVD降維

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 分解
U, sigma, Vt = np.linalg.svd(A, full_matrices=False)
print("\n奇異值 sigma:")
print(sigma)# 保留前 k=1 個奇異值進行降維
k = 1
U_k = U[:, :k]  # 取 U 的前 k 列,因為要保持行數不變
sigma_k = sigma[:k]  # 取前 k 個奇異值
Vt_k = Vt[:k, :]  # 取 Vt 的前 k 行,因為要保持列數不變# 近似重構矩陣 A,常用于信號or圖像篩除噪聲
A_approx = U_k @ np.diag(sigma_k) @ Vt_k
print("\n保留前", k, "個奇異值后的近似矩陣 A_approx:")
print(A_approx)# 計算近似誤差
error = np.linalg.norm(A - A_approx, 'fro') / np.linalg.norm(A, 'fro')
print("\n近似誤差 (Frobenius 范數相對誤差):", error)

這里的Frobenius 范數相對誤差的計算方式有點難理解,舉一個更簡單的例子說明一下:

2.實際運用到數據集里

難點就是對于測試集要用訓練集相同的SVD分解規則,即相同的變換

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
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}")

收獲心得:

SVD降維的難點就是數學關系以及維度轉換后是否正確,線性代數要學好啊,唉

@浙大疏錦行

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

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

相關文章

GuPPy-v1.2.0安裝與使用-生信工具52

GuPPy:Python中用于光纖光度數據分析的免費開源工具 01 背景 Basecalling 是將原始測序信號轉換為堿基序列的過程,通俗地說,就是“把堿基識別出來”。這一過程在不同代測序技術中各不相同: 一代測序是通過解析峰圖實現&#xff1…

47. 全排列 II

題目 給定一個可包含重復數字的序列 nums ,按任意順序 返回所有不重復的全排列。 示例 1: 輸入:nums [1,1,2] 輸出: [[1,1,2],[1,2,1],[2,1,1]] 示例 2: 輸入:nums [1,2,3] 輸出:[[1,2,3…

ERP系統操作流程,如何快速搭建流程體系

ERP流程圖,如何搭建和建立,ERP系統操作流程,ERP系統操作流程圖,采購流程,銷售流程,倉庫流程,MRP流程,PMC流程,財務流程,應收流程,應付流程&#x…

class path resource [] cannot be resolved to absolute file path

問題情景 java應用程序在IDE運行正常,打成jar包后執行卻發生異常: java.io.FileNotFoundException: class path resource [cert/sync_signer_pri_test.key] cannot be resolved to absolute file path because it does not reside in the file system:…

19、HashTable(哈希)、位圖的實現和布隆過濾器的介紹

一、了解哈希【散列表】 1、哈希的結構 在STL中,HashTable是一個重要的底層數據結構, 無序關聯容器包括unordered_set, unordered_map內部都是基于哈希表實現 哈希表又稱散列表,一種以「key-value」形式存儲數據的數據結構。哈希函數:負責將…

基于 Flask的深度學習模型部署服務端詳解

基于 Flask 的深度學習模型部署服務端詳解 在深度學習領域,訓練出一個高精度的模型只是第一步,將其部署到生產環境中,為實際業務提供服務才是最終目標。本文將詳細解析一個基于 Flask 和 PyTorch 的深度學習模型部署服務端代碼,幫…

Vue3 + Node.js 實現客服實時聊天系統(WebSocket + Socket.IO 詳解)

Node.js 實現客服實時聊天系統(WebSocket Socket.IO 詳解) 一、為什么選擇 WebSocket? 想象一下淘寶客服的聊天窗口:你發消息,客服立刻就能看到并回復。這種即時通訊效果是如何實現的呢?我們使用 Vue3 作…

MySQL數據庫與表結構操作指南

前言:本文系統梳理MySQL核心操作語句。內容覆蓋建庫建表、結構調整、數據遷移全流程(包含創建/修改/刪除/備份場景)。希望它們能幫你快速解決問題。 庫結構操作 一、庫的創建 一個庫的簡單創建: create database 庫名; 注意&am…

【WEB3】區塊鏈、隱私計算、AI和Web3.0——數據民主化(1)

區塊鏈、隱私計算、AI,是未來Web3.0至關重要的三項技術。 1.數據民主化問題 數據在整個生命周期(生產、傳輸、處理、存儲)內的隱私安全,則是Web3.0在初始階段首要解決的問題。 數據民主化旨在打破數據壟斷,讓個體能…

C語言—指針2

1. const 修飾變量 1.1 const修飾變量 變量被const修飾時,變量此時為常變量,本質為常量,語法上不可被修改,但是如果此時需要修改變量值,可以通過指針的方式修改。 雖然此時通過指針的方式確實修改了變量的值&#xff…

高級架構軟考之網絡OSI網絡模型

高級架構軟考之網絡: 1.OSI網絡模型: a.物理層: a.物理傳輸介質物理連接,負責數據傳輸,并監控數據 b.傳輸單位:bit c.協議: d:對應設備:中繼器、集線器 b.數據鏈路層: a.…

el-table計算表頭列寬,不換行顯示

1、在utils.js中封裝renderHeader方法 2、在el-table-column中引入: 3、頁面展示:

MySQL OCP和Oracle OCP怎么選?

近期oracle 為慶祝 MySQL 數據庫發布 30 周年,Oracle 官方推出限時福利:2025 年 4 月 20 日至 7 月 31 日期間,所有人均可免費報考 MySQL OCP(Oracle Certified Professional)認證考試(具體可查看MySQL OCP…

2025最新免費視頻號下載工具!支持Win/Mac,一鍵解析原畫質+封面

軟件介紹 適用于Windows 2025 最新5月蝴蝶視頻號下載工具,免費使用,無廣告且免費,支持對原視頻和封面進行解析下載,親測可用,現在很多工具都失效了,難得的幾款下載視頻號工具,大家且用且珍…

Python學習之路(八)-多線程和多進程淺析

在 Python 中,多線程(Multithreading) 和 多進程(Multiprocessing) 是實現并發編程的兩種主要方式。它們各有優劣,適用于不同的場景。 一、基本概念 特性多線程(threading)多進程(multiprocessing)并發模型線程共享內存空間每個進程擁有獨立內存空間GIL(全局解釋器鎖…

Spark緩存--persist方法

1. 功能本質 persist:這是一個通用的持久化方法,能夠指定多種不同的存儲級別。存儲級別決定了數據的存儲位置(如內存、磁盤)以及存儲形式(如是否序列化)。 2. 存儲級別指定 persist:可以通過傳入…

裸辭8年前端的面試筆記——JavaScript篇(一)

裸辭后的第二個月開始準備找工作,今天是第三天目前還沒有面試,現在的行情是一言難盡,都在瘋狂的壓價。 下邊是今天復習的個人筆記 一、事件循環 JavaScript 的事件循環(Event Loop)是其實現異步編程的關鍵機制。 從…

什么是死信隊列?死信隊列是如何導致的?

死信交換機(Dead Letter Exchange,DLX) 定義:死信交換機是一種特殊的交換機,專門用于**接收從其他隊列中因特定原因變成死信的消息**。它的本質還是交換機,遵循RabbitMQ中交換機的基本工作原理&#xff0c…

9. 從《蜀道難》學CSS基礎:三種選擇器的實戰解析

引言:當古詩遇上現代網頁設計 今天我們通過李白的經典詩作《蜀道難》來學習CSS的三種核心選擇器。這種古今結合的學習方式,既能感受中華詩詞的魅力,又能掌握實用的網頁設計技能。讓我們開始這場穿越時空的技術之旅吧! 一、HTML骨架…

三角網格減面算法及其代表的算法庫都有哪些?

以下是三角網格減面算法及其代表庫/工具的詳細分類,涵蓋經典算法和現代實現: ??1. 頂點聚類(Vertex Clustering)?? ??原理??:將網格空間劃分為體素柵格,合并每個柵格內的頂點。??特點??&#…