概述
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}
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
我们以一个人脸的数据为例
原始图像是
代码
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)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复