一、 高維數據降維
高維數據降維是指采取某種映射方法,降低隨機變量的數量。例如將數據點從高維空間映射到低維空間中,從而實現維度減少。降維分為特征選擇和特征提取兩類,前者是從含有冗余信息以及噪聲信息的數據中找出主要變量,后者是去掉原來數據,生成新的變量,可以尋找數據內部的本質結構特征。
簡要來說,就是通過對輸入的原始數據的特征學習,得到一個映射函數,實現將輸入樣本映射后到低維空間中,其原始數據的特征並沒有明顯損失。通常新空間的維度要小於原空間的維度。目前大部分降維算法是處理向量形式的數據。
二、 主成分分析過程
主成分分析(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為樣本的數量。
三、 案例演示
- 基於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)。