UMAP:用于降維的均勻流形近似和投影實驗

關鍵詞:
Uniform Manifold Approximation and Projection (UMAP):均勻流形近似與投影

一、說明

對于降維,首先看數據集是否線性,如果是線性的用pca降維;如果是非線性數據,t-SNE或者UMAP,本文針對UMAP的實驗代碼進行記錄,但沒有說UMAP的原理,原理在其它文檔論述。

二、UMAP的基本概念

2.1 首先看什么是流形

流形(manifold)是一種數學概念,它描述了在局部看起來像歐幾里得空間的拓撲空間。換句話說,流形是一個可以在局部范圍內近似為歐幾里得空間的空間。流形在幾何、拓撲學、微分幾何以及物理學中有廣泛的應用。流形的基本概念包括連續性、局部坐標轉移性和可微性,常見的例子有閉合曲面和克萊因瓶等。
一般來說,微分幾何是建立在流形理論上的,學習這方面的理論可以參照微分幾何相關書籍。

2.2 UMAP

均勻流形近似與投影 (UMAP) 是一種降維技術,類似于 t-SNE,可用于可視化,也可用于一般的非線性降維。該算法基于以下三個關于數據的假設:

數據在黎曼流形上均勻分布;
黎曼度量是局部常數(或可以近似為局部常數);
流形是局部連通的。

基于這些假設,可以用模糊拓撲結構對流形進行建模。通過尋找具有最接近等效模糊拓撲結構的數據低維投影來找到嵌入。

2.3 UMAP 安裝

在conda上安裝umap

conda install -c conda-forge umap-learn

在pip安裝

pip install umap-learn

三、基本 UMAP 參數

UMAP 是一種相當靈活的非線性降維算法。它旨在學習數據的流形結構,并找到一個能夠保留該流形基本拓撲結構的低維嵌入。在本筆記中,我們將生成一些可可視化的四維數據,演示如何使用 UMAP 提供其二維表示,然后研究各種 UMAP 參數如何影響最終的嵌入。本文檔基于 Philippe Rivière 為 visionscarto.net 撰寫的研究成果。

首先,我們需要一些基礎庫。首先numpy,我們需要 來進行基本的數組操作。由于我們要可視化結果,因此需要matplotlib和seaborn。最后,我們需要 umap來進行維度縮減本身。

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import seaborn as sns
import umap
%matplotlib inline
sns.set(style='white', context='poster', rc={'figure.figsize':(14,10)})

接下來,我們需要一些數據來嵌入到低維表示中。為了使四維數據“可視化”,我們將從一個四維立方體中均勻隨機地生成數據,以便我們可以將樣本解釋為指定顏色(和透明度)的 (R,G,B,a) 值的元組。這樣,當我們繪制低維表示時,每個點都可以根據其四維值進行著色。為此,我們可以使用numpy。為了保持一致性,我們將固定一個隨機種子。

np.random.seed(42)
data = np.random.rand(800, 4)

現在我們需要找到數據的低維表示。正如基礎用法文檔中所述,我們可以通過 在對象fit_transform()上使用方法來做到這一點UMAP。

fit = umap.UMAP()
%time u = fit.fit_transform(data)

CPU times: user 7.73 s, sys: 211 ms, total: 7.94 s
Wall time: 6.8 s
結果值u是數據的二維表示。我們可以用matplotlib繪制散點圖來可視化結果u。我們可以使用源數據中關聯的四維顏色為散點圖的每個點著色。

plt.scatter(u[:,0], u[:,1], c=data)
plt.title('UMAP embedding of random colours');

在這里插入圖片描述
正如你所見,結果是數據被放置在二維空間中,使得四維空間中相鄰的點(即顏色相似的點)保持緊密相連。由于我們在顏色立方體中隨機抽取了一些點,因此在顏色空間中,這些隨機點恰好聚集在一起,從而產生了一定程度的誘導結構。

UMAP 有幾個超參數會對最終的嵌入產生重大影響。在本筆記中,我們將介紹其中四個主要參數:

n_neighbors
min_dist
n_components
metric

每個參數都有不同的效果,我們將依次進行討論。為了簡化探索,我們首先編寫一個簡短的效用函數,該函數可以在給定一組參數選擇的情況下使用 UMAP 擬合數據,并繪制結果圖。

