自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

哈工大碩士生用 Python 實(shí)現(xiàn)了 11 種經(jīng)典數(shù)據(jù)降維算法,源代碼庫已開放

新聞 前端 算法
網(wǎng)上關(guān)于各種降維算法的資料參差不齊,同時大部分不提供源代碼。這里有個 GitHub 項(xiàng)目整理了使用 Python 實(shí)現(xiàn)了 11 種經(jīng)典的數(shù)據(jù)抽?。〝?shù)據(jù)降維)算法。

本文轉(zhuǎn)自雷鋒網(wǎng),如需轉(zhuǎn)載請至雷鋒網(wǎng)官網(wǎng)申請授權(quán)。

網(wǎng)上關(guān)于各種降維算法的資料參差不齊,同時大部分不提供源代碼。這里有個 GitHub 項(xiàng)目整理了使用 Python 實(shí)現(xiàn)了 11 種經(jīng)典的數(shù)據(jù)抽?。〝?shù)據(jù)降維)算法,包括:PCA、LDA、MDS、LLE、TSNE 等,并附有相關(guān)資料、展示效果;非常適合機(jī)器學(xué)習(xí)初學(xué)者和剛剛?cè)肟訑?shù)據(jù)挖掘的小伙伴。

[[283851]]

為什么要進(jìn)行數(shù)據(jù)降維?

所謂降維,即用一組個數(shù)為 d 的向量 Zi 來代表個數(shù)為 D 的向量 Xi 所包含的有用信息,其中 d

通常,我們會發(fā)現(xiàn)大部分?jǐn)?shù)據(jù)集的維度都會高達(dá)成百乃至上千,而經(jīng)典的 MNIST,其維度都是 64。

哈工大碩士生用Python 實(shí)現(xiàn)了 11 種經(jīng)典數(shù)據(jù)降維算法,源代碼庫已開放

MNIST 手寫數(shù)字?jǐn)?shù)據(jù)集

但在實(shí)際應(yīng)用中,我們所用到的有用信息卻并不需要那么高的維度,而且每增加一維所需的樣本個數(shù)呈指數(shù)級增長,這可能會直接帶來極大的「維數(shù)災(zāi)難」;而數(shù)據(jù)降維就可以實(shí)現(xiàn):

  • 使得數(shù)據(jù)集更易使用

  • 確保變量之間彼此獨(dú)立

  • 降低算法計算運(yùn)算成本

  • 去除噪音

一旦我們能夠正確處理這些信息,正確有效地進(jìn)行降維,這將大大有助于減少計算量,進(jìn)而提高機(jī)器運(yùn)作效率。而數(shù)據(jù)降維,也常應(yīng)用于文本處理、人臉識別、圖片識別、自然語言處理等領(lǐng)域。

哈工大碩士生用Python 實(shí)現(xiàn)了 11 種經(jīng)典數(shù)據(jù)降維算法,源代碼庫已開放

數(shù)據(jù)降維原理

往往高維空間的數(shù)據(jù)會出現(xiàn)分布稀疏的情況,所以在降維處理的過程中,我們通常會做一些數(shù)據(jù)刪減,這些數(shù)據(jù)包括了冗余的數(shù)據(jù)、無效信息、重復(fù)表達(dá)內(nèi)容等。

例如:現(xiàn)有一張 1024*1024 的圖,除去中心 50*50 的區(qū)域其它位置均為零值,這些為零的信息就可以歸為無用信息;而對于對稱圖形而言,對稱部分的信息則可以歸為重復(fù)信息。

[[283852]]

因此,大部分經(jīng)典降維技術(shù)也是基于這一內(nèi)容而展開,其中降維方法又分為線性和非線性降維,非線性降維又分為基于核函數(shù)和基于特征值的方法。

  • 線性降維方法:

PCA 、ICA LDA、LFA、LPP(LE 的線性表示)

  • 非線性降維方法:

基于核函數(shù)的非線性降維方法——KPCA 、KICA、KDA

基于特征值的非線性降維方法(流型學(xué)習(xí))——ISOMAP、LLE、LE、LPP、LTSA、MVU

