基于python3.7 numpy scipy matplotlib sklearn的机器学习笔记3_PCA降维及非负矩阵分解NMF方法实现

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jingtaoqian8521/article/details/87694013

 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机器学习应用课程

猜你喜欢

转载自blog.csdn.net/jingtaoqian8521/article/details/87694013