1.概念
主成分析( Principal Component Analysis ,PCA )是最常用的 一种降维方法,通常用于高数据集的探索与可视化还以作据压缩和预处理等。 PCA 可以把具有相关性的高维变量合成为 线性无关的低维变量,称主成分。能够尽可保留原始数据的信息
2原理
矩阵的主成分就是其协方差矩阵对应的特征向量,按照的特征值大小进行排序,最就是第一主成分其次二成分,以此类推。---具体计算细节参考矩阵论等书籍
3算 法流程
数据集及代码展示
###PCA based iris
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
from sklearn.datasets import load_iris
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
data=load_iris()##通过导入iris数据,得到一个字典,data.data获取其中的特征数据,data.target获取对应特征数据的
#鸢尾花类型
X=data.data
y=data.target
print(X.shape)#(150, 4)##注:这里X,y都是numpy类型的数组,so xx.shape可用
pca=PCA(n_components=3)#将原4维数据降维成2维
reduced_X=pca.fit_transform(X)
print(reduced_X.shape)#(150, 2)
####降维至2维时实现代码
'''red_x,red_y=[],[]
blue_x,blue_y=[],[]
green_x,green_y=[],[]
##这里因为知道鸢尾花数据分为三个类型:0,1,2所以直接判断
##如若未知 就需要通过先得到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()
'''
###降维至3维时实现代码
red_x,red_y,red_z=[],[],[]
blue_x,blue_y,blue_z=[],[],[]
green_x,green_y,green_z=[],[],[]
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])
red_z.append(reduced_X[i][2])
elif y[i]==1:
blue_x.append(reduced_X[i][0])
blue_y.append(reduced_X[i][1])
blue_z.append(reduced_X[i][2])
else:
green_x.append(reduced_X[i][0])
green_y.append(reduced_X[i][1])
green_z.append(reduced_X[i][2])
fig = plt.figure()
ax = Axes3D(fig)
ax.scatter(red_x, red_y, red_z,c='r')
ax.scatter(blue_x, blue_y, blue_z,c='b')
ax.scatter(green_x, green_y, green_z,c='g')
ax.set_zlabel('Z', fontdict={'size': 15, 'color': 'red'})
ax.set_ylabel('Y', fontdict={'size': 15, 'color': 'red'})
ax.set_xlabel('X', fontdict={'size': 15, 'color': 'red'})
plt.show()
效果图
1)降至三维
2)降至二维
通过降维并未导致数据信息大量丢失,且对于分类任务并无影响,该数据集仍可被分为3类。
NMF(非负矩阵分解)
非负矩阵分解( Non-negative Matrix Factorization ,NMF ) 是在矩阵中所有元素均为非负数约束条件之下的分解方法。
基本思想:给定一个非负矩阵 V,NMF 能够找到一个非负矩阵 W和一个 非负矩阵 H,使得矩阵 W和H的乘积近似等于矩阵 V中的值。
矩阵分解优化 目标:最小W矩阵 H矩阵的乘积和原始之间差 别,目标函数如下:
代码如下
from numpy.random import RandomState
import matplotlib.pyplot as plt
from sklearn.datasets import fetch_olivetti_faces
from sklearn import decomposition
n_row, n_col = 2, 3#设置图像展示时的排列情况
n_components = n_row * n_col#设置提取的特征数目
image_shape = (64, 64)#设置人脸数据的大小
###############################################################################
# Load faces data
dataset = fetch_olivetti_faces(shuffle=True, random_state=RandomState(0))
faces = dataset.data##400*4096
#print(type(dataset.data)) ndarray类型
###############################################################################
#设置图像展示方式
def plot_gallery(title, images, n_col=n_col, n_row=n_row):
plt.figure(figsize=(2*n_col,2.26*n_row)) #figure函数创建并制定图像大小
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.imshow(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.94, 0.04, 0.)#调整子图位置及间隔
##首先展示数据库中的前6各人脸数据原始灰度图
plot_gallery("First centered Olivetti faces", faces[:n_components])
###############################################################################
#创建特征提取的对象NMF,使用PCA作为对比,将结果存放到estimators列表中
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:
print("Extracting the top %d %s..." % (n_components, name))
estimator.fit(faces)#执行对应特征提取方法
components_ = estimator.components_
print(type(components_))
print(components_.shape)#6#4096
plot_gallery(name, components_[:n_components])#展示通过不同提取方法下的人脸图像
plt.show()
执行结果
--------------------------------------------------------------------------------------------------------------------参考mooc网课,北理工python机器学习应用课程