機器學習實戰(五)—降維(PCA與NMF)

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)是在矩陣中所有元素均爲非負數的約束條件之下的矩陣分解方法。

基本思想
給定一個非負矩陣 VV,NMF 能夠找到一個非負矩陣 WW 和一個非負矩陣 HH ,使得該兩矩陣的乘積近似等於矩陣 VV 中的值。

Vnm=WnkHkmV_{n*m}=W_{n*k}*H_{k*m}
在這裏插入圖片描述
在這裏插入圖片描述
矩陣分解優化目標:最小化 WW 矩陣 HH 矩陣的乘積和原始矩陣之間的差別

argmin12(XijWHij)2argmin\frac{1}{2}\sum(X_{ij}-WH_{ij})^2

我們以一個人臉的數據爲例
原始圖像是
在這裏插入圖片描述
代碼

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分別提取的特徵輸出
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章