成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

哈工大碩士生用 Python 實現了 11 種經典數據降維算法,源代碼庫已開放

新聞 前端 算法
網上關于各種降維算法的資料參差不齊,同時大部分不提供源代碼。這里有個 GitHub 項目整理了使用 Python 實現了 11 種經典的數據抽取(數據降維)算法。

本文轉自雷鋒網,如需轉載請至雷鋒網官網申請授權。

網上關于各種降維算法的資料參差不齊,同時大部分不提供源代碼。這里有個 GitHub 項目整理了使用 Python 實現了 11 種經典的數據抽取(數據降維)算法,包括:PCA、LDA、MDS、LLE、TSNE 等,并附有相關資料、展示效果;非常適合機器學習初學者和剛剛入坑數據挖掘的小伙伴。

[[283851]]

為什么要進行數據降維?

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

通常,我們會發現大部分數據集的維度都會高達成百乃至上千,而經典的 MNIST,其維度都是 64。

哈工大碩士生用Python 實現了 11 種經典數據降維算法,源代碼庫已開放

MNIST 手寫數字數據集

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

  • 使得數據集更易使用

  • 確保變量之間彼此獨立

  • 降低算法計算運算成本

  • 去除噪音

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

哈工大碩士生用Python 實現了 11 種經典數據降維算法,源代碼庫已開放

數據降維原理

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

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

[[283852]]

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

  • 線性降維方法:

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

  • 非線性降維方法:

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

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

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

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

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

哈工大碩士生用Python 實現了 11 種經典數據降維算法,源代碼庫已開放

最大方差理論降維原理

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

  • 算法輸入:數據集 Xmxn;

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

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

  • 計算協方差矩陣 COv 的特征值和相應的特征向量;

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

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

哈工大碩士生用Python 實現了 11 種經典數據降維算法,源代碼庫已開放

最小誤差理論降維原理

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

詳細步驟可參考《從零開始實現主成分分析 (PCA) 算法》:

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

主成分分析(PCA)代碼實現

哈工大碩士生用Python 實現了 11 種經典數據降維算法,源代碼庫已開放

關于 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. # 正規化數據集 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. # 標準化數據集 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. # 做除法運算時請永遠記住分母不能等于 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. # 劃分數據集為訓練集和測試集 
  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 的協方差矩陣 
  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. # 計算數據集 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. # 計算數據集 X 每列的標準差 
  100.  
  101. def calculate_std_dev(X): 
  102.  
  103. std_dev = np.sqrt(calculate_variance(X)) 
  104.  
  105. return std_dev 
  106.  
  107. # 計算相關系數矩陣 
  108.  
  109. def calculate_correlation_matrix(X, Y=np.empty([0])): 
  110.  
  111. # 先計算協方差矩陣 
  112.  
  113. covariance_matrix = calculate_covariance_matrix(X, Y) 
  114.  
  115. # 計算 X, Y 的標準差 
  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,非監督學習算法. 
  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. 將原始數據集 X 通過 PCA 進行降維 
  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. # 將特征值從大到小進行排序,注意特征向量是按列排的,即 self.eigen_vectors 第 k 列是 self.eigen_values 中第 k 個特征值對應的特征向量 
  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. # 將原始數據集 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. # 將數據集 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 

最終,我們將得到降維結果如下。其中,如果得到當特征數 (D) 遠大于樣本數 (N) 時,可以使用一點小技巧實現 PCA 算法的復雜度轉換。

哈工大碩士生用Python 實現了 11 種經典數據降維算法,源代碼庫已開放

PCA 降維算法展示

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

其它降維算法及代碼地址

  • KPCA(kernel PCA)

KPCA 是核技術與 PCA 結合的產物,它與 PCA 主要差別在于計算協方差矩陣時使用了核函數,即是經過核函數映射之后的協方差矩陣。

引入核函數可以很好的解決非線性數據映射問題。kPCA 可以將非線性數據映射到高維空間,在高維空間下使用標準 PCA 將其映射到另一個低維空間。

哈工大碩士生用Python 實現了 11 種經典數據降維算法,源代碼庫已開放

KPCA 降維算法展示

詳細內容可參見 《Python 機器學習》之特征抽取——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 是一種可作為特征抽取的技術,其目標是向最大化類間差異,最小化類內差異的方向投影,以利于分類等任務即將不同類的樣本有效的分開。LDA 可以提高數據分析過程中的計算效率,對于未能正則化的模型,可以降低維度災難帶來的過擬合。

哈工大碩士生用Python 實現了 11 種經典數據降維算法,源代碼庫已開放

LDA 降維算法展示