def draw_umap(n_neighbors=15, min_dist=0.1, n_components=2, metric='euclidean', title=''):fit = umap.UMAP(n_neighbors=n_neighbors,min_dist=min_dist,n_components=n_components,metric=metric)u = fit.fit_transform(data);fig = plt.figure()if n_components == 1:ax = fig.add_subplot(111)ax.scatter(u[:,0], range(len(u)), c=data)if n_components == 2:ax = fig.add_subplot(111)ax.scatter(u[:,0], u[:,1], c=data)if n_components == 3:ax = fig.add_subplot(111, projection='3d')ax.scatter(u[:,0], u[:,1], u[:,2], c=data, s=100)plt.title(title, fontsize=18)
  • n_neighbors
    此參數控制 UMAP 如何平衡數據的局部結構與全局結構。它通過限制 UMAP 在嘗試學習數據流形結構時所關注的局部鄰域的大小來實現這一點。這意味著,較低的 值n_neighbors 將迫使 UMAP 專注于非常局部的結構(可能會損害全局);而較大的 值將迫使 UMAP 在估計數據的流形結構時關注每個點的更大鄰域,從而為了獲取更廣泛的數據而丟失精細的細節結構。

在實踐中,我們可以通過使用一系列n_neighbors值來擬合數據集,從而看到這一點。UMAP 的默認值n_neighbors (如上所述)為 15,但我們將研究從 2(流形的局部視圖)到 200(數據的四分之一)范圍內的值。

for n in (2, 5, 10, 20, 50, 100, 200):draw_umap(n_neighbors=n, title='n_neighbors = {}'.format(n))

在這里插入圖片描述
在這里插入圖片描述
當值為 時,n_neighbors=2我們可以看到 UMAP 僅僅將一些小的鏈粘合在一起,但由于視角狹窄/局部,無法看到它們是如何連接的。它還留下了許多不同的組成部分(甚至是單點)。這表明,從細節的角度來看,數據在整個空間中非常不連貫且分散。

隨著n_neighborsUMAP 的增加,它能夠更好地洞察數據的整體結構,將更多組件粘合在一起,并更好地覆蓋數據的整體結構。到這個階段, n_neighbors=20我們對數據有了相當好的整體視圖,展示了各種顏色在整個數據集中是如何相互關聯的。

隨著n_neighbors數據的整體結構越來越受到關注。結果,雖然 n_neighbors=200圖中能夠很好地捕捉到整體結構(藍色、綠色和紅色;高亮度與低亮度),但卻丟失了一些更精細的局部結構(單個顏色不再必然與其最接近的顏色匹配)。

這種效果很好地體現了所提供的局部/全局權衡 n_neighbors。

  • min_dist

該min_dist參數控制 UMAP 將點打包的緊密程度。它實際上規定了低維表示中允許點之間的最小距離。這意味著較低的 值min_dist將導致嵌入更加塊狀。如果您對聚類或更精細的拓撲結構感興趣,這將非常有用。較大的 值 min_dist將阻止 UMAP 將點打包在一起,而是專注于保留大致的拓撲結構。

min_dist(如上所述)的默認值為0.1。我們將查看從 0.0 到 0.99 的值范圍。

for d in (0.0, 0.1, 0.25, 0.5, 0.8, 0.99):draw_umap(min_dist=d, title='min_dist = {}'.format(d))

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
這里我們看到,min_dist=0.0UMAP 能夠找到數據中較小的連通分量、團塊和字符串,并在生成的嵌入中強調這些特征。隨著 的min_dist增加,這些結構被分解成更柔和、更通用的特征,從而在損失更詳細的拓撲結構的情況下,提供更好的數據總體視圖。

  • n_components

scikit-learn與許多降維算法一樣, UMAP 提供了一個n_components參數選項,允許用戶確定我們將數據嵌入到的降維空間的維數。與其他一些可視化算法(例如 t-SNE)不同,UMAP 在嵌入維度上具有良好的擴展性,因此您不僅可以將其用于二維或三維可視化,還可以將其用于其他領域。

為了演示的目的(以便我們可以看到參數的效果),我們將只研究一維和三維嵌入,我們希望將其可視化。

首先,我們將設置n_components為 1,強制 UMAP 將數據嵌入到一條線中。為了便于可視化,我們將在 y 軸上隨機分布數據,以便在點之間提供一定的分隔。

draw_umap(n_components=1, title='n_components = 1')

在這里插入圖片描述
現在我們來嘗試一下n_components=3。為了實現可視化,我們將利用的matplotlib基本三維繪圖。

draw_umap(n_components=3, title='n_components = 3')

