我是靠谱客的博主 整齐白猫,这篇文章主要介绍机器学习实战(五)—降维(PCA与NMF),现在分享给大家,希望可以做个参考。

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
39
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)是在矩阵中所有元素均为非负数的约束条件之下的矩阵分解方法。

基本思想
给定一个非负矩阵 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} Vnm=WnkHkm
在这里插入图片描述
在这里插入图片描述
矩阵分解优化目标:最小化 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(XijWHij)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
43
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分别提取的特征输出
在这里插入图片描述

最后

以上就是整齐白猫最近收集整理的关于机器学习实战(五)—降维(PCA与NMF)的全部内容,更多相关机器学习实战(五)—降维(PCA与NMF)内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(63)

评论列表共有 0 条评论

立即
投稿
返回
顶部