1.0?高維數(shù)據(jù)向低維數(shù)據(jù)映射
? ? ? ? 僅僅提取一個數(shù)據(jù)集的n個主成分并沒有對數(shù)據(jù)維度造成改變。但利用提取出的主成分能夠選出使樣本方差最大的(小于n個數(shù)的)維度,以此實現(xiàn)對數(shù)據(jù)降維的操作,將高維數(shù)據(jù)映射為低維數(shù)據(jù)。
? ? ? ? 對于維度選擇主要通過原數(shù)據(jù)集與主成分向量組成的矩陣進(jìn)行乘機(jī)即可獲得。例如,假設(shè)有以下兩個矩陣,是包含m個n為特征的數(shù)據(jù)樣本,
是從
中提取的前
個主成分,
也是包含n個特征。

? ? ? ? 將從n維降到k維,只需要將
和
相乘即可:
。該乘法的本質(zhì)就是將
的每一行數(shù)據(jù)
映射到
構(gòu)成的k維空間中,進(jìn)而得到一組包含k個特征的向量,即完成了從n維到k維的映射。
? ??????降維的過程中可能會丟失信息。如果原先的數(shù)據(jù)中本身存在一些無用信息,降維也可能會有降噪效果。
2.0 sklearn中的PCA分析
? ? ? ? 首先準(zhǔn)備數(shù)據(jù)集:
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
digits = datasets.load_digits()
X = digits.data? ? ? ? # (1797, 64),64個特征
y = digits.target
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=666)
? ? ? ? 使用KNN算法進(jìn)行數(shù)據(jù)模擬,并查看分類效果:
knn_clf = KNeighborsClassifier()
knn_clf.fit(X_train, y_train)
knn_clf.score(X_test, y_test)? ? ? # 輸出:0.9866666666666667
? ? ? ? 使用PCA進(jìn)行降維,再使用KNN對降維后的數(shù)據(jù)進(jìn)行擬合:
from sklearn.decomposition import PCA
pca = PCA(n_components=3)? ? ? ? # 將數(shù)據(jù)集的特征數(shù)量降到3維
pca.fit(X_train)
X_train_reduction = pca.transform(X_train)
X_test_reduction = pca.transform(X_test)
knn_clf2 = KNeighborsClassifier()
knn_clf.fit(X_train_reduction, y_train)
knn_clf.score(X_test_reduction, y_test)????????# 輸出:0.7644444444444445
????????可以看到,數(shù)據(jù)經(jīng)過降維由64個特征降到3個特征之后,使用相同模型再進(jìn)行預(yù)測的精度也相應(yīng)的降低了。說明在數(shù)據(jù)降維過程中損失了一部分有用的信息。
3.0 解釋方差
? ? ? ? 為了應(yīng)對數(shù)據(jù)降維過程中的損失,PCA算法提供了一個特殊的指標(biāo)pca.explained_variance_ratio_(解釋方差比例),通過對方差水平的解釋程度,反映降維后的數(shù)據(jù)集所保持的原數(shù)據(jù)集信息量的水平。仍以上面的digits為例:
print(pca.explained_variance_ratio_)
array([0.14566817, 0.13735469, 0.11777729])
? ? ? ? 上面的打印結(jié)果就是主成分所解釋的方差比例。
????????對于現(xiàn)在的示例來說,0.14566817表示第一個主成分能夠解釋原數(shù)據(jù)14.56%的方差;0.13735469表示第二個主成分能夠解釋13.73%的方差,0.11777729第三個主成分能夠解釋11.78%的方差。三者之和約為40%,說明PCA降維后的數(shù)據(jù)涵蓋了原數(shù)據(jù)總方差的約40%,剩余的60%都在降維過程中丟失掉了。
? ? ? ? 再使用該示例,對于原來的64個特征的數(shù)據(jù)集提取64個主成分,結(jié)果能夠解釋100%的原數(shù)據(jù)方差。
pca = PCA(n_components=64)
pca.fit(X_train)
pca.explained_variance_ratio_? ? ? ??