在這里插入圖片描述
在這里我們可以看到,有了更多的工作維度,UMAP 可以更輕松地以尊重數據拓撲結構的方式分離出顏色。

如上所述,實際上沒有必要止步于n_components=3。如果您對(基于密度的)聚類或其他機器學習技術感興趣,那么選擇一個更大的嵌入維度(例如 10 或 50)并使其更接近數據所在的底層流形的維度可能會有所幫助。

  • metric(度量)

我們將在本筆記本中考慮的最后一個 UMAP 參數是 metric參數。它控制如何在輸入數據的環境空間中計算距離。默認情況下,UMAP 支持多種指標,包括:

閔可夫斯基風格度量

歐幾里得

曼哈頓

切比雪夫

閔可夫斯基

其他空間指標

堪培拉

布雷柯蒂斯

半正矢

規范化空間度量

馬哈拉諾比斯

明科夫斯基

塞克利德

角度和相關性指標

余弦

相關性

二進制數據的指標

漢明
雅卡德
骰子
羅素·拉奧
庫爾辛斯基
羅杰斯塔尼莫托
索卡爾米切納
索卡爾斯尼斯
圣誕節

四、預先計算

以上所有指標都假設你的輸入數據是某個 N 維空間中的“原始”數據。有時,你已經計算了點之間的成對距離,并且輸入數據是一個距離/相似度矩陣。在這種情況下,你可以執行以下操作。

UMAP(metric='precomputed').fit_transform(<distance matrix>)

其中任何一個都可以通過設置。metric=''metric='cosine’來指定;例如使用余弦距離作為您將使用的度量

然而,UMAP 提供的遠不止這些——它支持自定義用戶指標,只要這些指標能夠nopython通過 numba 編譯即可。在本筆記中,我們將研究此類自定義指標。要定義此類指標,我們需要 numba……

import numba

對于我們的第一個自定義指標,我們將距離定義為紅色通道中差異的絕對值。

@numba.njit()
def red_channel_dist(a,b):return np.abs(a[0] - b[0])

為了更具冒險精神,進行一些色彩空間轉換會很有用——為了簡單起見,我們只需使用 HSL 公式從 (R,G,B) 元組中提取色調、飽和度和亮度。

@numba.njit()
def hue(r, g, b):cmax = max(r, g, b)cmin = min(r, g, b)delta = cmax - cminif cmax == r:return ((g - b) / delta) % 6elif cmax == g:return ((b - r) / delta) + 2else:return ((r - g) / delta) + 4@numba.njit()
def lightness(r, g, b):cmax = max(r, g, b)cmin = min(r, g, b)return (cmax + cmin) / 2.0@numba.njit()
def saturation(r, g, b):cmax = max(r, g, b)cmin = min(r, g, b)chroma = cmax - cminlight = lightness(r, g, b)if light == 1:return 0else:return chroma / (1 - abs(2*light - 1))

有了這些,我們可以定義三個額外的距離。第一個簡單地測量色調的差異,第二個測量飽和度和亮度組合空間中的歐氏距離,第三個測量完整 HSL 空間中的距離。

@numba.njit()
def hue_dist(a, b):diff = (hue(a[0], a[1], a[2]) - hue(b[0], b[1], b[2])) % 6if diff < 0:return diff + 6else:return diff@numba.njit()
def sl_dist(a, b):a_sat = saturation(a[0], a[1], a[2])b_sat = saturation(b[0], b[1], b[2])a_light = lightness(a[0], a[1], a[2])b_light = lightness(b[0], b[1], b[2])return (a_sat - b_sat)**2 + (a_light - b_light)**2@numba.njit()
def hsl_dist(a, b):a_sat = saturation(a[0], a[1], a[2])b_sat = saturation(b[0], b[1], b[2])a_light = lightness(a[0], a[1], a[2])b_light = lightness(b[0], b[1], b[2])a_hue = hue(a[0], a[1], a[2])b_hue = hue(b[0], b[1], b[2])return (a_sat - b_sat)**2 + (a_light - b_light)**2 + (((a_hue - b_hue) % 6) / 6.0)

有了這些自定義指標,我們就可以讓 UMAP 使用這些指標來嵌入數據,以測量輸入數據點之間的距離。需要注意的是,這numba為我們定義距離函數提供了極大的靈活性。盡管如此,即使使用這些自定義函數,我們仍然能夠保持 UMAP 所期望的高性能。

