日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

降維算法:主成分分析 VS 自動編碼器

 

降維是一種減少特征空間維度以獲得穩定的、統計上可靠的機器學習模型的技術。降維主要有兩種途徑:特征選擇和特征變換。

特征選擇通過選擇重要程度最高的若干特征,移除共性的或者重要程度較低的特征。

特征轉換也稱為特征提取,試圖將高維數據投影到低維空間。一些特征轉換技術有主成分分析(PCA)、矩陣分解、自動編碼器(Autoencoders)、t-Sne、UMAP等。

本文主要介紹了主成分分析以及自動編碼器兩種方法,具體分析兩者的優缺點,并且通過一個生動的示例進行詳解。

主成分分析

主成分分析是一種無監督技術,將原始數據投影到若干高方差方向(維度)。這些高方差方向彼此正交,因此投影數據的相關性非常低或幾乎接近于 0。這些特征轉換是線性的,具體方法是:

步驟一:計算相關矩陣數據,相關矩陣的大小為 n*n。

步驟二:計算矩陣的特征向量和特征值。

步驟三:選取特征值較高的 k 個特征向量作為主方向。

步驟四:將原始數據集投影到這 k 個特征向量方向,得到 k 維數據,其中 k≤n。

自動編碼器

自動編碼器是一種無監督的人工神經網絡,它將數據壓縮到較低的維數,然后重新構造輸入。自動編碼器通過消除重要特征上的噪聲和冗余,找到數據在較低維度的表征。它基于編解碼結構,編碼器將高維數據編碼到低維,解碼器接收低維數據并嘗試重建原始高維數據。

降維算法:主成分分析 VS 自動編碼器

 

自動編碼器基本結構示意圖

降維算法:主成分分析 VS 自動編碼器

 

深層自動編碼器結構示意圖

上圖中, X 是輸入數據,z 是 X 在低維空間的數據表征,X' 是重構得到的數據。根據激活函數的不同,數據從高緯度到低緯度的映射可以是線性的,也可以是非線性的。

性能對比:主成分分析 VS 自動編碼器

1. PCA 只能做線性變換;而自動編碼器既可以做線性變換,也可以做非線性變換。

1. 由于既有的 PCA 算法是十分成熟的,所以計算很快;而自動編碼器需要通過梯度下降算法進行訓練,所以需要花費更長的時間。

1. PCA 將數據投影到若干正交的方向;而自動編碼器降維后數據維度并不一定是正交的。

1. PCA 是輸入空間向最大變化方向的簡單線性變換;而自動編碼器是一種更復雜的技術,可以對相對復雜的非線性關系進行建模。

1. 依據經驗來看,PCA 適用于數據量較小的場景;而自動編碼器可以用于復雜的大型數據集。

1. PCA 唯一的超參數是正交向量的數量;而自動編碼器的超參數則是神經網絡的結構參數。

1. 單層的并且采用線性函數作為激活函數的自動編碼器與 PCA 性能一致;但是多層的以非線性函數作為激活函數的自動編碼器(深度自動編碼器)能夠具有很好的性能,雖然可能會存在過擬合,但是可以通過正則化等方式進行解決。

降維示例:圖像數據

降維算法:主成分分析 VS 自動編碼器

 

示例圖片

該示例圖片的數據維度為 360*460。我們將嘗試通過 PCA 和自動編碼器將數據規模降低為原有的 10%。

PCA 方法

pct_reduction = 0.10
reduced_pixel  = int( pct_reduction* original_dimensions[1])
#Applying PCA
pca = PCA(n_components=reduced_pixel)
pca.fit(image_matrix)
#Transforming the input matrix
X_transformed = pca.transform(image_matrix)
print("Original Input dimesnions {}".format(original_dimensions))
print("New Reduced dimensions {}".format(X_transformed.shape))

輸出如下:

Original Input dimesnions (360, 460)
New Reduced dimensions (360, 46)

檢查各維度的相關性:

df_pca = pd.DataFrame(data = X_transformed,columns=list(range(X_transformed.shape[1])))
figure = plt.figure(figsize=(10,6))
corrMatrix = df_pca.corr()
sns.heatmap(corrMatrix, annot=False)
plt.show()
降維算法:主成分分析 VS 自動編碼器

 

PCA降維后各維度相關性

從上圖可以看出,PCA 降維后各個維度都是不相關的,也就是完全正交。

接下來,我們通過降維后的數據來重構原始數據:

reconstructed_matrix = pca.inverse_transform(X_transformed)
reconstructed_image_pca = Image.fromarray(np.uint8(reconstructed_matrix))
plt.figure(figsize=(8,12))
plt.imshow(reconstructed_image_pca,cmap = plt.cm.gray)
降維算法:主成分分析 VS 自動編碼器

 

PCA 圖像重構

計算重構后圖像的均方根誤差:

