PCA降维python实现

#coding=utf-8
from numpy import *

'''通过方差的百分比来计算将数据降到多少维是比较合适的,
函数传入的参数是特征值和百分比percentage,返回需要降到的维度数num'''
def eigValPct(eigVals,percentage):
    sortArray=sort(eigVals) #使用numpy中的sort()对特征值按照从小到大排序
    sortArray=sortArray[-1::-1] #特征值从大到小排序
    arraySum=sum(sortArray) #数据全部的方差arraySum
    tempSum=0
    num=0
    for i in sortArray:
        tempSum+=i
        num+=1
        if tempSum>=arraySum*percentage:
            return num

'''pca函数有两个参数,其中dataMat是已经转换成矩阵matrix形式的数据集,列表示特征;
其中的percentage表示取前多少个特征需要达到的方差占比,默认为0.9'''
def pca(dataMat,percentage=0.9):
    meanVals=mean(dataMat,axis=0)  #对每一列求平均值,因为协方差的计算中需要减去均值
    meanRemoved=dataMat-meanVals
    covMat=cov(meanRemoved,rowvar=0)  #cov()计算方差
    eigVals,eigVects=linalg.eig(mat(covMat))  #利用numpy中寻找特征值和特征向量的模块linalg中的eig()方法
    k=eigValPct(eigVals,percentage) #要达到方差的百分比percentage,需要前k个向量
    eigValInd=argsort(eigVals)  #对特征值eigVals从小到大排序
    eigValInd=eigValInd[:-(k+1):-1] #从排好序的特征值,从后往前取k个,这样就实现了特征值的从大到小排列
    redEigVects=eigVects[:,eigValInd]   #返回排序后特征值对应的特征向量redEigVects(主成分)
    lowDDataMat=meanRemoved*redEigVects #将原始数据投影到主成分上得到新的低维数据lowDDataMat
    reconMat=(lowDDataMat*redEigVects.T)+meanVals   #得到重构数据reconMat
    return lowDDataMat,reconMat

def get_K(dataMat,percentage):
    meanVals = mean(dataMat, axis=0)  # 对每一列求平均值,因为协方差的计算中需要减去均值
    meanRemoved = dataMat - meanVals
    covMat = cov(meanRemoved, rowvar=0)  # cov()计算方差
    eigVals, eigVects = linalg.eig(mat(covMat))  # 利用numpy中寻找特征值和特征向量的模块linalg中的eig()方法
    k = eigValPct(eigVals, percentage)  # 要达到方差的百分比percentage,需要前k个向量
    return k

sklearn内的PCA模块
from sklearn.decomposition import PCA

k = pca.get_K(x_train,0.99)
PCA = PCA(k,copy=True,whiten = True)
x_train = PCA.fit_transform(x_train)
x_test = PCA.transform(x_test)

PCA原理:
转自:https://www.cnblogs.com/dengdan890730/p/5495078.html
PCA, Principle Component Analysis, 主成份分析, 是使用最广泛的降维算法.
……
(关于PCA的算法步骤和应用场景随便一搜就能找到了, 所以这里就不说了. )

假如你要处理一个数据集, 数据集中的每条记录都是一个dd维列向量. 但是这个dd太大了, 所以你希望把数据维度给降下来, 既可以去除一些冗余信息, 又可以降低处理数据时消耗的计算资源(用computation budget 来描述可能更形象).

用稍微正式点的语言描述:

已知:一个数据集DD, 记录(或者样本, 或input pattern)xi∈Dxi∈D 是dd维列向量.
目标:将每个x∈Dx∈D 映射到另一个pp维空间, p

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值