【機器學習】基于t-SNE的MNIST數據集可視化探索

?一、前言

????????在機器學習和數據科學領域,高維數據的可視化是一個極具挑戰但又至關重要的問題。高維數據難以直觀地理解和分析,而有效的可視化方法能夠幫助我們發現數據中的潛在結構、模式和關系。本文以經典的MNIST手寫數字數據集為例,探討如何利用t-分布隨機鄰域嵌入(t-SNE)這一強大的降維技術,將高維的圖像數據降維到二維空間,并進行可視化展示。通過本文,我們將深入了解t-SNE的原理、算法步驟,以及如何在Python中實現并應用它,從而更好地理解和探索高維數據的內在特性。


二、技術與原理簡介

????????在深入探討t-SNE之前,我們首先需要區分機器學習中的兩大主要范疇:監督學習和無監督學習。

????????1.?監督學習

????????監督學習是指在已知輸入數據和對應標簽的情況下,訓練模型學習輸入與輸出之間的映射關系。模型通過學習大量的帶標簽數據,能夠對新的、未見過的數據進行預測或分類。常見的監督學習算法包括:

  • 線性回歸:?用于預測連續型變量。
  • 邏輯回歸:?用于分類問題。
  • 支持向量機 (SVM):?用于分類和回歸問題,尤其擅長處理高維數據。
  • 決策樹:?基于樹狀結構進行決策,易于理解和解釋。
  • 隨機森林:?集成多個決策樹,提高預測的準確性和魯棒性。
  • 神經網絡:?模擬人腦神經元結構,能夠學習復雜的非線性關系。

????????2. 無監督學習

????????無監督學習是指在沒有標簽的情況下,訓練模型發現數據中的潛在結構和模式。模型通過分析數據的內在特征,能夠進行聚類、降維、關聯規則挖掘等任務。常見的無監督學習算法包括:

  • 聚類:?將數據劃分為不同的簇,使得同一簇內的數據相似度較高,不同簇之間的數據相似度較低。常見的聚類算法包括K-means、層次聚類、DBSCAN等。
  • 降維:?將高維數據降維到低維空間,同時盡可能保留數據的關鍵信息。常見的降維算法包括主成分分析 (PCA)、t-SNE、UMAP等。
  • 關聯規則挖掘:?發現數據中不同項之間的關聯關系,例如購物籃分析。

????????3. 監督學習與無監督學習的區別

? ? ? ? 4. MNIST數據集簡介

????????MNIST (Modified National Institute of Standards and Technology database) 是一個經典的手寫數字數據集,廣泛應用于機器學習和深度學習領域。它包含60,000個訓練樣本和10,000個測試樣本,每個樣本都是一個28x28像素的灰度圖像,代表0到9之間的手寫數字。

????????4.1 數據格式

????????MNIST數據集通常以兩種格式提供:

  • 圖像格式:?每個樣本都是一個圖像文件,例如PNG或JPEG格式。
  • 數值格式:?每個樣本都被轉換為一個784維的向量,其中每個元素代表一個像素的灰度值 (0到255)。

? ? ? ?4.2 數據集特點

  • 規模適中:?MNIST數據集的規模適中,既可以用于快速原型驗證,又可以用于訓練復雜的模型。
  • 易于獲取:?MNIST數據集可以從多個來源免費獲取,例如Scikit-learn、TensorFlow等。
  • 廣泛應用:?MNIST數據集被廣泛應用于各種機器學習和深度學習算法的評估和比較。

? ? ? ? 5. t-SNE算法原理與數學推導

? ? ? ? 5.1 算法核心思想

????????t-SNE(t-Distributed Stochastic Neighbor Embedding)是一種非線性降維技術,通過以下步驟實現高維數據到低維空間的映射:

  1. 計算高維相似度:在原始空間中,計算每對樣本間的相似度
  2. 構建低維嵌入空間:在目標空間(如2D)中,通過優化使相似度分布匹配
  3. 梯度下降優化:最小化兩空間分布的KL散度

? ? ? ? 5.2 數學公式詳解

????????5.2.1 高維相似度計算

????????對原始空間中的樣本對(𝑥𝑖,𝑥𝑗) ,定義條件概率:

