当前位置: 代码迷 >> 综合 >> PCA python代码实现及代码解释
  详细解决方案

PCA python代码实现及代码解释

热度:23   发布时间:2023-09-22 09:55:20.0

PCA算法:

# ??输入:训练样本集 ?=?(1),?(2),...,?(?) ,低维空间维数 ?′ ;
# ??过程:.
# ??1:对所有样本进行中心化(去均值操作): ?(?)?←?(?)??1?∑??=1?(?)? ;
# ??2:计算样本的协方差矩阵 ??? ;
# ??3:对协方差矩阵 ??? 做特征值分解 ;
# ??4:取最大的 ?′ 个特征值所对应的特征向量 ?1,?2,...,??′
# ??5:将原样本矩阵与投影矩阵相乘: ??? 即为降维后数据集 ?′ 。其中 ? 为 ?×? 维, ?=[?1,?2,...,??′] 为 ?×?′ 维。
# ??5:输出:降维后的数据集 ?′

 

1、

list[start:end:step]

start:起始位置

end:结束位置

step:步长

2、

>>> c=np.array([[1,2,3],[4,6,7],[7,8,9]])
>>> c[:-1:]
array([[1, 2, 3],[4, 6, 7]])
>>> c[:-2:]
array([[1, 2, 3]])

 

3、

X[:,0]就是取矩阵X的所有行的第0列的元素,X[:,1] 就是取所有行的第1列的元素。

X[:,  m:n]即取矩阵X的所有行中的的第m到n-1列数据,含左不含右。

X[0,:]就是取矩阵X的第0行的所有元素,X[1,:]取矩阵X的第一行的所有元素。
 

4、

mean()函数功能:求取均值

 

5、

经常操作的参数为axis,以m * n矩阵举例:

axis 不设置值,对 m*n 个数求均值,返回一个实数

axis = 0:压缩行,对各列求均值,返回 1* n 矩阵

axis =1 :压缩列,对各行求均值,返回 m *1 矩阵

 

6、

from numpy import *

covMat=cov(newData,rowvar=0)
其中rowvar=0,说明传入的数据一行代表一个样本;若非0,说明传入的数据一列代表一个样本。

7、

协方差矩阵的维度等于随机变量的个数,即每一个 observation 的维度。在某些场合前边也会出现 1 / m,而不是 1 / (m - 1).

 

代码如下:

 

# ??输入:训练样本集 ?=?(1),?(2),...,?(?) ,低维空间维数 ?′ ;
# ??过程:.
# ??1:对所有样本进行中心化(去均值操作): ?(?)?←?(?)??1?∑??=1?(?)? ;
# ??2:计算样本的协方差矩阵 ??? ;
# ??3:对协方差矩阵 ??? 做特征值分解 ;
# ??4:取最大的 ?′ 个特征值所对应的特征向量 ?1,?2,...,??′
# ??5:将原样本矩阵与投影矩阵相乘: ??? 即为降维后数据集 ?′ 。其中 ? 为 ?×? 维, ?=[?1,?2,...,??′] 为 ?×?′ 维。
# ??5:输出:降维后的数据集 ?′import numpy as npdef PCA(dataMatrix, topNfeature=99999):meanvals  = np.mean(dataMatrix, axis=1)print("meanvals:")print(meanvals)row, col = np.shape(dataMatrix)Mat = np.array(dataMatrix, dtype='float64')for i in range(row):for j in range(col):Mat[i][j] = meanvals[i]#valscut = np.array(dataMatrix, dtype='float64')valscut = dataMatrix - Matprint("valscut:")print(valscut)# print("row=%d,col=%d",%(row,col))print("row=%d,col=%d" % (row, col))covmatrix = np.dot(valscut, valscut.T)/col  #协方差矩阵系数取1/mprint("covmatrix=")print(covmatrix)featurevals, featurevect = np.linalg.eig(np.mat(covmatrix))print(featurevals)print(featurevect)eigvalind = np.argsort(featurevals)#返回从小到大索引print(eigvalind)eigvalind = eigvalind[:-(topNfeature+1):-1]redEigVect = featurevect[:, eigvalind]print("redEigVect:")#print(np.shape(redEigVect))print(redEigVect)print("lowdataMat=")lowdataMat = np.dot(redEigVect.T, dataMatrix)print(lowdataMat)return lowdataMata = np.array([[-1, -1, 0, 2, 0], [-2, 0, 0, 1, 1]])
b = [[-1, -2], [-1, 0], [0, 0], [2, 1], [0, 1]]
c = [[1, 0, 0], [0, 2, 0], [0, 0, 3]]
print("input matrix is:")
print(a)
# print(b)
# low, reconMat = PCA(a, 1)
PCA_re = PCA(a, 1)
print("answer of PCA:")
print(PCA_re)
# print("reconMat:")
# print(reconMat)

 

  相关解决方案