for m in ("euclidean", red_channel_dist, sl_dist, hue_dist, hsl_dist):name = m if type(m) is str else m.__name__draw_umap(n_components=2, metric=m, title='metric = {}'.format(name))

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里,我們可以清楚地看到這些指標的效果。純紅色通道正確地將數據視為位于一維流形上,色調指標將數據解釋為位于一個圓圈內,而 HSL 指標則根據飽和度和亮度使圓圈變胖。這合理地證明了 UMAP 在理解數據底層拓撲結構以及找到該拓撲結構的合適低維表示方面的強大功能和靈活性。

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

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

相關文章

【Datawhale組隊學習202506】YOLO-Master task03 IOU總結

系列文章目錄 task01 導學課程 task02 YOLO系列發展線 文章目錄 系列文章目錄前言1 功能分塊1.1 骨干網絡 Backbone1.2 頸部網絡 Neck1.3 頭部網絡 Head1.3.1 邊界框回歸頭1.3.2 分類頭 2 關鍵概念3 典型算法3.1 NMS3.2 IoU 總結 前言 Datawhale是一個專注于AI與數據科學的開…

Spring IOC容器核心揭秘:BeanFactory創建、配置加載解析并注冊為BeanDefinition

文章目錄 一、為何這個階段如此重要&#xff1f;二、整體流程全景圖三、源碼級深度解析1. BeanFactory的誕生源碼入口&#xff1a;refresh()方法核心方法&#xff1a;obtainFreshBeanFactory()核心實現&#xff1a;refreshBeanFactory()BeanFactory實例化 2. ★ 核心&#xff1…

解鎖n8n:開啟工作流自動化的無限可能(5/6)

文章摘要&#xff1a;n8n 是一款開源低代碼工作流自動化平臺&#xff0c;通過可視化拖放節點創建復雜工作流&#xff0c;無需大量代碼。具有強大集成能力、數據轉換、錯誤處理等功能&#xff0c;適用于數據同步、客戶關系管理、IT 自動化等場景。相比 Zapier、IFTTT 等工具&…

數據賦能(308)——合作共享——數據交流

概述 重要性如下&#xff1a; 信息準確性&#xff1a;數據交流原則確保在數據傳遞過程中信息的準確性&#xff0c;這是決策和業務活動的基礎。決策支持&#xff1a;準確的數據交流為決策提供有力支持&#xff0c;幫助組織做出更明智的決策。業務效率&#xff1a;有效的數據交…

TCP流量控制與擁塞控制:核心機制與區別

一、TCP流量控制&#xff08;Flow Control&#xff09; 定義&#xff1a;通過調節發送方的發送速率&#xff0c;確保接收方能夠及時處理數據&#xff0c;避免緩沖區溢出。 本質&#xff1a;解決發送方與接收方之間的"端到端"速率匹配問題。 1. 實現機制&#xff1a…

iOS多端兼容性調試:一次iOS性能優化分工具協作排查過程

在多技術棧混合開發日益普及的今天&#xff0c;iOS應用中越來越多地集成了WebView、Flutter、React Native甚至小程序模塊。而這些模塊帶來的復雜性&#xff0c;不僅體現在UI適配&#xff0c;還包括數據同步、系統權限管理、線程調度等方面的問題。 本文記錄的是我們在處理一個…

秋招Day14 - MySQL - 索引

索引為什么能夠提高MySQL的查詢效率&#xff1f; 索引可以理解為目錄&#xff0c;通過索引可以快速定位數據&#xff0c;避免全表掃描 一般是B樹結構&#xff0c;查找效率是O(log n)。 索引還能加速排序、分組、連接等操作。 create index idx_name on students(name); 能簡…

第5天:LSTM預測火災溫度

&#x1f368; 本文為&#x1f517;365天深度學習訓練營 中的學習記錄博客&#x1f356; 原作者&#xff1a;K同學啊 目標 復用LSTM模型實現火災溫度預測 具體實現 &#xff08;一&#xff09;環境 語言環境&#xff1a;Python 3.10 編 譯 器: PyCharm 框 架: Pytorch &am…

目標檢測之YOLOV11自定義數據使用OBB訓練與驗證

一、前置條件與環境準備 在開始訓練前&#xff0c;確保已完成以下準備《目標檢測之YOLOV11自定義數據預處理——從原始標注到YOLO-OBB格式轉換與驗證》&#xff1a; 數據目錄結構&#xff1a; yolov11/ ├── datasets/ │ └── shrimp/ │ ├── images/ │ …

Labview教程進階一(Labview與OPC UA設備通信)