哈爾濱工業(yè)大學(xué)計算機(jī)技術(shù)專業(yè)的在讀碩士生 Heucoder 則整理了 PCA、KPCA、LDA、MDS、ISOMAP、LLE、TSNE、AutoEncoder、FastICA、SVD、LE、LPP 共 12 種經(jīng)典的降維算法,并提供了相關(guān)資料、代碼以及展示,下面將主要以 PCA 算法為例介紹降維算法具體操作。

主成分分析(PCA)降維算法

PCA 是一種基于從高維空間映射到低維空間的映射方法,也是最基礎(chǔ)的無監(jiān)督降維算法,其目標(biāo)是向數(shù)據(jù)變化最大的方向投影,或者說向重構(gòu)誤差最小化的方向投影。它由 Karl Pearson 在 1901 年提出,屬于線性降維方法。與 PCA 相關(guān)的原理通常被稱為最大方差理論或最小誤差理論。這兩者目標(biāo)一致,但過程側(cè)重點(diǎn)則不同。

哈工大碩士生用Python 實(shí)現(xiàn)了 11 種經(jīng)典數(shù)據(jù)降維算法,源代碼庫已開放

最大方差理論降維原理

將一組 N 維向量降為 K 維(K 大于 0,小于 N),其目標(biāo)是選擇 K 個單位正交基,各字段兩兩間 COV(X,Y) 為 0,而字段的方差則盡可能大。因此,最大方差即使得投影數(shù)據(jù)的方差被最大化,在這過程中,我們需要找到數(shù)據(jù)集 Xmxn 的最佳的投影空間 Wnxk、協(xié)方差矩陣等,其算法流程為:

  • 算法輸入:數(shù)據(jù)集 Xmxn;

  • 按列計算數(shù)據(jù)集 X 的均值 Xmean,然后令 Xnew=X−Xmean;

  • 求解矩陣 Xnew 的協(xié)方差矩陣,并將其記為 Cov;

  • 計算協(xié)方差矩陣 COv 的特征值和相應(yīng)的特征向量;

  • 將特征值按照從大到小的排序,選擇其中最大的 k 個,然后將其對應(yīng)的 k 個特征向量分別作為列向量組成特征向量矩陣 Wnxk;

  • 計算 XnewW,即將數(shù)據(jù)集 Xnew 投影到選取的特征向量上,這樣就得到了我們需要的已經(jīng)降維的數(shù)據(jù)集 XnewW。

哈工大碩士生用Python 實(shí)現(xiàn)了 11 種經(jīng)典數(shù)據(jù)降維算法,源代碼庫已開放

最小誤差理論降維原理

而最小誤差則是使得平均投影代價最小的線性投影,這一過程中,我們則需要找到的是平方錯誤評價函數(shù) J0(x0) 等參數(shù)。

詳細(xì)步驟可參考《從零開始實(shí)現(xiàn)主成分分析 (PCA) 算法》:

https://blog.csdn.net/u013719780/article/details/78352262

主成分分析(PCA)代碼實(shí)現(xiàn)

哈工大碩士生用Python 實(shí)現(xiàn)了 11 種經(jīng)典數(shù)據(jù)降維算法,源代碼庫已開放