其中𝜎𝑖 ?為高斯核帶寬,通過二分查找確定以滿足** perplexity **參數(控制鄰域大小)。

????????5.2.2 低維相似度建模

????????在目標空間中,定義聯合概率:

????????采用t-分布(自由度為1的Student分布)以增強對異常值的魯棒性。

? ? ? ? 5.2.3 目標函數優化

????????通過最小化KL散度實現分布匹配:

其中

????????優化過程使用梯度下降:

? ? ? ? 5.3 算法步驟流程

  1. 參數初始化:設置降維維度(如2D)、perplexity(通常5-50)、學習率等
  2. 高維相似度計算:為每個樣本計算條件概率矩陣𝑃P
  3. 低維初始化:隨機生成初始嵌入坐標𝑌Y
  4. 梯度下降優化:迭代更新𝑌Y以最小化KL散度
  5. 結果輸出:返回低維坐標矩陣

三、代碼詳解

????????本文的代碼主要分為以下幾個部分:

????????1. 導入庫

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import seaborn as sns
from sklearn import datasets
from sklearn import manifold
%matplotlib inline

說明

  • import matplotlib.pyplot as plt: 導入matplotlib庫,用于繪制圖像。
  • import numpy as np: 導入numpy庫,用于進行數值計算。
  • import pandas as pd: 導入pandas庫,用于數據處理。
  • import seaborn as sns: 導入seaborn庫,用于數據可視化。
  • from sklearn import datasets: 導入sklearn庫中的datasets模塊,用于加載數據集。
  • from sklearn import manifold: 導入sklearn庫中的manifold模塊,用于降維。
  • %matplotlib inline: 在Jupyter Notebook中顯示圖像。

????????2. 加載數據

# 加載數據
data = datasets.fetch_openml('mnist_784', version=1, return_X_y=True)
pixel_values, targets = data
targets = targets.astype(int)# 將DataFrame轉換為numpy數組以便更容易操作
# 如果pixel_values已經是numpy數組,這一步可以跳過
if isinstance(pixel_values, pd.DataFrame):pixel_values_array = pixel_values.values
else:pixel_values_array = pixel_values

說明

  • data = datasets.fetch_openml('mnist_784', version=1, return_X_y=True): 使用datasets.fetch_openml函數加載MNIST數據集。'mnist_784'表示數據集的名稱,version=1表示數據集的版本,return_X_y=True表示返回輸入數據和標簽。
  • pixel_values, targets = data: 將返回的數據解包為pixel_valuestargetspixel_values包含圖像的像素值,targets包含圖像的標簽。
  • targets = targets.astype(int): 將標簽轉換為整數類型。
  • if isinstance(pixel_values, pd.DataFrame):: 檢查pixel_values是否為pandas DataFrame類型。
  • pixel_values_array = pixel_values.values: 如果pixel_values為pandas DataFrame類型,則將其轉換為numpy數組。
  • else: pixel_values_array = pixel_values: 否則,直接使用pixel_values

? ? ? ? 3. 顯示單個圖像

# 顯示單個圖像
single_image = pixel_values_array[1].reshape(28, 28)
plt.imshow(single_image, cmap='gray')

說明

  • single_image = pixel_values_array[1].reshape(28, 28): 選擇第一個圖像,并將其reshape為28x28的矩陣。
  • plt.imshow(single_image, cmap='gray'): 使用plt.imshow函數顯示圖像,cmap='gray'表示使用灰度顏色映射。

????????4. t-SNE降維

# t-SNE降維
tsne = manifold.TSNE(n_components=2, random_state=42)
transformed_data = tsne.fit_transform(pixel_values_array[:3000])

說明

  • tsne = manifold.TSNE(n_components=2, random_state=42): 創建一個t-SNE對象。n_components=2表示將數據降維到二維空間,random_state=42表示設置隨機種子,保證結果的可重復性。
  • transformed_data = tsne.fit_transform(pixel_values_array[:3000]): 使用fit_transform函數對數據進行降維。這里只使用了前3000個樣本,因為t-SNE的計算復雜度較高。

? ? ? ? 5. 創建DataFrame用于可視化

# 創建DataFrame用于可視化
tsne_df = pd.DataFrame(np.column_stack((transformed_data, targets[:3000])),columns=["x", "y", "targets"]
)
tsne_df.loc[:, "targets"] = tsne_df.targets.astype(int)