? ? ? ? 上面的矩陣即為64個主成分對于原數(shù)據(jù)方差解釋程度的結(jié)果,將其求和得1.0000000000000002,說明解釋了100%的原數(shù)據(jù)方差。此外還能注意到,隨著主成分?jǐn)?shù)量的增加,新增主成分對于原數(shù)據(jù)方差解釋的比例在不斷降低,后幾個主成分甚至可忽略不計。因此,實際應(yīng)用中可以通過累加占比的方式找出合適的主成分?jǐn)?shù)量,使對原數(shù)據(jù)的方差解釋長度達(dá)到確定的水平,進(jìn)而達(dá)到滿意的降維效果。
????????繪制方差解釋度的帕累托圖:
plt.plot([i for i in range(X_train.shape[1])],
? ? ? ? [np.sum(pca.explained_variance_ratio_[:i+1]) for i in range(X_train.shape[1])])
plt.show()

? ? ? ? sklearn中,可以指定方差解釋的程度,使程序自動選擇生成的主成分?jǐn)?shù)量。
pca = PCA(0.80)
pca.fit(X_train)
pca.n_components_? ? ? ? # 輸出:13
X_train_reduction2 = pca.transform(X_train)? ? ? # 用降維后的數(shù)據(jù)建模
X_test_reduction2 = pca.transform(X_test)
knn_clf3 = KNeighborsClassifier()
knn_clf3.fit(X_train_reduction2, y_train)
knn_clf3.score(X_test_reduction2, y_test)? ? ? # 輸出:0.9666666666666667
? ? ? ? 使用這種達(dá)到較高精度的降維數(shù)據(jù)去進(jìn)行模型訓(xùn)練,就能得到較好的結(jié)果。
4.0 PCA逆操作與降噪
? ? ? ? 實際數(shù)據(jù)中不可避免地出現(xiàn)各種噪音,這些噪音的出現(xiàn)可能會對數(shù)據(jù)的準(zhǔn)確性造成一定的影響。而主成分分析法還有一個用途就是降噪。
????????PCA通過選取主成分將原有數(shù)據(jù)映射到低維數(shù)據(jù)再映射回高維數(shù)據(jù)的方式進(jìn)行一定程度的降噪。構(gòu)造一組數(shù)據(jù)作為示例:
import numpy as np
import matplotlib.pyplot as plt
X = np.empty((100, 2))
np.random.seed(666)
X[:,0] = np.random.uniform(0., 100., size=100)
X[:,1] = 0.75 * X[:,0] + 3. + np.random.normal(0, 5, size=100)
plt.scatter(X[:,0], X[:,1])
plt.show()

? ? ? ? 使用PCA降維后數(shù)據(jù)進(jìn)行inverse_transform,看數(shù)據(jù)集的變化:
from sklearn.decomposition import PCA
pca = PCA(n_components=1)
pca.fit(X)
X_reduction = pca.transform(X)
X_restore = pca.inverse_transform(X_reduction)
plt.scatter(X_restore[:,0], X_restore[:,1])
plt.show()

? ? ? ? 比較上面兩個圖,可以明顯看出還原后的數(shù)據(jù)不等同于原數(shù)據(jù)!這是因為在使用PCA降維時已經(jīng)丟失了部分的信息。因此在還原時都是基于保留信息進(jìn)行還原的,只能保證維度相同,但恢復(fù)的數(shù)據(jù)與原數(shù)據(jù)必然無法相同。
? ? ? ? 但這樣一來一回的操作,丟失掉部分信息就相當(dāng)于降噪了。
????????據(jù)降維還有一個作用是可視化,如將特征數(shù)量降到二維后就可以在平面坐標(biāo)系中繪圖顯示(類似于統(tǒng)計中的對應(yīng)分析)。