用NN實現資料的降維

2021-06-20 08:04:00 字數 1861 閱讀 5610

資料降維的重要性就不必說了,而用nn(神經網路)來對資料進行大量的降維是從2006開始的,這起源於2023年science上的一篇文章:reducing the dimensionality of data with neural networks,作者就是鼎鼎有名的hinton,這篇文章也標誌著deep learning進入火熱的時代。

今天花了點時間讀了下這篇文章,下面是一點筆記:

多層感知機其實在上世紀已經被提出來了,但是為什麼它沒有得到廣泛應用呢?其原因在於對多層非線性網路進行權值優化時很難得到全域性的引數。因為一般使用數值優化演算法(比如bp演算法)時需要隨機給網路賦乙個值,而當這個權值太大的話,就很容易收斂到」差」的區域性收斂點,權值太小的話則在進行誤差反向傳遞時離輸入層越近的權值更新越慢,因此優化問題是多層nn沒有大規模應用的原因。而本文的作者設計出來的autoencoder深度網路確能夠較快的找到比較好的全域性最優點,它是用無監督的方法(這裡是rbm)先分開對每層網路進行訓練,然後將它當做是初始值來微調。這種方法被認為是對pca的乙個非線性泛化方法。

每一層網路的預訓練都採用的是rbm方法,關於rbm的簡單介紹可以參考前面的博文:deep learning:十九(rbm簡單理解),其主要思想是是利用能量函式,如下:

給定一張輸入影象(暫時是以二值影象為例),我們可以通過調整網路的權值和偏置值使得網路對該輸入影象的能量最低。

文章說單層的二值網路不足以模擬大量的資料集,因此一般採用多層網路,即把第一層網路的輸出作為第二層網路的輸入。並且每增加乙個網路層,就會提高網路對輸入資料重構的log下界概率值,且上層的網路能夠提取出其下層網路更高階的特徵。

影象的預訓練和微調,編碼和解碼的示意圖如下:

由上圖可以看到,當網路的預訓練過程完成後,我們需要把解碼部分重新拿回來展開構成整個網路,然後用真實的資料作為樣本標籤來微調網路的引數。

當網路的輸入資料是連續值時,只需將可視層的二進位制值改為服從方差為1的高斯分布即可,而第乙個隱含層的輸出仍然為二進位制變數。

文章中包含了多個實驗部分,有手寫數字體的識別,人臉影象的壓縮,新聞主題的提取等。在這些實驗的分層訓練過程中,其第乙個rbm網路的輸入層都是其對應的真實資料,且將值歸一化到了(0,1).而其它rbm的輸入層都是上乙個rbm網路輸出層的概率值;但是在實際的網路結構中,除了最底層的輸入層和最頂層rbm的隱含層是連續值外,其它所有層都是乙個二值隨機變數。此時最頂層rbm的隱含層是乙個高斯分布的隨機變數,其均值由該rbm的輸入值決定,方差為1。

實驗結果1:

這3副圖中每幅圖的最上面一層是原圖,其後面跟著的是用nn重構的圖,以及pca重構的圖(可以選取主成分數量不同的pca和logicpca或者標準pca的組合,本人對這logicpca沒有仔細去研究過)。其中左上角那副圖是用nn將乙個784維的資料直接降到6維!

作者通過實驗還發現:如果網路的深度淺到只有1個隱含層時,這時候可以不用對網路進行預訓練也同樣可以達到很好的效果,但是對網路用rbm進行預訓練可以節省後面用bp訓練的時間。另外,當網路中引數的個數是相同時,深層網路比淺層網路在測試資料上的重構誤差更小,但僅限於兩者引數個數相同時。作者在minist手寫數字識別庫中,用的是4個隱含層的網路結構,維數依次為784-500-500-2000-10,其識別誤差率減小至1.2%。預訓時練得到的網路權值佔最終識別率的主要部分,因為預訓練中已經隱含了資料的內部結構,而微調時用的標籤資料只對引數起到稍許的作用。

python用tsne降維 tSNE降維

我有兩套資料訓練和測試。這兩個資料集分別有30213和30235個專案,每個專案有66個維度。在 我正在嘗試應用scikit learn的t sne將維數降到2。由於資料集很大,如果我試圖一次性處理整個資料,我會遇到記憶體錯誤,我會嘗試將它們分成塊,然後一次轉換乙個塊,如下所示 tsne manif...

python降維分析 Python資料降維

一些資料降維的特徵提取演算法,先導入包和資料 import numpy as np import pandas as pd import matplotlib.pyplot as plt from mpl toolkits.mplot3d import axes3d from sklearn.dec...

使用python實現多維資料降維

一,首先介紹下多維列表的降維 def flatten a for each in a if not isinstance each,list yield each else yield from flatten each if name main a 1,2 3,4,5 6 print list f...