主成分分析(PCA)

概念

在减少需要分析的指标同时,尽量减少原指标包含信息的损失,以达到对所收集数据进行全面分析的目的。由于各变量间存在一定的相关关系,因此有可能用较少的综合指标分别综合存在于各变量中的各类信息。主成分分析就属于这类降维的方法。
对于如下三维数据降维为二维有:
在这里插入图片描述
在这里插入图片描述

PCA算法流程

在这里插入图片描述

1 数据中心化

数据中心化就是将坐标原点放在数据中心。
在这里插入图片描述
在这里插入图片描述

2.样本的协方差矩阵

找坐标系方向,找到方差最大的方向。
假设我们手上有如下数据 D ′ D' D,我们可以推断它由白数据 D D D的由来过程:
在这里插入图片描述
我们要求的旋转方向,即为 R R R矩阵对应的旋转方向。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.对协方差矩阵做特征值分解

在这里插入图片描述
至此,我们得出手上数据的协方差矩阵的特征向量就是 R R R中的每一个向量, L L L对角线上的值为手上数据的特征值。对应的特征向量即新坐标。
在这里插入图片描述

PCA降维手写数字分类

from sklearn.neural_network import MLPClassifier
from sklearn.datasets import load_digits
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report,confusion_matrix
import numpy as np
import matplotlib.pyplot as plt

digits = load_digits()#载入数据
x_data = digits.data #数据
y_data = digits.target #标签

x_train,x_test,y_train,y_test = train_test_split(x_data,y_data) #分割数据1/4为测试数据,3/4为训练数据

mlp = MLPClassifier(hidden_layer_sizes=(100,50)) # 一个分类器,表示有两个隐藏层,分别有100个和50个神经元
mlp.fit(x_train,y_train)

# 数据中心化
def zeroMean(dataMat):
    # 按列求平均,即各个特征的平均
    meanVal = np.mean(dataMat, axis=0) #新坐标原点
    newData = dataMat - meanVal # 新坐标下原来数据的新坐标
    return newData, meanVal

# pca将高维数据dataMat降维到top维
def pca(dataMat,top):
    # 数据中心化
    newData,meanVal=zeroMean(dataMat) 
    # np.cov用于求协方差矩阵,参数rowvar=0说明数据一行代表一个样本
    covMat = np.cov(newData, rowvar=0)
    # np.linalg.eig求矩阵的特征值和特征向量
    eigVals, eigVects = np.linalg.eig(np.mat(covMat))
    # 对特征值从小到大排序
    eigValIndice = np.argsort(eigVals)
    # 最大的top个特征值的下标
    n_eigValIndice = eigValIndice[-1:-(top+1):-1]
    # 最大的top个特征值对应的特征向量
    n_eigVect = eigVects[:,n_eigValIndice]
    # 低维特征空间的数据,(内积,将数据投影到新的坐标系上,特征向量即为新坐标系的坐标轴),这是在新坐标的视觉下看到的数据
    lowDDataMat = newData*n_eigVect
    # 利用低纬度数据来重构数据(在最开始的坐标系下看到的被降维的数据)
    reconMat = (lowDDataMat*n_eigVect.T) + meanVal
    # 返回低维特征空间的数据和重构的矩阵
    return lowDDataMat,reconMat

predictions = mlp.predict(x_data)

# 降为二维
lowDDataMat2,reconMat2 = pca(x_data,2)
# 低维坐标下的数据分布
x = np.array(lowDDataMat2)[:,0]
y = np.array(lowDDataMat2)[:,1]
plt.scatter(x,y,c=y_data)
plt.show()

#降为3维
lowDDataMat3,reconMat3 = pca(x_data,3)
from mpl_toolkits.mplot3d import Axes3D  
x = np.array(lowDDataMat3)[:,0]
y = np.array(lowDDataMat3)[:,1]
z = np.array(lowDDataMat3)[:,2]
ax = plt.figure().add_subplot(111, projection = '3d') 
ax.scatter(x, y, z, c = y_data, s = 10) 
plt.show()

结果:
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值