說明

  • tsne_df = pd.DataFrame(...): 創建一個pandas DataFrame對象,用于存儲降維后的數據和標簽。
  • np.column_stack((transformed_data, targets[:3000])): 將降維后的數據和標簽按列拼接在一起。
  • columns=["x", "y", "targets"]: 設置DataFrame的列名。
  • tsne_df.loc[:, "targets"] = tsne_df.targets.astype(int): 將DataFrame中的標簽轉換為整數類型。

? ? ? ? 6. 可視化

# 可視化
# 注意:在新版本的seaborn中,size參數已更改為height
try:grid = sns.FacetGrid(tsne_df, hue="targets", size=8)
except TypeError:grid = sns.FacetGrid(tsne_df, hue="targets", height=8)grid.map(plt.scatter, "x", "y").add_legend()

說明

  • grid = sns.FacetGrid(tsne_df, hue="targets", size=8): 創建一個seaborn FacetGrid對象,用于可視化降維后的數據。hue="targets"表示使用標簽作為顏色編碼,size=8表示設置圖像的大小。
  • grid.map(plt.scatter, "x", "y").add_legend(): 使用plt.scatter函數繪制散點圖,"x""y"表示散點圖的橫坐標和縱坐標,add_legend()表示添加圖例。

? ? ? ? 7. 完整代碼

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import seaborn as sns
from sklearn import datasets
from sklearn import manifold
%matplotlib inline# 加載數據
data = datasets.fetch_openml('mnist_784', version=1, return_X_y=True)
pixel_values, targets = data
targets = targets.astype(int)# 將DataFrame轉換為numpy數組以便更容易操作
# 如果pixel_values已經是numpy數組,這一步可以跳過
if isinstance(pixel_values, pd.DataFrame):pixel_values_array = pixel_values.values
else:pixel_values_array = pixel_values# 顯示單個圖像
single_image = pixel_values_array[1].reshape(28, 28)
plt.imshow(single_image, cmap='gray')# t-SNE降維
tsne = manifold.TSNE(n_components=2, random_state=42)
transformed_data = tsne.fit_transform(pixel_values_array[:3000])# 創建DataFrame用于可視化
tsne_df = pd.DataFrame(np.column_stack((transformed_data, targets[:3000])),columns=["x", "y", "targets"]
)
tsne_df.loc[:, "targets"] = tsne_df.targets.astype(int)# 可視化
# 注意:在新版本的seaborn中,size參數已更改為height
try:grid = sns.FacetGrid(tsne_df, hue="targets", size=8)
except TypeError:grid = sns.FacetGrid(tsne_df, hue="targets", height=8)grid.map(plt.scatter, "x", "y").add_legend()


四、總結與思考

????????本文以MNIST數據集為例,詳細介紹了如何使用t-SNE進行高維數據可視化。通過t-SNE降維,我們可以將784維的圖像數據降維到二維空間,并在散點圖上清晰地看到不同數字之間的分布情況。

????????t-SNE是一種強大的降維技術,但也有一些局限性:

  • 計算復雜度高:?t-SNE的計算復雜度為O(n^2),對于大規模數據集,計算時間會非常長。
  • 參數敏感:?t-SNE的性能受到參數的影響,例如困惑度 (perplexity) 和學習率 (learning_rate)。
  • 全局結構失真:?t-SNE主要關注局部結構,可能會導致全局結構失真。

????????在實際應用中,我們需要根據具體情況選擇合適的降維技術。對于大規模數據集,可以考慮使用PCA或UMAP等更高效的算法。對于需要保留全局結構的場景,可以考慮使用Isomap或LLE等算法。


【作者聲明】

????????本文內容基于作者對基于t-SNE的MNIST數據集可視化探索實現過程的實驗與總結,所有數據和代碼均為原創。文章中的觀點僅代表個人見解,供讀者參考交流。若有任何問題或建議,歡迎在評論區留言討論,共同促進技術進步。


?【關注我們】

????????如果您對神經網絡、群智能算法及人工智能技術感興趣,歡迎點贊、收藏并轉發,與更多朋友一起探討與交流!

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

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

相關文章

