pca降维python代码_PCA降维算法的python实现

主成分分析(PCA)是一种无监督的学习方式,是一种常用的线性降维方法。如果遇到多因素分析,想要很多个自变量与因变量进行线性回归分析,一般都必须进行降维处理,而主成分分析是一种很好的解决方案。

一、PCA简介

PCA是将数据的n维特征映射到k维上(k

PCA求解的一般流程为:

(1)将原始数据进行标准化;

(2)计算标准化数据集的协方差矩阵;

(3)计算协方差矩阵的特征值和特征向量;

(4)保留最重要的k个特征(k

(5)找到这k个特征值对应的特征向量;

(6)将m乘n的数据集乘以k个n维的特征向量(n乘k),得到最终降维的数据集;

其实PCA的本质就是对角化协方差矩阵,解释一下为什么将特征值按照从大到小排序后再选择。首先解释一下特征值和特征向量表示什么。在线性代数中,对一个n*n的对称矩阵进行分解,我们可以求出它的特征值和特征向量,就会产生n个n维的正交基,每个正交基会对应一个特征值。然后把矩阵投影到这n个正交基上,此时特征值的模就表示矩阵在该基的投影长度。特征值越大,表示矩阵在对应的特征向量上的方差越大,样本越离散,越容易区分,信息量也越多。因此,特征值最大的对应的特征向量方向上所包含的信息量就越多。如果某几个特征值很小,那么说明在该方向上的信息量非常少,我们就可以删除小特征值所对应方向的数据,只保留大特征值方向对应的数据,这样做以后数据量越小,但是有用的信息量都保留下来了。

二、PCA的python实现

矩阵运算需要用到numpy包以及numpy包中的genfromtxt函数,这个函数是可以读取csv文件;还需要用到matplotlib进行画图

import numpy as np

from numpy import genfromtxt

import matplotlib.pyplot as plt

读取csv文件程序:

dataPath = r"D:\python\data.csv"

dataMat = genfromtxt(dataPath, delimiter=',')

设计pca函数

def pca(dataMat, k):

average = np.mean(dataMat, axis=0) #按列求均值

m, n = np.shape(dataMat)

meanRemoved = dataMat - np.tile(average, (m,1)) #减去均值

normData = meanRemoved / np.std(dataMat) #标准差归一化

covMat = np.cov(normData.T) #求协方差矩阵

eigValue, eigVec = np.linalg.eig(covMat) #求协方差矩阵的特征值和特征向量

eigValInd = np.argsort(-eigValue) #返回特征值由大到小排序的下标

selectVec = np.matrix(eigVec.T[:k]) #因为[:k]表示前k行,因此之前需要转置处理(选择前k个大的特征值)

finalData = normData * selectVec.T #再转置回来

return finalData

我们可以得到最终的结果

finalData = pca(dataMat, 2)

plt.scatter(dataMat.T[:1],dataMat.T[1:], color='red', s=20)

plt.scatter(finalData.T[:1],finalData.T[1:], color='blue', s=20)

plt.show()

plt.close()

结果如下:

如果我们不直接给出需要的前k个主成分,而是编程前k个主成分占总体90%确定k,程序如下:

def setK(eigValue, rate):

eigValInd = np.argsort(-eigValue) #返回特征值由大到小排序的下标值

for i in range(1, eigValue.size+1):

topK = eigValInd[i-1]

eigVal = eigValue[topK]

a = eigVal.sum()

b = eigValue.sum()

if a/b >= rate:

break

return i

此时,修改两个地方:

finalData = pca(dataMat, rata)

k = setK(eigValInd, rata)

之后就完成了主成分分析

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值