PCA算法
主成分分析算法(PCA)是最常用的线性降维方法,它的目标是通过某种线性投影,将高维的数据映射到低维的空间中,并期望在所投影的维度上数据的信息量最大(方差最大),以此使用较少的数据维度,同时保留住较多的原数据点的特性。
主成分分析中的术语
方差:用来度量一组数据的分散程度
协方差:用于度量两个变量之间的线性相关性程度
特征向量:描述数据集结构的非零向量
矩阵的主成分就是其协方差矩阵对应的特征向量,并且按照对应的特征值大小进行排序,最大的特征值就是第一主成分,其次是第二主成分
PCA算法的过程
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39import 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)是在矩阵中所有元素均为非负数的约束条件之下的矩阵分解方法。
基本思想
给定一个非负矩阵
V
V
V,NMF 能够找到一个非负矩阵
W
W
W 和一个非负矩阵
H
H
H ,使得该两矩阵的乘积近似等于矩阵
V
V
V 中的值。
V
n
∗
m
=
W
n
∗
k
∗
H
k
∗
m
V_{n*m}=W_{n*k}*H_{k*m}
Vn∗m=Wn∗k∗Hk∗m
矩阵分解优化目标:最小化
W
W
W 矩阵
H
H
H 矩阵的乘积和原始矩阵之间的差别
a r g m i n 1 2 ∑ ( X i j − W H i j ) 2 argminfrac{1}{2}sum(X_{ij}-WH_{ij})^2 argmin21∑(Xij−WHij)2
我们以一个人脸的数据为例
原始图像是
代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43import 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分别提取的特征输出
最后
以上就是整齐白猫最近收集整理的关于机器学习实战(五)—降维(PCA与NMF)的全部内容,更多相关机器学习实战(五)—降维(PCA与NMF)内容请搜索靠谱客的其他文章。
发表评论 取消回复