【redis】發布訂閱

Redis的發布訂閱(Pub/Sub)是一種基于消息多播的通信機制,它允許消息的**發布者(Publisher)向特定頻道發送消息,而訂閱者(Subscriber)**通過訂閱頻道或模式來接收消息。 其核心特點如…

C語言零基礎入門:嵌入式系統開發之旅

C語言零基礎入門:嵌入式系統開發之旅 一、引言 嵌入式系統開發是當今科技領域中一個極具魅力和挑戰性的方向。從智能家居設備到汽車電子系統,從智能穿戴設備到工業自動化控制,嵌入式系統無處不在。而C語言,作為嵌入式開發中最常…

K8S學習之基礎二十三:k8s的持久化存儲之nfs

K8S持久化存儲之nfs ? 在 Kubernetes (k8s) 中使用 NFS(Network File System)作為存儲解決方案是一種常見的方式,特別是在需要共享存儲的場景中。以下是關于如何在 Kubernetes 中使用 NFS 存儲的詳細說明: 1. 準備 NFS 服務器 …

【Rust】枚舉和模式匹配——Rust語言基礎14

文章目錄 1. 枚舉類型1.2. Option 枚舉 2. match 控制流結構2.1. match 對綁定值的匹配2.2. Option<T> 的匹配2.3. 通配模式以及 _ 占位符 3. if let 控制流4. 小測試 1. 枚舉類型 枚舉&#xff08;enumerations&#xff09;&#xff0c;也被稱作 enums。枚舉允許你通過…

【商城實戰(25)】解鎖UniApp移動端適配秘籍,打造完美商城體驗

【商城實戰】專欄重磅來襲&#xff01;這是一份專為開發者與電商從業者打造的超詳細指南。從項目基礎搭建&#xff0c;運用 uniapp、Element Plus、SpringBoot 搭建商城框架&#xff0c;到用戶、商品、訂單等核心模塊開發&#xff0c;再到性能優化、安全加固、多端適配&#xf…

《C++ Primer》學習筆記(二)

第二部分&#xff1a;C標準庫 1.為了支持不同種類的IO處理操作&#xff0c;標準庫定義了以下類型的IO&#xff0c;分別定義在三個獨立的文件中&#xff1a;iostream文件中定義了用于讀寫流的基本類型&#xff1b;fstream文件中定義了讀寫命名文件的類型&#xff1b;sstream文件…

MATLAB風光柴儲微網粒子群算法

本程序實現了風光柴儲微網中的粒子群優化&#xff08;PSO&#xff09;算法&#xff0c;用于優化微網的能源調度問題。具體來說&#xff0c;程序考慮了光伏發電、風力發電、柴油機發電&#xff08;柴儲&#xff09;&#xff0c;并使用粒子群算法來優化這些能源的調度&#xff0c…

解決Windows版Redis無法遠程連接的問題

&#x1f31f; 解決Windows版Redis無法遠程連接的問題 在Windows系統下使用Redis時&#xff0c;很多用戶會遇到無法遠程連接的問題。尤其是在配置了Redis并嘗試通過工具如RedisDesktopManager連接時&#xff0c;可能會報錯“Cannot connect to ‘redisconnection’”。今天&am…

解決 HTTP 請求中的編碼問題:從亂碼到正確傳輸

文章目錄 解決 HTTP 請求中的編碼問題&#xff1a;從亂碼到正確傳輸1. **問題背景**2. **亂碼問題的原因**2.1 **客戶端編碼問題**2.2 **請求頭缺失**2.3 **服務器編碼問題** 3. **解決方案**3.1 **明確指定請求體編碼**3.2 **確保請求頭正確**3.3 **動態獲取響應編碼** 4. **調…

VS Code 配置優化指南

目錄 一、安裝與基礎設置1. 安裝 VS Code2. 中文語言包 二、插件推薦三、常見配置項與優化1. 用戶 / 工作區設置2. 全局配置 / Settings Sync3. 常用設置示例 四、性能優化五、調試與終端配置1. 調試配置2. 內置終端配置 六、快捷鍵配置七、美觀與主題八、總結 VS Code&#xf…

基于NXP+FPGA永磁同步電機牽引控制單元(單板結構/機箱結構)

