一、umap降維的優勢
umap降維是一種非線性的降維算法,與傳統的線性降維算法相比,有着以下優勢:
1、非線性特徵提取能力更強:傳統的線性降維算法依賴於數據的線性結構,在處理非線性結構的數據時表現較差。而umap可以對數據中的非線性結構進行有效提取,使得降維後的數據更具代表性。
2、保留數據間的局部結構和全局結構:umap不僅可以保留數據間的全局結構,還可以保留數據間的局部結構。這意味着umap在降維後仍然能夠表現出原始數據的一些關鍵特徵,使得數據更加有分析和判斷價值。
3、計算效率高:umap基於蒙特卡羅方法求解,計算效率高,無需對輸入數據進行特殊的預處理,能夠處理大量高維數據。
二、umap降維實現方法
umap的實現方法主要包括以下幾個步驟:
1、計算相似度矩陣:umap需要先計算出輸入數據中每個數據點之間的相似度。可以通過計算歐式距離、餘弦距離或其他距離指標來獲得。相似度矩陣的大小為n*n,n代表的是數據點的個數。
import numpy as np from sklearn.metrics import pairwise_distances def similarity_matrix(X, n_neighbors=15, metric='euclidean', **kwargs): D_mat = pairwise_distances(X, metric=metric, **kwargs) indices = np.argsort(D_mat)[:, 1:n_neighbors+1] sim = np.zeros_like(D_mat) for i, idx in enumerate(indices): #calculate the minimal spanning tree of node i #then make each component of the tree equally weighted t = np.zeros(n_neighbors) t[0] = np.inf J = idx[1:] S, P = compute_similarity_one_vs_all(D_mat[J][:, J], t[1:]) sim[i, J] = S sim[J, i] = S sim[np.arange(len(sim)), np.arange(len(sim))] = 1.0 return sim
2、構建高維空間中的最小生成樹:umap使用最小生成樹(Minimum Spanning Tree)算法來保留數據之間的全局結構。最小生成樹是一種包含輸入數據中所有數據點的樹形結構,能夠最小化數據點間的距離和。在umap中,最小生成樹用於構建高維空間中的“鄰居圖”,即每個數據點周圍最近的n_neighbors個數據點。
def minimal_spanning_tree(X, n_neighbors=15, path_method='randomized', **kwargs): Dmat = pairwise_distances(X, metric=metric, **kwargs) import scipy.sparse.csgraph as csgraph import warnings with warnings.catch_warnings(): warnings.simplefilter('ignore') kdTree = KDTree(X) indices = kdTree.query(X, k=n_neighbors+1, return_distance=False)[:, 1:].astype(np.int32) if path_method == 'randomized': indices = np.random.permutation(indices) indices, _ = make_indices(indices) elif path_method == 'bfs': indices, _ = make_indices(indices) else: indices = kneighbors_graph(X, n_neighbors=n_neighbors, mode='distance') tree = csgraph.minimum_spanning_tree(csgraph.lil_matrix((Dmat[indices[:, 0], indices[:, 1]], (indices[:, 0], indices[:, 1])))) return tree, indices, Dmat
3、構建低維空間中的圖:根據高維空間中的鄰居圖,umap使用高斯核函數或者t分布來計算數據在低維空間的相似度,並且獲得該圖的結構。這個過程就是在低維空間中重現高維空間的局部結構。
def compute_low_dim_affinities(data, graph, n_neighbors=15, local_connectivity=1.0, bandwidth=1.0): rows = graph.row cols = graph.col row_batch_size = max(int(len(rows) / 10) + 1, 1000) affinity_rows = [] affinity_cols = [] affinity_vals = [] head = 0 while head < len(rows): tail = min(head + row_batch_size, len(rows)) block_rows = rows[head:tail] block_cols = cols[head:tail] block_lvals = graph.data[head:tail] weights, distances, rp_forest = compute_mappings(data, block_rows, block_cols, n_neighbors, local_connectivity=local_connectivity, bandwidth=bandwidth) new_rows, new_cols, new_vals = compute_affinities(block_rows, block_cols, block_lvals, weights, distances, n_neighbors, rp_forest) affinity_rows.append(new_rows) affinity_cols.append(new_cols) affinity_vals.append(new_vals) head = tail rows = np.concatenate(affinity_rows) cols = np.concatenate(affinity_cols) vals = np.concatenate(affinity_vals) graph = coo_matrix((vals, (rows, cols)), shape=(graph.shape[0],graph.shape[0])) graph.eliminate_zeros() return graph
三、umap的應用場景
umap降維算法的應用場景非常廣泛,具體有以下幾個方面的應用:
1、圖像處理:umap可以將高維圖像數據降維至二維或三維,便於可視化。同時,umap還可以在訓練神經網絡的時候作為”特徵提取”的步驟,從而提高模型訓練的效率。
2、文本挖掘:umap可以降維文本數據的高維特徵向量,並通過可視化的方式幫助數據分析師快速分析和理解文本數據的特徵和結構。
3、高通量數據分析:umap在高通量數據的降維分析中被廣泛應用,如基因表達譜和蛋白質結構分析。通過umap的降維可視化,分析者可以更快捷地找到有關生物實體、所需時間尺度和相關性的模式。
四、umap的優化及改進
umap的原始版本實現上有一些性能問題,並且並不適用於所有的數據集。而近年來,社區已經提出了一系列的改進方案:
1、批量處理:可以將較大的數據集分批次處理,以便提高umap處理大數據集的效率。
2、自適應距離:可在構建多個鄰居圖時使用自適應距離,以更好地捕捉不同尺度的數據結構。
3、核方法擴展:核方法可以擴展到許多領域,比如圖像和自然語言處理,這些領域數據的維度非常高。
4、加速近似計算:可以使用加速近似計算來降低umap在大規模數據上的執行時間。
五、總結
umap是一種先進的降維算法,具有很多優勢,如強大的非線性特徵提取能力和計算效率高等,越來越受到數據科學家和研究人員的重視。通過實現umap,我們可以更好地了解umap的實現細節,以及如何將umap應用於不同的領域和場景中。
原創文章,作者:RTOB,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/131175.html