PCA特征降维 实验报告

PCA特征降维 实验报告

  • 1. 任务定义
  • 2. 实验环境
  • 3. 方法描述
    • 3.1 自主实现PCA算法
      • 3.1.1 数据中心化
      • 3.1.2 求协方差矩阵
      • 3.1.3 求特征向量和特征值
      • 3.1.4 数据降维
    • 3.2 调用sklearn库实现PCA算法
    • 3.3 绘制二维特征图像
    • 3.4 使用KNN对二维特征分类效果评估
  • 4. 结果分析

1. 任务定义

  使用 PCA 或 kernel PCA 对mnist数据进行降维。观察前两个特征向量所对应的图像,即将数据嵌入到 R2 空间。绘制降维后的数据,并分析二维特征是否能够足以完成对输入的分类,对结果进行分析和评价。

2. 实验环境

  • Windows 10
  • VS Code
  • python 3.7.8

3. 方法描述

  • 数据来源于sklearn.datasets中的mnist_784,shape为(70000 * 784)

3.1 自主实现PCA算法

  • PCA类初始化

data:待降维数据
n_components:降至多少维

def __init__(self, data, n_components=999999):
    self.x = data
    self.n_components = n_components
    # 数据中心化
    self.centrlize()

3.1.1 数据中心化

  • 对数据中的每个元素减去均值
def centrlize(self):
    mean = np.mean(self.x, axis=0)
    self.x = self.x - mean

3.1.2 求协方差矩阵

  • 调用numpy.cov求x的协方差矩阵
def cov(self):                     
    x_cov = np.cov(self.x.T)                                  
    return x_cov

3.1.3 求特征向量和特征值

  • 调用numpy.linalg.eig计算矩阵的特征值和特征向量
  • 由于numpy.argsort是获得从小到大排序的下标,所以从后取出需要维度返回特征向量
def get_feature(self):
    x_cov = self.cov()
    value, vector = np.linalg.eig(x_cov)
    valueInd  = np.argsort(value)
    valueInd  = valueInd[:-(self.n_components + 1):-1]
    redVector = vector[:,valueInd]

    return redVector

3.1.4 数据降维

  • 将中心化后的数据与特征向量做矩阵乘法进行降维
def reduce_dimension(self):
    redVector = self.get_feature()
    reData = np.dot(self.x, redVector)
    
    return reData

3.2 调用sklearn库实现PCA算法

  • 直接使用from sklearn import decomposition调用PCA
def PCA(data):
    pca = decomposition.PCA()
    reData = pca.fit_transform(data)
    
    return reData

3.3 绘制二维特征图像

  • 取出其中1000个数据,将第一维数据做x轴坐标,第二维数据做y轴坐标,绘制二维特征图像如下

myPCA

PCA特征降维 实验报告_第1张图片

skPCA

PCA特征降维 实验报告_第2张图片

3.4 使用KNN对二维特征分类效果评估

  • 将降维结果按照8:2划分成训练集和测试集
  • 通过from sklearn.neighbors import KNeighborsClassifier调用KNN分类器对二维特征分类效果进行评估
def evaluate(x_train, y_train, x_test, y_test):
    knn_clf = KNeighborsClassifier()
    knn_clf.fit(x_train, y_train)
    print("Score:")
    print(knn_clf.score(x_test, y_test))
    
    return

myPCA

PCA特征降维 实验报告_第3张图片

skPCA

PCA特征降维 实验报告_第4张图片

4. 结果分析

  • 通过二维特征图像不难看出,通过二维特征仅能较好地区分0和1,对于其它数字的识别并不理想。KNN分类评估也证实了这一想法,无论是自主实现的PCA还是直接调用sklearn库中的PCA,分类准确率仅有64%左右。
  • 为了更好地展示PCA算法的作用,于是继续对降到不同维度的数据进行分类评估得到以下结果:
Components 5 10 15 20
Score 0.8235 0.9533 0.9751 0.9814
  • 不难看出,当数据降维至10维时,仍有着不错的分类效果,说明10维已经能够充分地描述原数据,相比于最开始的784维,极大地减小了计算复杂度,对于计算速度有着显著提升。

你可能感兴趣的:(PCA特征降维 实验报告)