永磁同步電機牽引控制單元&#xff08;單板結構/機箱結構&#xff09; 永磁同步電機牽引控制單元&#xff08;TCU-PMSM&#xff09;用于牽引逆變器-永磁同步電機構成的牽引電傳動系統&#xff0c;采用軸控方式。執行高性能永磁同步電機復矢量控制策略&#xff0c;具有響應迅速…

/etc/sysconfig/jenkins 沒有這個文件

在 CentOS 或其他基于 Red Hat 的 Linux 系統中&#xff0c;/etc/sysconfig/jenkins 文件通常用來存儲 Jenkins 的配置參數&#xff0c;例如 JENKINS_HOME 的路徑。但是&#xff0c;如果你發現沒有這個文件&#xff0c;你可以通過以下幾種方式來解決或確認&#xff1a; 檢查 J…

conda 安裝軟件報錯 Found conflicts! Looking for incompatible packages.

問題描述&#xff1a; 利用 conda 安裝某包 conda install -c "nvidia/label/cuda-11.8.0" cuda-nvcc時發現報錯&#xff1a; Collecting package metadata (current_repodata.json): done Solving environment: failed with initial frozen solve. Retrying with…

MySQL 衍生表(Derived Tables)

在SQL的查詢語句select …. from …中&#xff0c;跟在from子句后面的通常是一張擁有定義的實體表&#xff0c;而有的時候我們會用子查詢來扮演實體表的角色&#xff0c;這個在from子句中的子查詢會返回一個結果集&#xff0c;這個結果集可以像普通的實體表一樣查詢、連接&…

STM32配套程序接線圖

1 工程模板 2 LED閃爍 3LED流水燈 4蜂鳴器 5按鍵控制LED 6光敏傳感器控制蜂鳴器 7OLED顯示屏 8對射式紅外傳感器計次 9旋轉編碼器計次 10 定時器定時中斷 11定時器外部時鐘 12PWM驅動LED呼吸燈 13 PWM驅動舵機 14 PWM驅動直流電機 15輸入捕獲模式測頻率 16PWMI模式測頻率占空…

鴻蒙初級考試備忘

Module類型 Module按照使用場景可以分為兩種類型&#xff1a; Ability類型的Module&#xff1a; 用于實現應用的功能和特性。每一個Ability類型的Module編譯后&#xff0c;會生成一個以.hap為后綴的文件&#xff0c;我們稱其為HAP&#xff08;Harmony Ability Package&#x…

語音識別踩坑記錄

本來想在原來的語音識別的基礎上增加本地擴展本地詞典&#xff0c; 采用的語音識別是Vosk識別器&#xff0c;模型是 vosk-model-small-cn-0.22 // 初始化Vosk識別器 if (recognizer null) {using (Model model new Model(modelPath)){string grammar "{""…

SpringCloud 學習筆記1(Spring概述、工程搭建、注冊中心、負載均衡、 SpringCloud LoadBalancer)

文章目錄 SpringCloudSpringCloud 概述集群和分布式集群和分布式的區別和聯系 微服務什么是微服務&#xff1f;分布式架構和微服務架構的區別微服務的優缺點&#xff1f;拆分微服務原則 什么是 SpringCloud &#xff1f;核心功能與組件 工程搭建父項目的 pom 文件 注冊中心Rest…

計算機網絡-網絡規劃與設計

基本流程 需求分析—》通信規范分析—》邏輯網絡設計—》物理網絡設計—》實施階段 需求分析&#xff1a; 確定需求&#xff0c;包括&#xff1a;業務需求、用戶需求、應用需求、計算機平臺需求、網絡通信需求等。 產物&#xff1a;需求規范 通信規范分析&#xff1a; 現有…

《AI浪潮中的璀璨新星:Meta Llama、Ollama與DeepSeek的深度剖析》:此文為AI自動生成

《AI浪潮中的璀璨新星&#xff1a;Meta Llama、Ollama與DeepSeek的深度剖析》&#xff1a;此文為AI自動生成 引言&#xff1a;AI 大模型的群雄逐鹿時代 在科技飛速發展的當下&#xff0c;AI 大模型領域已成為全球矚目的焦點&#xff0c;競爭激烈程度堪稱白熱化。從 OpenAI 推出…