詳細內容可參見《數據降維—線性判別分析(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 即多維標度分析,它是一種通過直觀空間圖表示研究對象的感知和偏好的傳統降維方法。該方法會計算任意兩個樣本點之間的距離,使得投影到低維空間之后能夠保持這種相對距離從而實現投影。

由于 sklearn 中 MDS 是采用迭代優化方式,下面實現了迭代和非迭代的兩種。

哈工大碩士生用Python 實現了 11 種經典數據降維算法,源代碼庫已開放

MDS 降維算法展示

詳細內容可參見《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 算法在非線性結構數據集上的弊端。

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

哈工大碩士生用Python 實現了 11 種經典數據降維算法,源代碼庫已開放

ISOMAP 降維算法展示

詳細內容可參見《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 即局部線性嵌入算法,它是一種非線性降維算法。該算法核心思想為每個點可以由與它相鄰的多個點的線性組合而近似重構,然后將高維數據投影到低維空間中,使其保持數據點之間的局部線性重構關系,即有相同的重構系數。在處理所謂的流形降維的時候,效果比 PCA 要好很多。

哈工大碩士生用Python 實現了 11 種經典數據降維算法,源代碼庫已開放

LLE 降維算法展示

詳細內容可參見《LLE 原理及推導過程》

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

代碼地址:

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

  • t-SNE

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

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

哈工大碩士生用Python 實現了 11 種經典數據降維算法,源代碼庫已開放

t-SNE 降維算法展示

詳細內容可參見《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 算法有些相似,也是以局部的角度去構建數據之間的關系。它的直觀思想是希望相互間有關系的點(在圖中相連的點)在降維后的空間中盡可能的靠近;以這種方式,可以得到一個能反映流形的幾何結構的解。

哈工大碩士生用Python 實現了 11 種經典數據降維算法,源代碼庫已開放

LE 降維算法展示

詳細內容可參見《拉普拉斯特征圖降維及其 python 實現》:

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 即局部保留投影算法,其思路和拉普拉斯特征映射類似,核心思想為通過最好的保持一個數據集的鄰居結構信息來構造投影映射,但 LPP 不同于 LE 的直接得到投影結果,它需要求解投影矩陣。

哈工大碩士生用Python 實現了 11 種經典數據降維算法,源代碼庫已開放

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》項目作者簡介

Heucoder,目前是哈爾濱工業大學計算機技術在讀碩士生,主要活躍于互聯網領域,知乎昵稱為「超愛學習」,其 github 主頁地址為: https://github.com/heucoder

Github 項目地址:

https://github.com/heucoder/dimensionality_reduction_alo_codes

 

責任編輯:張燕妮 來源: 雷鋒網
相關推薦

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

2025-05-19 14:56:45

3D模型訓練

2018-06-03 08:22:55

Oracle云計算開源

2019-09-29 10:42:02

人工智能機器學習技術

2017-05-27 13:16:52

聯想企業網盤

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 系統工具Counterfit

2010-12-21 11:05:03

2022-04-09 09:21:19

人工智能機器學習PCA算法

2025-02-28 09:40:00

2020-07-14 14:03:53

AI 數據人工智能

2023-01-05 08:45:07

國產數據庫代碼

2022-08-01 10:00:47

AI趨勢

2009-06-17 12:52:48

JBoss ON代理軟

2020-03-20 08:39:58

安全漏洞開源
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲人成人一区二区在线观看 | 久久精品综合 | 中文字幕乱码一区二区三区 | 在线观看亚洲欧美 | 999久久久 | 91精品久久久久久久久中文字幕 | 亚洲精品黄色 | 久久久国产精品一区 | 性色av香蕉一区二区 | 二区成人| 天天躁日日躁狠狠的躁天龙影院 | 日本精品一区二区三区视频 | 毛片a级毛片免费播放100 | 在线一区视频 | 久久蜜桃av一区二区天堂 | 欧洲亚洲一区 | 成人三区 | 天天综合久久 | 日韩精品在线看 | 我想看国产一级毛片 | 亚洲国产成人精品在线 | 国产精品久久久久久吹潮日韩动画 | 国产日韩欧美激情 | 青青久在线视频 | 国产精品一区在线 | 国产精品中文字幕在线 | 国产一区视频在线 | 国产午夜精品福利 | 国产一级淫片免费视频 | 国产精品久久久久久久久免费樱桃 | 国产成人精品视频在线观看 | 九九热国产精品视频 | 狠狠草视频 | 亚洲精品在线免费看 | 日韩精品无码一区二区三区 | 亚洲精品乱码久久久久久蜜桃91 | 久久久久久久久久久久亚洲 | 久久久www成人免费无遮挡大片 | 日本免费一区二区三区四区 | 在线免费黄色小视频 | 日韩欧美亚洲 |