(项目学习笔记及代码)
主成分分析 (Principal Component Analysis,简称 PCA)是最常用的一种降维方法。(具体可见西瓜书)
2、去噪PCA也可以用作噪音的过滤,因为任何一个成分的变化影响都远远大于随机噪声的影响的,所以针对于噪声,各种的成分相对不受影响。即可以用主成分来重构原始数据。
3、原理 假设 R d mathbb{R}^{d} Rd空间中有 m m m个样本点 : X = { x 1 , x 2 , . . . , x m } :X={x_1,x_2,...,x_m} :X={x1,x2,...,xm}。这些点即可以理解为我们数据的特征,如图片的像素,每一个数据 x i x_i xi都有 d d d维, x i ∈ R d x_i in mathbb{R}^{d} xi∈Rd。begin{aligned} x_i={left[ begin{matrix} x_i^1 \ x_i^2 \ cdot \ cdot \ cdot \ x_i^d \ end{matrix} right] }_{d times 1} tag{1} end{aligned}
xi=⎣⎢⎢⎢⎢⎢⎢⎡xi1xi2⋅⋅⋅xid⎦⎥⎥⎥⎥⎥⎥⎤d×1(1)begin{aligned} X=(x_1,x_2,...,x_m)_{d times m}^mathrm{T}={left[ begin{matrix} x_1^1 & x_2^1 & cdot & cdot & cdot & x_1^d \ x_1^2 & x_2^2 & cdot & cdot & cdot & x_2^d \ cdot & cdot & cdot & & & cdot \ cdot & cdot & & cdot & & cdot \ cdot & cdot & & & cdot & cdot \ x_m^1 & x_m^2 & cdot & cdot & cdot & x_m^d \ end{matrix} right] }_{m times d} tag{2} end{aligned}
X=(x1,x2,...,xm)d×mT=⎣⎢⎢⎢⎢⎢⎢⎡x11x12⋅⋅⋅xm1x21x22⋅⋅⋅xm2⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅x1dx2d⋅⋅⋅xmd⎦⎥⎥⎥⎥⎥⎥⎤m×d(2)x i = x i − x ˉ = [ x i 1 − x ˉ 1 x i 2 − x ˉ 2 ⋅ ⋅ ⋅ x i d − x ˉ d ] d × 1 (5) begin{aligned} x_i & =x_i-bar{x}={left[ begin{matrix} x_i^1 - bar{x}^1 \ x_i^2 - bar{x}^2 \ cdot \ cdot \ cdot \ x_i^d - bar{x}^d \ end{matrix} right] }_{d times 1} tag{5} end{aligned}
xi=xi−xˉ=⎣⎢⎢⎢⎢⎢⎢⎡xi1−xˉ1xi2−xˉ2⋅⋅⋅xid−xˉd⎦⎥⎥⎥⎥⎥⎥⎤d×1(5)
对数据样本 x i ∈ R d x_iin mathbb{R}^{d} xi∈Rd进行降维压缩得到结果 z i ∈ R d ′ z_iin mathbb{R}^{d'} zi∈Rd′, ( d ′ < d ) (d'<d) (d′<d)。由 x i x_i xi得到 z i z_i zi的过程可以如下表示,权重 W = { w 1 , w 2 , . . . , w d ′ } mathbf{W}={w_1,w_2,...,w_{d'} } W={w1,w2,...,wd′}作用下的矩阵线性变换。这就是我们降维后的结果,也是PCA工作的目标:1、本文代码是通过加载原始的matlab 中的一个数组文件作为数据集的(数据集可以是任意的数据,但注意最后用plt库绘图时,注意下标的匹配)
2、其中有些地方代码已经注释的很清楚了。
3、若进行降噪即最后重构(restore)即可,若进行降维,那么经过转换后(transform)的即是新的维度下的结果。
4、代码引用了部分搜索到的,不过有些确实找不到了而没有引用!
# -*- coding: utf-8 -*- """ Created on Tue Jan 8 10:39:09 2019 @author: QSY """ import matplotlib.pyplot as plt import scipy.io as sci from sklearn.decomposition import PCA import numpy as np """Read data from *.mat including two kinds""" data_tarin = sci.loadmat('data_train.mat') # data_test = sci.loadmat('data_test.mat') data_train_noisy = data_tarin['noiseSignal'] data_train_theory = data_tarin['clearSignal'] #选取数据进行操作 X=data_train_noisy[0:1,:] #进行行列转换 X=list(map(list, zip(*X))) #创建横坐标 p=[] for i in range(434): j=i p.append(j) def ReadReductionofcomponents(X): pca=PCA(n_components=1) pca.fit(X) #进行操作转换后的结果 x_reduction =pca.transform(X) #进行复原恢复后的结果 x_restore=pca.inverse_transform(x_reduction) x_restore=x_restore[:,0:1] #X仅选择某一列的数据进行操作 X=np.array(X) X=X[:,0:1] #进行线绘制 plt.plot(p, x_restore, color='r', linewidth=0.3, alpha=0.6,label="PCA") plt.plot(p, X, color='b', linewidth=0.2, alpha=0.6,label="init") plt.legend()#显示图例名字 #pdf保存 plt.savefig('1.png') plt.show() ReadReductionofcomponents(X)
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455 2、数学方式# -*- coding: utf-8 -*- """ Created on Tue Jan 8 16:24:57 2019 @author: QSY """ import numpy as np import scipy.io as sci import matplotlib.pyplot as plt """Read data from *.mat including two kinds""" data_tarin = sci.loadmat('data_train.mat') other_data=sci.loadmat('pca.mat') # data_test = sci.loadmat('data_test.mat') data_train_noisy = data_tarin['noiseSignal'] data_train_theory = data_tarin['clearSignal'] perfect_data=other_data['U'] #选取数据进行操作 X=data_train_noisy[0:3,:] X=list(map(list, zip(*X))) X=perfect_data #零均值化 def zeroMean(dataMat): #按列求均值,即求各个特征的均值 meanVal=np.mean(dataMat,axis=0) newData=dataMat-meanVal return newData,meanVal def pca(dataMat,n): newData,meanVal=zeroMean(dataMat) covMat=np.cov(newData,rowvar=0) #求协方差矩阵 eigVals,eigVects=np.linalg.eig(np.mat(covMat))#求特征值和特征向量,特征向量是按列放的,即一列代表一个特征向量 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 #newData,meanVal=zeroMean(X) lowDDataMat,reconMat=pca(X,n=1) p=[] for i in range(24): j=i#np.log10(i) p.append(j) plt.plot(p, lowDDataMat, color='r', linewidth=0.2, alpha=0.6,label="after PCA") #plt.plot(p, X, color='b', linewidth=0.2, alpha=0.6,label="init") plt.legend()#显示图例名字 #pdf保存 plt.savefig('1.pdf') plt.show()
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162https://www.cnblogs.com/sweetyu/p/5085798.html
https://www.cnblogs.com/pinard/p/6243025.html
相关知识
PCA主成分分析去噪与降维
机器学习(三)降维之PCA及鸢尾花降维
基于PCA与LDA的数据降维实践
主成分分析:PCA的思想及鸢尾花实例实现
机器学习利用PCA完成鸢尾花数据集的降维与分类
使用pca的降维方法对sklearn官方iris(鸢尾花)数据集进行降维,并绘图显示
鸢尾花数据集降维可视化
鸢尾花数据集上的主成分分析 (PCA) — scikit
利用PCA(主成分分析法)实现鸢尾花数据集的分类
基于PCA的数据降维(鸢尾花(iris)数据集)
网址: PCA主成分分析去噪与降维 https://m.huajiangbk.com/newsview1657798.html
上一篇: 太强了!神经网络不到一秒就能求解 |
下一篇: 荣耀Magic7系列全面升级大王 |