主成分分析 PCA

主成分分析的概念

主成分分析(PCA)是一种常用的数据降维方法,可以将高维数据转换为低维空间,同时保留原始数据中最具代表性的信息。在数学建模中,PCA可以应用于多个领域,例如金融、医学、自然语言处理等。

维度约减的概念

特征约减的目的是将高维特征向量映射到低维子空间中
给定 n 个样本(每个样本维度为 p 维){X1,X2,X3...Xn}
通过特征变换 / 投影矩阵实现特征空间的压缩:

为什么要进行维度约减

大多数机器学习算法在高维空间中表现不够鲁棒
查询速度与精度随着维度增加而降低.
有价值的维度往往很少
例如,在基因序列中对于特定疾病有价值的点位十分
有限
可视化 : 高位数据在 2D 3D 空间中的可视化
维度约减 : 高效的存储与检索
噪声消除 : 提升分类或识别精度

PCA(Principal Component Analysis)

主成分分析 (PCA) 基本思路
通过协方差分析,建立 高维空间到低维空间的线性映射 / 矩阵
保留尽可能多的样本信息
压缩后的数据对分类、聚类尽量不产生影响,甚至有所提升
将原始高维向量通过投影矩阵,投射到低维空间
这些向量称为 主成分 (PCs), 具有无关性、正交的特点。重要
的是这些向量的数量要远小于高维空间的维度。

PCA算法流程

pytho实现

手写体识别数字降维

引入sklearn中的手写数字识别

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) ,max_iter=500)
mlp.fit(x_train,y_train)
# 数据中心化
def zeroMean(dataMat):
    # 按列求平均,即各个特征的平均
    meanVal = np.mean(dataMat, axis=0) 
    newData = dataMat - meanVal
    return newData, meanVal

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)
    # 最大的n个特征值的下标
    n_eigValIndice = eigValIndice[-1:-(top+1):-1]
    # 最大的n个特征值对应的特征向量
    n_eigVect = eigVects[:,n_eigValIndice]
    # 低维特征空间的数据
    lowDDataMat = newData*n_eigVect
    # 利用低纬度数据来重构数据
    reconMat = (lowDDataMat*n_eigVect.T) + meanVal
    # 返回低维特征空间的数据和重构的矩阵
    return lowDDataMat,reconMat 
lowDDataMat,reconMat = pca(x_data,2)
# 重构的数据
x = np.array(lowDDataMat)[:,0]
y = np.array(lowDDataMat)[:,1]
plt.scatter(x,y,c='r')
plt.show()
predictions = mlp.predict(x_data)
# 重构的数据
x = np.array(lowDDataMat)[:,0]
y = np.array(lowDDataMat)[:,1]
plt.scatter(x,y,c=y_data)
plt.show()
lowDDataMat,reconMat = pca(x_data,3)
from mpl_toolkits.mplot3d import Axes3D  
x = np.array(lowDDataMat)[:,0]
y = np.array(lowDDataMat)[:,1]
z = np.array(lowDDataMat)[:,2]
ax = plt.figure().add_subplot(111, projection = '3d') 
ax.scatter(x, y, z, c = y_data, s = 10) #点为红色三角形 
plt.show()

小结(PCA的优缺点)

主要优点:

  1. 降低数据维度:PCA可以将高维数据转化为低维数据,从而减少特征数量,降低计算复杂度。
  2. 去除冗余信息:PCA通过找到数据中的主要成分,可以去除冗余信息,保留最重要的特征,提高模型的泛化能力。
  3. 数据可视化:PCA可以将高维数据映射到二维或三维空间,方便人们对数据进行可视化分析和理解。

主要缺点:

  1. 数据变换:PCA是一种数据变换方法,它将原始数据转化为新的特征空间。在转换过程中,原始数据的含义可能会发生改变,不易解释转换后的特征。
  2. 数据相关性:PCA假设数据是线性相关的,但如果数据呈现非线性关系,则PCA的效果可能不佳。
  3. 敏感性:PCA对异常值非常敏感,异常值可能会对主成分的计算产生较大影响,导致结果不准确。
  4. 计算复杂度:PCA需要计算协方差矩阵的特征值和特征向量,计算复杂度较高,特别是在处理大规模数据时,计算时间会很长。
  • 21
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值