主成分分析

目录:

1.什么是PCA?
2.PCA的作用?
3.PCA步骤?

1.什么是PCA?

PCA(principal components analysis)即主成分分析技术,又称主分量分析。主成分分析也称主分量分析,旨在利用降维的思想,把多指标转化为少数几个综合指标。
在统计学中,主成分分析PCA是一种简化数据集的技术。它是一个线性变换。这个变换把数据变换到一个新的坐标系统中,使得任何数据投影的第一大方差在第一个坐标(称为第一主成分)上,第二大方差在第二个坐标(第二主成分)上,依次类推。主成分分析经常用于减少数据集的维数,同时保持数据集的对方差贡献最大的特征。这是通过保留低阶主成分,忽略高阶主成分做到的。这样低阶成分往往能够保留住数据的最重要方面。但是,这也不是一定的,要视具体应用而定。

2.PCA的作用?

主成分分析(Principle Component Analysis)可以用于分析数据中的主要信息,并利用主要信息对数据进行降维处理,这样可以起到数据压缩的效果。

3.PCA步骤?

步骤1:准备数据

假设我们收集了 n 个学生的信息,每个学生收集了 m 个维度的信息,譬如:身高、体重、平均成绩等。因此所有数据可以表示为如下矩阵形式:
在这里插入图片描述
步骤2:减去均值

基于 n 个学生信息,计算 m 维上各维度的均值,得到均值向量 x ‾ \overline{x} x,对每个学生对应的向量执行减去均值操作,得到如下矩阵:
在这里插入图片描述

步骤3:计算协方差矩阵

在这里插入图片描述

步骤4:计算协方差矩阵的特征值和特征向量

有协方差矩阵 C 计算过程可见其为 m × m 的对称矩阵,结合线性代数知识,可知协方差矩阵可以通过特征分解 (Eigendecomposition) 表示为如下形式:
在这里插入图片描述
其中 V∈R^(m×m) ,为所有特征向量构成的矩阵, Λ∈R^(m×m)为特征值构成的对角阵。由协方差矩阵定义可知,若 xi; xj 两两相互独立,则有:
在这里插入图片描述
此时协方差矩阵即为如下形式:
在这里插入图片描述
此时特征向量即为 R^(m×m) 的基向量,特征值即为相应 xi 的方差。

步骤5:构建特征向量矩阵

选取特征值最大的 k 个特征向量,并构建特征向量 (e) 矩阵
在这里插入图片描述
这里选取的 k 个特征向量为我们希望在数据中保留的主成分。

步骤6:生成压缩后的数据集

该步骤为主成分分析的最后步骤,也是最容易的步骤。一旦我们构建好主成分矩阵 F∈R^(m×k) 后,并右乘原来的数据矩阵 X∈R^(n×m),则得到压缩后的数据 X*,计算如下:

X* = XF

from numpy import *
import matplotlib.pyplot as plt
 
def loadDataSet(fileName):
    dataSetList = []
    fr = open(fileName)
    for row in fr.readlines():
        cur_line = row.strip().split('\t')
        proce_line = list(map(float,cur_line))
        dataSetList.append(proce_line)
    dataSetList = array(dataSetList)
    return dataSetList
 
def pca(dataMat, topNfeat = 999999):
    meanValues = mean(dataMat,axis=0) # 竖着求平均值,数据格式是m×n
    meanRemoved = dataMat - meanValues  # 0均值化  m×n维
    covMat = cov(meanRemoved,rowvar=0)  # 每一列作为一个独立变量求协方差  n×n维
    eigVals, eigVects = linalg.eig(mat(covMat)) # 求特征值和特征向量  eigVects是n×n维
    eigValInd = argsort(-eigVals)  # 特征值由大到小排序,eigValInd十个arrary数组 1×n维
    eigValInd = eigValInd[:topNfeat]  # 选取前topNfeat个特征值的序号  1×r维
    redEigVects = eigVects[:,eigValInd] # 把符合条件的几列特征筛选出来组成P  n×r维
    lowDDataMat = meanRemoved * redEigVects  # 矩阵点乘筛选的特征向量矩阵  m×r维 公式Y=X*P
    reconMat = (lowDDataMat * redEigVects.T) + meanValues  # 转换新空间的数据  m×n维
    return lowDDataMat, reconMat
 
def drawPoints(dataset1,dataset2):  # 画图,dataset1是没降维的数据,dataset2是数据映射到新空间的数据
    fig = plt.figure()
    ax1 = fig.add_subplot(211)
    ax2 = fig.add_subplot(212)
    ax1.scatter(dataset1[:,0],dataset1[:,1],marker='s',s=40,color='red')
    dataset2 = array(dataset2)
    ax2.scatter(dataset2[:,0],dataset2[:,1],s=40,color='blue')
 
    plt.show()
 
if __name__ == '__main__':
    data = loadDataSet('data_path')
    proccess_data, reconMat = pca(data,1)
    drawPoints(data,reconMat)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值