我是靠谱客的博主 整齐白猫,最近开发中收集的这篇文章主要介绍机器学习实战(五)—降维(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)是在矩阵中所有元素均为非负数的约束条件之下的矩阵分解方法。

基本思想
给定一个非负矩阵 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

我们以一个人脸的数据为例
原始图像是
在这里插入图片描述
代码

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)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部