def my_rmse(np_arr1,np_arr2):
    dim = np_arr1.shape
    tot_loss = 0
    for i in range(dim[0]):
        for j in range(dim[1]):
            tot_loss += math.pow((np_arr1[i,j] - np_arr2[i,j]),2)
    return round(math.sqrt(tot_loss/(dim[0]* dim[1]*1.0)),2)
error_pca = my_rmse(image_matrix,reconstructed_matrix)

計算可知,均方根誤差為11.84。

單層的以線性函數作為激活函數的自動編碼器

# Standarise the Data
X_org = image_matrix.copy()
sc = StandardScaler()
X = sc.fit_transform(X_org)
# this is the size of our encoded representations
encoding_dim = reduced_pixel 
# this is our input placeholder
input_img = Input(shape=(img.width,))
# "encoded" is the encoded representation of the input
encoded = Dense(encoding_dim, activation='linear')(input_img)
# "decoded" is the lossy reconstruction of the input
decoded = Dense(img.width, activation=None)(encoded)
# this model maps an input to its reconstruction
autoencoder = Model(input_img, decoded)
#Encoder
encoder = Model(input_img, encoded)
# create a placeholder for an encoded (32-dimensional) input
encoded_input = Input(shape=(encoding_dim,))
# retrieve the last layer of the autoencoder model
decoder_layer = autoencoder.layers[-1]
# create the decoder model
decoder = Model(encoded_input, decoder_layer(encoded_input))
autoencoder.compile(optimizer='adadelta', loss='mean_squared_error')
autoencoder.fit(X, X,
                epochs=500,
                batch_size=16,
                shuffle=True)
encoded_imgs = encoder.predict(X)
decoded_imgs = decoder.predict(encoded_imgs)
降維算法:主成分分析 VS 自動編碼器

 

自動編碼器結構

檢查各維度的相關性:

df_ae = pd.DataFrame(data = encoded_imgs,columns=list(range(encoded_imgs.shape[1])))
figure = plt.figure(figsize=(10,6))
corrMatrix = df_ae.corr()
sns.heatmap(corrMatrix, annot=False)
plt.show()
降維算法:主成分分析 VS 自動編碼器

 

自動編碼器降維后各維度相關性

相關矩陣表明新的變換特征具有一定的相關性。皮爾遜相關系數與0有很大的偏差。

接下來,我們通過降維后的數據來重構原始數據:

X_decoded_ae = sc.inverse_transform(decoded_imgs)
reconstructed_image_ae = Image.fromarray(np.uint8(X_decoded_ae))
plt.figure(figsize=(8,12))
plt.imshow(reconstructed_image_ae,cmap = plt.cm.gray)
降維算法:主成分分析 VS 自動編碼器

 

自動編碼器重構后的圖像

計算重構后圖像的均方根誤差:

error_ae = my_rmse(image_matrix,X_decoded_ae)

計算可知,均方根誤差為12.15。單層線性激活的自動編碼器和 PCA 性能幾乎一致。

三層的以非線性函數為激活函數的自動編碼器

input_img = Input(shape=(img.width,))
encoded1 = Dense(128, activation='relu')(input_img)
encoded2 = Dense(reduced_pixel, activation='relu')(encoded1)
decoded1 = Dense(128, activation='relu')(encoded2)
decoded2 = Dense(img.width, activation=None)(decoded1)
autoencoder = Model(input_img, decoded2)
autoencoder.compile(optimizer='adadelta', loss='mean_squared_error')
autoencoder.fit(X,X,
                epochs=500,
                batch_size=16,
                shuffle=True)
# Encoder
encoder = Model(input_img, encoded2)
# Decoder
decoder = Model(input_img, decoded2)
encoded_imgs = encoder.predict(X)
decoded_imgs = decoder.predict(X)
降維算法:主成分分析 VS 自動編碼器

 

自動編碼器模型結構

圖像重構:

X_decoded_deep_ae = sc.inverse_transform(decoded_imgs)
reconstructed_image_deep_ae = Image.fromarray(np.uint8(X_decoded_deep_ae))
plt.figure(figsize=(8,12))
plt.imshow(reconstructed_image_deep_ae,cmap = plt.cm.gray)
降維算法:主成分分析 VS 自動編碼器

 

計算均方誤差:

error_dae = my_rmse(image_matrix,X_decoded_deep_ae)

多層自動編碼器的均方誤差為 8.57,性能優于 PCA,提升了 28%。

具有非線性激活的附加層的自動編碼器能夠更好地捕獲圖像中的非線性特征。它能夠比PCA更好地捕捉復雜的模式和像素值的突然變化。但是它需要花費相對較高的訓練時間和資源。

總結

本文主要介紹了主成分分析以及自動編碼器兩種方法,具體分析兩者的優缺點,并且通過一個生動的示例進行詳解。

完整代碼github: samread81/PCA-versus-AE

作者:Abhishek Mungoli

deephub翻譯組:Oliver Lee

分享到:
標簽:算法
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定