PCA
算法过程
假设原始数据是,其中m表示数据大小,n表示维度大小。
将X中的数据进行零均值化,即每一列都减去其均值。
计算协方差矩阵
求出C的特征值和特征向量
将特征向量按对应特征值大小从上到下按行排列成矩阵,取前k行组成矩阵P
就是降维到k维后的数据。
如何定义k? 方差百分比: 。为特征值,从小到大排列。 主成分分析(PCA)——基于python+numpy
原理
最大化方差法:
PCA 可以用来做降维,但通俗一点说,其本质应该是线性空间坐标系的转换,从原始的空间坐标系,转换到一个“合适的”的坐标系来表达,在这个坐标系中,主要信息都集中在了某几个坐标轴上,所以只保留这个“关键”的坐标系上的表达,就能很大程度approximate原信号。
所以用特征向量组成的基来表达样本。
投影后方差
S就是你说的“去均值的原矩阵(去均值的原矩阵的协方差矩阵的特征向量作为列向量形成的矩阵)”。
因为 u有约束条件 ,所以用乘子法: ,对求导,得到
待完善

code
【机器学习算法实现】主成分分析(PCA)——基于python+numpy PCA
import numpy as np
import matplotlib.pyplot as plt
def zeroMean(dataMat):
meanVal=np.mean(dataMat,axis=0) #按列求均值,即求各个特征的均值
newData=dataMat-meanVal
return newData,meanVal
def percentage2n(eigVals,percentage):
sortArray=np.sort(eigVals) #升序
sortArray=sortArray[-1::-1] #逆转,即降序
arraySum=sum(sortArray)
tmpSum=0
num=0
for i in sortArray:
tmpSum+=i
num+=1
if tmpSum>=arraySum*percentage:
return num
def pca(dataMat,percentage=0.99):
newData,meanVal=zeroMean(dataMat)
covMat=np.cov(newData,rowvar=0) #求协方差矩阵,return ndarray;若rowvar非0,一列代表一个样本,为0,一行代表一个样本
eigVals,eigVects=np.linalg.eig(np.mat(covMat))#求特征值和特征向量,特征向量是按列放的,即一列代表一个特征向量
n=percentage2n(eigVals,percentage) #要达到percent的方差百分比,需要前n个特征向量
eigValIndice=np.argsort(eigVals) #对特征值从小到大排序
n_eigValIndice=eigValIndice[-1:-(n+1):-1] #最大的n个特征值的下标
n_eigVect=eigVects[:,n_eigValIndice] #最大的n个特征值对应的特征向量
lowDDataMat=newData*n_eigVect #低维特征空间的数据
reconMat=(lowDDataMat*n_eigVect.T)+meanVal #重构数据
return lowDDataMat,reconMat
if __name__ == "__main__":
p1 = plt.subplot(121)
#XMat = np.array(pd.read_csv(datafile,sep="\t",header=-1)).astype(np.float)
XMat = np.loadtxt("pca.txt",delimiter="\t",dtype="float")
#XMat = lines[1:,:4].astype('float')
#XMat = np.array(pd.read_csv(datafile,sep="\t",header=-1)).astype(np.float)
p1.plot(XMat[:,0],XMat[:,1],'.')
finalData, reconMat = pca(XMat)
#p1.plot(recon_data[:,0],recon_data[:,1],'*')
p1.plot(finalData[:,0],finalData[:,1],'*')
plt.savefig("outfile.png")
plt.show()
Kernel PCA
http://zhanxw.com/blog/2011/02/kernel-pca-%E5%8E%9F%E7%90%86%E5%92%8C%E6%BC%94%E7%A4%BA/ Kernel PCA 原理和演示

Robust PCA
核范数||A|| * 是指矩阵奇异值的和,英文称呼叫Nuclear Norm.
MATLAB code
s= svd(A); nulear_norm = sum(diag(s));

机器学习中的范数规则化之(一)L0、L1与L2范数 机器学习中的范数规则化之(二)核范数与规则项参数选择
基于TensorFlow理解三大降维技术:PCA、t-SNE 和自编码器

为什么核范数能凸近似矩阵的秩?为什么核范数是凸的? Singular Value Thresholding (SVT) 奇异值阈值
PCA原理分析 主成分分析PCA算法:为什么去均值以后的高维矩阵乘以其协方差矩阵的特征向量矩阵就是“投影” A Tutorial on Principal Component Analysis
Last updated
Was this helpful?