1.Labview與OPC UA設備通信 OPC UA通信協議優勢顯著,具體表現如下: 跨平臺兼容:支持多種操作系統和硬件平臺,實現無縫數據交換。高安全性:內置加密、身份驗證和授權機制,確保數據傳輸安全。高效數據交換:采用二進制編碼和優化的傳輸協議,提高通信效率。復雜數據建模:…

【Comsol教程】如何求解指定范圍的積分 或 在積分中去除奇異點/異常值

我們在Comsol中經常需要對物體的邊界求積分&#xff0c;比如求物體在流場中所受的總流體牽引力&#xff0c;又或者是物體在電場中受到的總介電泳力。當物體的材料或者邊界條件存在突變時&#xff0c;物體表面的粘性應力或者麥克斯韋電應力可能會存在異常值。通常解決方法有細化…

Python 多版本治理理念(Windows 平臺 · 零基礎友好)

&#x1f9e0; Python 多版本治理理念&#xff08;Windows 平臺 零基礎友好&#xff09; &#x1f310; 核心原則&#xff1a;三維治理、四級隔離、五項自治 以下是基于人工智能深度學習環境搭建實踐&#xff0c;總結出的"零基礎入門 Conda工具鏈 全隔離項目環境"…

Python文件管理利器之Shutil庫詳解

Shutil是一個Python內置的用來高效處理文件和目錄遷移任務的庫。Shutil不僅支持基本的文件復制、移動和刪除操作&#xff0c;還具備處理大文件、批量遷移目錄、以及跨平臺兼容性等特性。通過使用Shutil&#xff0c;我們可以更加輕松地實現文件系統的管理和維護&#xff0c;本文…

學習華為 ensp 的學習心得體會

引言? 在信息技術日新月異的今天&#xff0c;網絡技術作為連接世界的橋梁&#xff0c;其重要性不言而喻。作為一名對網絡技術充滿熱情的大一新生&#xff0c;我選擇了 eNSP&#xff08;Enterprise Network Simulation Platform&#xff0c;企業網絡模擬平臺&#xff09;作為我…

jenkins-2.439.1搭建

一、 二、pipeline文件 pipeline { agent any // 可以指定特定的agent, 如 label 或 docker environment { JAVA_HOME "/usr/local/software/jdk1.8.0_451" PATH "${JAVA_HOME}/bin:${env.PATH}" } tools { …

【threejs】一天一個小案例講解:控制面板(GUI)

# 好吧&#xff0c;每天更新實在有點艱巨&#xff0c;我盡量少量多次 代碼倉 所有代碼都會上傳到這里&#xff0c;可自行clone GitHub - TiffanyHoo/three_practices: Learning three.js together! 運行效果圖 ? 知識要點 一、安裝dat.gui npm i dat.gui 二、使用步驟&a…

飛輪儲能輔助雙饋風機參與電力系統一次調頻的仿真模型研究

以下是一篇關于飛輪儲能輔助雙饋風機參與電力系統一次調頻的仿真模型研究的論文 ,涵蓋理論分析、數學模型構建、控制策略設計及仿真驗證等內容,適用于電氣工程、新能源技術等領域的研究參考。 飛輪儲能輔助雙饋風機參與電力系統一次調頻的仿真模型研究 摘要 隨著風電在電力…

一次性理解Java垃圾回收--簡單直接方便面試時使用

Java的垃圾回收是一個面試必問題&#xff0c;只要按照下面的步驟回答肯定不會有大問題。 1.先告訴面試官垃圾回收分為兩大步&#xff1a; a.識別哪些對象是"垃圾"(不再被使用的對象) b.回收這些垃圾對象占用的內存空間 2. 接下來分別介紹標記階段和回收階段的細節…

XML映射文件-輔助配置

如果你沒有按照同包同名來&#xff0c;就要下面的配置&#xff0c;指定好路徑 1.把路徑改為類下面的xml文件 #指定xml映射文件的位置 mybatis.mapper-locationsclasspath:mapper/*.xml

120、三角形最小路徑和

題目 解答&#xff1a; 直接按照空間復雜度O(n)來做了。這種明顯是動態規劃&#xff0c;每一層用到上一層的信息。 觀察數據形狀&#xff0c;如下&#xff1a; (0,0) (1,0)(1,1) (2,0)(2,1)(2,2) (3,0)(3,1)(3,2)(3,3) ... (n-1,0)...(n-1,n-1) 設dp[n],定義為本層第n…