高維數據降維——主成分分析


一、 高維數據降維

  高維數據降維是指采取某種映射方法,降低隨機變量的數量。例如將數據點從高維空間映射到低維空間中,從而實現維度減少。降維分為特征選擇和特征提取兩類,前者是從含有冗余信息以及噪聲信息的數據中找出主要變量,后者是去掉原來數據,生成新的變量,可以尋找數據內部的本質結構特征。

  簡要來說,就是通過對輸入的原始數據的特征學習,得到一個映射函數,實現將輸入樣本映射后到低維空間中,其原始數據的特征並沒有明顯損失。通常新空間的維度要小於原空間的維度。目前大部分降維算法是處理向量形式的數據。

二、 主成分分析過程

  主成分分析(Principal Component Analysis,PCA)是一種最常用的線性降維方法,目標是通過某種線性投影,將高維數據映射到低維空間中,並期望在所投影的維度上數據的方差最大。PCA的降維是指經過正交變換后,形成新的特征集合,然后從中選擇比較重要的一部分子特征集合,從而實現降維。這種方式並非是在原始特征中選擇,所以PCA極大程度保留了原有的樣本特征。

  關於PCA降維原理,請參考http://blog.codinglabs.org/articles/pca-tutorial.html

 

PCA降維的一般過程:

設有 m 條 n 維的數據。

①    將原始數據按列組成n行m列矩陣X

②    計算矩陣 X 中每個特征屬性(n 維)的平均向量M(平均值);

③    將X的每一行(代表一個屬性字段)進行零均值化,即減去這一行的均值M;

④    求出協方差矩陣

⑤    求出協方差矩陣的特征值及對應的特征向量;

⑥    將特征向量按對應特征值大小從上到下按行排列成矩陣,取前k(k<n)行組成基向量P;

⑦    Y=PX即為降維到k維后的數據;

 

  PCA目標是求出樣本數據的協方差矩陣的特征值和特征向量,而協方差矩陣的特征向量的方向就是PCA需要投影的方向。使用樣本數據向低維投影后,能盡可能的表征原始的數據。協方差矩陣可以用散布矩陣代替,即協方差矩陣*(n-1),其中n為樣本的數量。

三、 案例演示

  1. 基於sklearn(python語言下的機器學習庫)和numpy隨機生成2個類別共40個三維空間點的樣本。
mu_vec1 = np.array([0,0,0])
cov_mat1 = np.array([[1,0,0],[0,1,0],[0,0,1]])
class1_sample = np.random.multivariate_normal(mu_vec1, cov_mat1, 20).T

mu_vec2 = np.array([1,1,1])
cov_mat2 = np.array([[1,0,0],[0,1,0],[0,0,1]])
class2_sample = np.random.multivariate_normal(mu_vec2, cov_mat2, 20).T

  其中,multivariate_normal()生成多元正態樣本分布,參數分別為設定的樣本均值向量,協方差矩陣,每個類別數量為20個。生成的兩個類別class1_sample和class2_sample為三維樣本數據,即樣本數據的特征數量為3個。可視化結果如下:

  2. 下面利用PCA將其投射到二維空間,查看其分布情況。計算40個點在3個維度上的平均向量,首先將兩個類別的數據合並到all_samples中,然后計算平均向量:

all_samples = np.concatenate((class1_sample, class2_sample), axis=1)
mean_x = np.mean(all_samples[0,:])
mean_y = np.mean(all_samples[1,:])
mean_z = np.mean(all_samples[2,:])

  計算平均向量mean_x,mean_y,mean_z,然后基於平均向量計算散布矩陣,方法如下:,其中m為計算的平均向量;所有向量與m的差值經過點積並求和后即可獲得散布矩陣的值:

scatter_matrix = np.zeros((3,3))
for i in range(all_samples.shape[1]):
    scatter_matrix += (all_samples[:,i].reshape(3,1) - mean_vector).dot((all_samples[:,i].reshape(3,1) - mean_vector).T)

  應用numpy庫內置的np.linalg.eig(scatter_matrix)方法計算特征向量和特征值。此外,也可以利用numpy.cov()方法計算協方差矩陣求解:

# 由散布矩陣得到特征向量和特征值
eig_val_sc, eig_vec_sc = np.linalg.eig(scatter_matrix)

# 由協方差矩陣得到特征向量和特征值
eig_val_cov, eig_vec_cov = np.linalg.eig(cov_mat)

  得到3個維度的特征值(eig_vec_sc)和3個維度的特征向量(eig_val_sc)。以平均向量為起點,繪出特征向量,可以看到特征向量的方向,這個方向確定了要進行轉化的新特征空間的坐標系。結果如下:

  3. 按照特征值和特征向量進行配對,並按照特征值的大小從高到低進行排序,由於需要將三維空間投射到二維空間中,選擇前兩個特征值-特征向量作為坐標,並構建2*3的特征向量矩陣W 。原來空間的樣本通過與此矩陣相乘,使用公式:的方法將所有樣本轉換到新的空間中。結果如下:

 

  4.結論:

  這種變換並沒有改變各樣本之間的關系,只是應用了新的坐標系。在本例中是將三維空間降維到二維空間,如果有一個n 維的數據,想要降到k維,則取前k個特征值對應的特征向量即可。

  缺點:當數據量和數據維度非常大的時候,用協方差矩陣的方法解PCA會變得很低效。解決辦法是使用奇異值分解(SVD)。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM