PCA算法
主成分分析算法(PCA)是最常用的線性降維方法,它的目標是通過某種線性投影,將高維的數據映射到低維的空間中,並期望在所投影的維度上數據的信息量最大(方差最大),以此使用較少的數據維度,同時保留住較多的原數據點的特性。
主成分分析中的術語
方差:用來度量一組數據的分散程度
協方差:用於度量兩個變量之間的線性相關性程度
特徵向量:描述數據集結構的非零向量
矩陣的主成分就是其協方差矩陣對應的特徵向量,並且按照對應的特徵值大小進行排序,最大的特徵值就是第一主成分,其次是第二主成分
PCA算法的過程
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
from sklearn.datasets import load_iris
data = load_iris()
#字典形式加載數據集
y = data.target
X = data.data
#y代表標籤,X代表數據
pca = PCA(n_components = 2)
#加載PCA算法,設置降維後主成分數目爲2
reduced_X = pca.fit_transform(X)
#降維後的數據保存到reduced_X中
red_x,red_y = [],[]
blue_x,blue_y = [],[]
green_x,green_y = [],[]
#按類別對降維後的數據進行保存
for i in range(len(reduced_X)):
if y[i] == 0:
red_x.append(reduced_X[i][0])
red_y.append(reduced_X[i][1])
elif y[i] == 1:
blue_x.append(reduced_X[i][0])
blue_y.append(reduced_X[i][1])
else:
green_x.append(reduced_X[i][0])
green_y.append(reduced_X[i][1])
#按照鳶尾花的類別將降維後的數據點保存到不同的列表中
plt.scatter(red_x,red_y,c='r',marker='x')
#第一類數據點
plt.scatter(blue_x,blue_y,c='b',marker='D')
#第一類數據點
plt.scatter(green_x,green_y,c='g',marker='.')
#第一類數據點
plt.show()
輸出如下:
可以從輸出的結果中看出,降維後的數據仍然能夠清晰地分成三類。這樣不僅降低分類任務的工作量,還能保證分類的質量。
NMF算法
非負矩陣分解(NMF)是在矩陣中所有元素均爲非負數的約束條件之下的矩陣分解方法。
基本思想
給定一個非負矩陣 ,NMF 能夠找到一個非負矩陣 和一個非負矩陣 ,使得該兩矩陣的乘積近似等於矩陣 中的值。
矩陣分解優化目標:最小化 矩陣 矩陣的乘積和原始矩陣之間的差別
我們以一個人臉的數據爲例
原始圖像是
代碼
import matplotlib.pyplot as plt
from sklearn import decomposition
from sklearn.datasets import fetch_olivetti_faces
from numpy.random import RandomState
n_row,n_col = 2,3
#設置圖像展示排列
n_components = n_row*n_col
#設置提取特徵數
image_shape = (64,64)
#設置人臉數據圖片的大小
dataset = fetch_olivetti_faces(shuffle=True,random_state=RandomState(0))
faces = dataset.data
def plot_gallery(title,images,n_col=n_col,n_row=n_row):
plt.figure(figsize=(2.*n_col,2.26*n_row))
plt.suptitle(title,size=16)
#創建圖片及標題
for i,comp in enumerate(images):
plt.subplot(n_row,n_col,i+1)
#繪製子圖
vmax = max(comp.max(),-comp.min())
plt.show(comp.reshape(image_shape),cmap=plt.cm.gray,interpolation='nearest',vmin=-vmax,vmax=vmax)
#數值歸一化,並以灰度圖顯示
plt.xticks(())
plt.yticks(())
#去除子圖座標軸
plt.subplots_adjust(0.01,0.05,0.99,0.93,0.04,0.)
estimators = [('Eigenfaces - PCA using randomized SVD',decomposition.PCA(n_components=6,whiten=True)),
('Non-negative components -NMF',decomposition.NMF(n_components=6,init='nndsvda',tol=5e-3))]
#創建特徵提取
for name,estimator in estimators:
estimator.fit(faces)
#利用PCA或NMF提取特徵
components_ = estimator.components_
#獲取提取的特徵
plot_gallery(name,components_[:n_components])
#特徵進行排列
plt.show()
PCA與NMF分別提取的特徵輸出