數據表達 : 有時,我們通過對數據集原來的特征進行轉換,生成新的"特征"或者說成分,會比直接使用原始的特征效果要好,即數據表達(data representation)
特征提取 : 如圖像識別,數據表達顯得十分重要,因為圖像是有成千上萬個像素組成的,每個像素又有不同的的RGB色彩值,所以我們要使用特征提取這種數據處理方法,特征提取是指使用計算機提取圖像中屬於特征性的信息的方法及過程。
1.使用PCA主成分分析法用於特征提取
############################# PCA主成分分析法用於特征提取 ####################################### #導入畫圖工具 import matplotlib.pyplot as plt #導入數據集拆分工具 from sklearn.model_selection import train_test_split #導入數據集獲取工具 from sklearn.datasets import fetch_lfw_people #載入人臉數據集 faces = fetch_lfw_people(min_faces_per_person=20,resize=0.8) image_shape = faces.images[0].shape #將照片打印出來 fig,axes = plt.subplots(3,4,figsize=(12,9),subplot_kw={'xticks':(),'yticks':()}) for target,image,ax in zip(faces.target,faces.images,axes.ravel()): ax.imshow(image,cmap=plt.cm.gray) ax.set_title(faces.target_names[target]) #顯示圖像 plt.show()
#導入神經網絡 from sklearn.neural_network import MLPClassifier #對數據進行拆分 X_train,X_test,y_train,y_test = train_test_split(faces.data/255,faces.target,random_state=62) #訓練神經網絡 mlp=MLPClassifier(hidden_layer_sizes=[100,100],random_state=62,max_iter=400) mlp.fit(X_train,y_train) #打印模型准確率 print('模型識別准確率:{: .2f}'.format(mlp.score(X_test,y_test)))
模型識別准確率: 0.88
#導入PCA from sklearn.decomposition import PCA #使用白化功能處理人臉數據 pca = PCA(whiten=True,n_components=0.9,random_state=62).fit(X_train) X_train_whiten = pca.transform(X_train) X_test_whiten = pca.transform(X_test) #打印白化后數據形態 print('白化后數據形態:{}'.format(X_train_whiten.shape))
白化后數據形態:(50, 21)
#使用白化后的數據訓練神經網絡 mlp.fit(X_train_whiten,y_train) #打印模型准確率 print('數據白化后模型識別准確率:{: .2f}'.format(mlp.score(X_test_whiten,y_test)))
數據白化后模型識別准確率: 0.94
2.使用非負矩陣分解用於特征提取
非負矩陣分解(Non-Negative Matrix Factorization,NMF) : 矩陣分解,就是把一個矩陣拆解為n個矩陣的乘積,而非負矩陣分解,就是原始的矩陣中所有的數值必須大於或等於0,當然分解之后的矩陣中數據也是大於或等於0的.
############################# 非負矩陣分解用於特征提取 ####################################### #導入NMF from sklearn.decomposition import NMF #使用NMF處理數據 nmf = NMF(n_components=15,random_state=62).fit(X_train) X_train_nmf = nmf.transform(X_train) X_test_nmf = nmf.transform(X_test) #打印NMF處理后的數據形態 print('NMF處理后數據形態:{}'.format(X_train_nmf.shape))
NMF處理后數據形態:(50, 15)
#用NMF處理后的數據訓練神經網絡 mlp.fit(X_train_nmf,y_train) #打印模型准確率 print('nmf處理后模型准確率:{:.2f}'.format(mlp.score(X_test_nmf,y_test)))
nmf處理后模型准確率:0.94
總結 :
NMF非負矩陣分解與PCA主成分分析法不同的是,如果我們降低NMF的成分數量,它會重新生成新的成分,而新的成分和原來的成分是完全不一樣的,
另外,NMF中的成分是沒有順序的,這點和PCA有是不同的.
NMF關於n_components參數不支持使用浮點數,只能設置為正的整數型,這也是與PCA的不同之處.
文章引自 : 《深入淺出python機器學習》