PCA实现

Posted weidiao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PCA实现相关的知识,希望对你有一定的参考价值。

代码实现分成好多种层级,有的代码零依赖,有的代码依赖某些常用库,有的代码直接调用库。
在本文中,按照不同的层级分别实现PCA

对于分类问题基本任务可以描述如下
x11 x12 x13 x14 y1
x21 x22 x23 x24 y2
x31 x32 x33 x34 y3
......

PCA用于提取样本的主要特征,它只跟属性有关,而跟类别数据无关。也就是说,PCA只跟X有关而跟Y无关。

import numpy as np
from sklearn.decomposition import PCA

# 10个样本,每个样本7个属性,现在要取其中的3个属性
train_x = np.random.rand(10, 7)
train_y = np.random.randint(0, 3, (100, 1))

#使用sklearn
p = PCA(n_components=3)
p.fit(train_x, train_y)
train_data = p.transform(train_x)

# 使用numpy中的协方差计算、特征值求解来实现
mu = np.mean(train_x, axis=0)  # 均值向量
# 协方差矩阵,cov默认是列向量,这里需要T表示将行向量转置称列向量
# 使用参数rowvar=False相当于矩阵转置
A = np.cov(np.asmatrix(train_x - mu).T)
root, vec = np.linalg.eig(A)
ind = np.argsort(root)
transform_matrix = np.asmatrix(vec[:, ind[-3:]])
train_data2 = np.asmatrix(train_x - mu) * transform_matrix

# 自己实现协方差计算,只使用numpy中的特征值求解来实现
mu = np.mean(train_x, axis=0)
A = np.dot((train_x - mu).T, (train_x - mu)) / (len(train_x) - 1)
root, vec = np.linalg.eig(A)
# 返回的特征根是无序的,需要进行排序
ind = np.argsort(root)
# vec[:ind[-3:]]或者vec[:ind[-1:-4:-1]]都是可以的
transform_matrix = np.asmatrix(vec[:, ind[-3:]])
train_data3 = np.asmatrix(train_x - mu) * transform_matrix
print(np.sum(train_data - train_data2), np.sum(train_data - train_data3))

以上是关于PCA实现的主要内容,如果未能解决你的问题,请参考以下文章

毕业设计/Matlab系列基于PCA的图像压缩算法实现(附matlab代码)

PCA算法理解及代码实现

PCA主成分分析 原理讲解 python代码实现

PCL:主成分分析(PCA)原理与实现

PCA算法(实现降维)

PCA人脸识别的python实现