關(guān)于 PCA 算法的代碼如下:

  1. from __future__ import print_function 
  2.  
  3. from sklearn import datasets 
  4.  
  5. import matplotlib.pyplot as plt 
  6.  
  7. import matplotlib.cm as cmx 
  8.  
  9. import matplotlib.colors as colors 
  10.  
  11. import numpy as np 
  12.  
  13. %matplotlib inline 
  14.  
  15. def shuffle_data(X, y, seed=None): 
  16.  
  17. if seed: 
  18.  
  19. np.random.seed(seed) 
  20.  
  21. idx = np.arange(X.shape[0]) 
  22.  
  23. np.random.shuffle(idx) 
  24.  
  25. return X[idx], y[idx] 
  26.  
  27. # 正規(guī)化數(shù)據(jù)集 X 
  28.  
  29. def normalize(X, axis=-1, p=2): 
  30.  
  31. lp_norm = np.atleast_1d(np.linalg.norm(X, p, axis)) 
  32.  
  33. lp_norm[lp_norm == 0] = 1 
  34.  
  35. return X / np.expand_dims(lp_norm, axis) 
  36.  
  37. # 標(biāo)準(zhǔn)化數(shù)據(jù)集 X 
  38.  
  39. def standardize(X): 
  40.  
  41. X_std = np.zeros(X.shape) 
  42.  
  43. mean = X.mean(axis=0
  44.  
  45. std = X.std(axis=0
  46.  
  47. # 做除法運(yùn)算時請永遠(yuǎn)記住分母不能等于 0 的情形 
  48.  
  49. # X_std = (X - X.mean(axis=0)) / X.std(axis=0
  50.  
  51. for col in range(np.shape(X)[1]): 
  52.  
  53. if std[col]: 
  54.  
  55. X_std[:, col] = (X_std[:, col] - mean[col]) / std[col] 
  56.  
  57. return X_std 
  58.  
  59. # 劃分?jǐn)?shù)據(jù)集為訓(xùn)練集和測試集 
  60.  
  61. def train_test_split(X, y, test_size=0.2, shuffle=True, seed=None): 
  62.  
  63. if shuffle: 
  64.  
  65. X, y = shuffle_data(X, y, seed) 
  66.  
  67. n_train_samples = int(X.shape[0] * (1-test_size)) 
  68.  
  69. x_train, x_test = X[:n_train_samples], X[n_train_samples:] 
  70.  
  71. y_train, y_test = y[:n_train_samples], y[n_train_samples:] 
  72.  
  73. return x_train, x_test, y_train, y_test 
  74.  
  75. # 計算矩陣 X 的協(xié)方差矩陣 
  76.  
  77. def calculate_covariance_matrix(X, Y=np.empty((0,0))): 
  78.  
  79. if not Y.any: 
  80.  
  81. Y = X 
  82.  
  83. n_samples = np.shape(X)[0
  84.  
  85. covariance_matrix = (1 / (n_samples-1)) * (X - X.mean(axis=0)).T.dot(Y - Y.mean(axis=0)) 
  86.  
  87. return np.array(covariance_matrix, dtype=float
  88.  
  89. # 計算數(shù)據(jù)集 X 每列的方差 
  90.  
  91. def calculate_variance(X): 
  92.  
  93. n_samples = np.shape(X)[0
  94.  
  95. variance = (1 / n_samples) * np.diag((X - X.mean(axis=0)).T.dot(X - X.mean(axis=0))) 
  96.  
  97. return variance 
  98.  
  99. # 計算數(shù)據(jù)集 X 每列的標(biāo)準(zhǔn)差 
  100.  
  101. def calculate_std_dev(X): 
  102.  
  103. std_dev = np.sqrt(calculate_variance(X)) 
  104.  
  105. return std_dev 
  106.  
  107. # 計算相關(guān)系數(shù)矩陣 
  108.  
  109. def calculate_correlation_matrix(X, Y=np.empty([0])): 
  110.  
  111. # 先計算協(xié)方差矩陣 
  112.  
  113. covariance_matrix = calculate_covariance_matrix(X, Y) 
  114.  
  115. # 計算 X, Y 的標(biāo)準(zhǔn)差 
  116.  
  117. std_dev_X = np.expand_dims(calculate_std_dev(X), 1
  118.  
  119. std_dev_y = np.expand_dims(calculate_std_dev(Y), 1
  120.  
  121. correlation_matrix = np.divide(covariance_matrix, std_dev_X.dot(std_dev_y.T)) 
  122.  
  123. return np.array(correlation_matrix, dtype=float
  124.  
  125. class PCA: 
  126.  
  127. ""
  128.  
  129. 主成份分析算法 PCA,非監(jiān)督學(xué)習(xí)算法. 
  130.  
  131. ""
  132.  
  133. def __init__(self): 
  134.  
  135. self.eigen_values = None 
  136.  
  137. self.eigen_vectors = None 
  138.  
  139. self.k = 2 
  140.  
  141. def transform(self, X): 
  142.  
  143. ""
  144.  
  145. 將原始數(shù)據(jù)集 X 通過 PCA 進(jìn)行降維 
  146.  
  147. ""
  148.  
  149. covariance = calculate_covariance_matrix(X) 
  150.  
  151. # 求解特征值和特征向量 
  152.  
  153. self.eigen_values, self.eigen_vectors = np.linalg.eig(covariance) 
  154.  
  155. # 將特征值從大到小進(jìn)行排序,注意特征向量是按列排的,即 self.eigen_vectors 第 k 列是 self.eigen_values 中第 k 個特征值對應(yīng)的特征向量 
  156.  
  157. idx = self.eigen_values.argsort[::-1
  158.  
  159. eigenvalues = self.eigen_values[idx][:self.k] 
  160.  
  161. eigenvectors = self.eigen_vectors[:, idx][:, :self.k] 
  162.  
  163. # 將原始數(shù)據(jù)集 X 映射到低維空間 
  164.  
  165. X_transformed = X.dot(eigenvectors) 
  166.  
  167. return X_transformed 
  168.  
  169. def main: 
  170.  
  171. # Load the dataset 
  172.  
  173. data = datasets.load_iris 
  174.  
  175. X = data.data 
  176.  
  177. y = data.target 
  178.  
  179. # 將數(shù)據(jù)集 X 映射到低維空間 
  180.  
  181. X_trans = PCA.transform(X) 
  182.  
  183. x1 = X_trans[:, 0
  184.  
  185. x2 = X_trans[:, 1
  186.  
  187. cmap = plt.get_cmap('viridis'
  188.  
  189. colors = [cmap(i) for i in np.linspace(01, len(np.unique(y)))] 
  190.  
  191. class_distr = 
  192.  
  193. # Plot the different class distributions 
  194.  
  195. for i, l in enumerate(np.unique(y)): 
  196.  
  197. _x1 = x1[y == l] 
  198.  
  199. _x2 = x2[y == l] 
  200.  
  201. _y = y[y == l] 
  202.  
  203. class_distr.append(plt.scatter(_x1, _x2, color=colors[i])) 
  204.  
  205. # Add a legend 
  206.  
  207. plt.legend(class_distr, y, loc=1
  208.  
  209. # Axis labels 
  210.  
  211. plt.xlabel('Principal Component 1'
  212.  
  213. plt.ylabel('Principal Component 2'
  214.  
  215. plt.show 
  216.  
  217. if __name__ == "__main__"
  218.  
  219. main 

最終,我們將得到降維結(jié)果如下。其中,如果得到當(dāng)特征數(shù) (D) 遠(yuǎn)大于樣本數(shù) (N) 時,可以使用一點(diǎn)小技巧實(shí)現(xiàn) PCA 算法的復(fù)雜度轉(zhuǎn)換。

哈工大碩士生用Python 實(shí)現(xiàn)了 11 種經(jīng)典數(shù)據(jù)降維算法,源代碼庫已開放

PCA 降維算法展示

當(dāng)然,這一算法雖然經(jīng)典且較為常用,其不足之處也非常明顯。它可以很好的解除線性相關(guān),但是面對高階相關(guān)性時,效果則較差;同時,PCA 實(shí)現(xiàn)的前提是假設(shè)數(shù)據(jù)各主特征是分布在正交方向上,因此對于在非正交方向上存在幾個方差較大的方向,PCA 的效果也會大打折扣。

其它降維算法及代碼地址

  • KPCA(kernel PCA)

KPCA 是核技術(shù)與 PCA 結(jié)合的產(chǎn)物,它與 PCA 主要差別在于計算協(xié)方差矩陣時使用了核函數(shù),即是經(jīng)過核函數(shù)映射之后的協(xié)方差矩陣。

引入核函數(shù)可以很好的解決非線性數(shù)據(jù)映射問題。kPCA 可以將非線性數(shù)據(jù)映射到高維空間,在高維空間下使用標(biāo)準(zhǔn) PCA 將其映射到另一個低維空間。

哈工大碩士生用Python 實(shí)現(xiàn)了 11 種經(jīng)典數(shù)據(jù)降維算法,源代碼庫已開放

KPCA 降維算法展示

詳細(xì)內(nèi)容可參見 《Python 機(jī)器學(xué)習(xí)》之特征抽取——kPCA:

https://blog.csdn.net/weixin_40604987/article/details/79632888

代碼地址:

https://github.com/heucoder/dimensionality_reduction_alo_codes/blob/master/codes/PCA/KPCA.py

  • LDA(Linear Discriminant Analysis)

LDA 是一種可作為特征抽取的技術(shù),其目標(biāo)是向最大化類間差異,最小化類內(nèi)差異的方向投影,以利于分類等任務(wù)即將不同類的樣本有效的分開。LDA 可以提高數(shù)據(jù)分析過程中的計算效率,對于未能正則化的模型,可以降低維度災(zāi)難帶來的過擬合。

哈工大碩士生用Python 實(shí)現(xiàn)了 11 種經(jīng)典數(shù)據(jù)降維算法,源代碼庫已開放

LDA 降維算法展示

詳細(xì)內(nèi)容可參見《數(shù)據(jù)降維—線性判別分析(LDA)》:

https://blog.csdn.net/ChenVast/article/details/79227945

代碼地址:

https://github.com/heucoder/dimensionality_reduction_alo_codes/tree/master/codes/LDA

  • MDS(multidimensional scaling)

MDS 即多維標(biāo)度分析,它是一種通過直觀空間圖表示研究對象的感知和偏好的傳統(tǒng)降維方法。該方法會計算任意兩個樣本點(diǎn)之間的距離,使得投影到低維空間之后能夠保持這種相對距離從而實(shí)現(xiàn)投影。

由于 sklearn 中 MDS 是采用迭代優(yōu)化方式,下面實(shí)現(xiàn)了迭代和非迭代的兩種。

哈工大碩士生用Python 實(shí)現(xiàn)了 11 種經(jīng)典數(shù)據(jù)降維算法,源代碼庫已開放

MDS 降維算法展示

詳細(xì)內(nèi)容可參見《MDS 算法》

https://blog.csdn.net/zhangweiguo_717/article/details/69663452

代碼地址:

https://github.com/heucoder/dimensionality_reduction_alo_codes/tree/master/codes/MDS

  • ISOMAP

Isomap 即等度量映射算法,該算法可以很好地解決 MDS 算法在非線性結(jié)構(gòu)數(shù)據(jù)集上的弊端。

MDS 算法是保持降維后的樣本間距離不變,Isomap 算法則引進(jìn)了鄰域圖,樣本只與其相鄰的樣本連接,計算出近鄰點(diǎn)之間的距離,然后在此基礎(chǔ)上進(jìn)行降維保距。

哈工大碩士生用Python 實(shí)現(xiàn)了 11 種經(jīng)典數(shù)據(jù)降維算法,源代碼庫已開放

ISOMAP 降維算法展示

詳細(xì)內(nèi)容可參見《Isomap》

https://blog.csdn.net/zhangweiguo_717/article/details/69802312

代碼地址:

https://github.com/heucoder/dimensionality_reduction_alo_codes/tree/master/codes/ISOMAP

  • LLE(locally linear embedding)

LLE 即局部線性嵌入算法,它是一種非線性降維算法。該算法核心思想為每個點(diǎn)可以由與它相鄰的多個點(diǎn)的線性組合而近似重構(gòu),然后將高維數(shù)據(jù)投影到低維空間中,使其保持?jǐn)?shù)據(jù)點(diǎn)之間的局部線性重構(gòu)關(guān)系,即有相同的重構(gòu)系數(shù)。在處理所謂的流形降維的時候,效果比 PCA 要好很多。

哈工大碩士生用Python 實(shí)現(xiàn)了 11 種經(jīng)典數(shù)據(jù)降維算法,源代碼庫已開放

LLE 降維算法展示

詳細(xì)內(nèi)容可參見《LLE 原理及推導(dǎo)過程》

https://blog.csdn.net/scott198510/article/details/76099630

代碼地址:

https://github.com/heucoder/dimensionality_reduction_alo_codes/tree/master/codes/LLE

  • t-SNE

t-SNE 也是一種非線性降維算法,非常適用于高維數(shù)據(jù)降維到 2 維或者 3 維進(jìn)行可視化。它是一種以數(shù)據(jù)原有的趨勢為基礎(chǔ),重建其在低緯度(二維或三維)下數(shù)據(jù)趨勢的無監(jiān)督機(jī)器學(xué)習(xí)算法。

下面的結(jié)果展示參考了源代碼,同時也可用 tensorflow 實(shí)現(xiàn)(無需手動更新參數(shù))。

哈工大碩士生用Python 實(shí)現(xiàn)了 11 種經(jīng)典數(shù)據(jù)降維算法,源代碼庫已開放

t-SNE 降維算法展示

詳細(xì)內(nèi)容可參見《t-SNE 使用過程中的一些坑》:

http://bindog.github.io/blog/2018/07/31/t-sne-tips/

代碼地址:

https://github.com/heucoder/dimensionality_reduction_alo_codes/tree/master/codes/T-SNE

  • LE(Laplacian Eigenmaps)

LE 即拉普拉斯特征映射,它與 LLE 算法有些相似,也是以局部的角度去構(gòu)建數(shù)據(jù)之間的關(guān)系。它的直觀思想是希望相互間有關(guān)系的點(diǎn)(在圖中相連的點(diǎn))在降維后的空間中盡可能的靠近;以這種方式,可以得到一個能反映流形的幾何結(jié)構(gòu)的解。

哈工大碩士生用Python 實(shí)現(xiàn)了 11 種經(jīng)典數(shù)據(jù)降維算法,源代碼庫已開放

LE 降維算法展示

詳細(xì)內(nèi)容可參見《拉普拉斯特征圖降維及其 python 實(shí)現(xiàn)》:

https://blog.csdn.net/HUSTLX/article/details/50850342

代碼地址:

https://github.com/heucoder/dimensionality_reduction_alo_codes/tree/master/codes/LE

  • LPP(Locality Preserving Projections)

LPP 即局部保留投影算法,其思路和拉普拉斯特征映射類似,核心思想為通過最好的保持一個數(shù)據(jù)集的鄰居結(jié)構(gòu)信息來構(gòu)造投影映射,但 LPP 不同于 LE 的直接得到投影結(jié)果,它需要求解投影矩陣。

哈工大碩士生用Python 實(shí)現(xiàn)了 11 種經(jīng)典數(shù)據(jù)降維算法,源代碼庫已開放

LPP 降維算法展示

詳情請參見《局部保留投影算法 (LPP) 詳解》:

https://blog.csdn.net/qq_39187538/article/details/90402961

代碼地址:

https://github.com/heucoder/dimensionality_reduction_alo_codes/tree/master/codes/LPP

*《dimensionality_reduction_alo_codes》項(xiàng)目作者簡介

Heucoder,目前是哈爾濱工業(yè)大學(xué)計算機(jī)技術(shù)在讀碩士生,主要活躍于互聯(lián)網(wǎng)領(lǐng)域,知乎昵稱為「超愛學(xué)習(xí)」,其 github 主頁地址為: https://github.com/heucoder。

Github 項(xiàng)目地址:

https://github.com/heucoder/dimensionality_reduction_alo_codes

 

責(zé)任編輯:張燕妮 來源: 雷鋒網(wǎng)
相關(guān)推薦

2022-04-26 06:15:34

降維算法Python

2019-03-12 11:11:25

開源Leveldb存儲

2022-03-10 12:03:33

Python算法代碼

2024-10-24 16:46:41

2018-06-03 08:22:55

Oracle云計算開源

2019-09-29 10:42:02

人工智能機(jī)器學(xué)習(xí)技術(shù)

2017-05-27 13:16:52

聯(lián)想企業(yè)網(wǎng)盤

2013-11-04 14:46:18

2011-08-09 09:21:19

微軟云計算源代碼

2011-08-03 08:41:02

微軟云端開放

2021-05-06 09:58:08

微軟AI 系統(tǒng)工具Counterfit

2010-12-21 11:05:03

2022-04-09 09:21:19

人工智能機(jī)器學(xué)習(xí)PCA算法

2025-02-28 09:40:00

2020-07-14 14:03:53

AI 數(shù)據(jù)人工智能

2023-01-05 08:45:07

國產(chǎn)數(shù)據(jù)庫代碼

2022-08-01 10:00:47

AI趨勢

2020-03-20 08:39:58

安全漏洞開源

2009-06-17 12:52:48

JBoss ON代理軟

2024-08-26 14:57:36

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號