前言

本篇文章是为了理解PCA的基本原理来进行代码部分实现的,由于本篇博文只考虑了其中的原理,因此采用的特征向量都是维度较小的向量。

具体流程

首先需要创建一个数组,存储这些特征向量,为了便于进一步的操作,将其转为np.array的格式。

import numpy as npftmat=np.array([[1,2,3],[4,5,6],])
m,n=ftmat.shape
# (m,n)=(2,3)

计算整个特征向量的均值,便于进一步求取特征向量的协方差矩阵:
具体求解方法可以调用mean函数:

u=np.mean(ftmat,axis=0)
# u=[2.5 3.5 4.5]

在求解协方差矩阵的时候,其实是遇到了一些问题的,主要是不知道如何将其对应的均值数组进行增广化处理来便于进一步利用每个特征向量减去均值向量来进行中心化处理。这里想到的方法是一个比较简单的思路,即新建一个与原本特征向量维度一致的零数组,将每个元素设置为均值向量。

u_ex=np.zeros((m,n))
for i in range(m):u_ex[i]=u
print(u_ex)
# u_ex=[[2.5 3.5 4.5]
# [2.5 3.5 4.5]]

将原本的特征向量与之相减即可得到对应的中心化后的特征向量:

ft_cen=ftmat-u_ex
# ft_cen=[[-1.5 -1.5 -1.5]
# [ 1.5  1.5  1.5]]

计算协方差矩阵,利用的方法是将原本数组中的每个元素都进行矩阵乘法,自己乘以自己的转置;我们常用的矩阵以及矩阵转置的方法如下,要注意的地方在于如果一个向量想要转置那么至少应当保证其维度大于等于二维,具体如下:

m=np.array([[1,2,3]])
m_t=m.T
print(m,m_t)
print(m*m_t)
# m*m_t=
#[[1 2 3]
# [2 4 6]
# [3 6 9]]

有了上述的思路后,只需要利用for循环,将所有的数组都利用如此的方法进行实现即可。

cor=list()
for i in ft_cen:cor.append(np.array([i])*np.array([i]).T)print(cor[0],cor[1],sep='\n')
# cor=
#[[2.25 2.25 2.25]
# [2.25 2.25 2.25]
# [2.25 2.25 2.25]]
#[[2.25 2.25 2.25]
# [2.25 2.25 2.25]
# [2.25 2.25 2.25]]

求解出协方差矩阵之后,下一步是利用协方差矩阵来进行特征值与特征向量的求解,由于python中有求解特征值的较为方便的函数,因此直接调用即可:

l,l_mat=np.linalg.eig(cor)

但是要注意的是,我们每个协方差矩阵的特征值与特征向量只需要保存前几个就足够了,并不需要全部保存所有的,因此这里为了方便只选择了特征值最大的作为特征向量进行下一步的计算。用l1表示特征值对应的矩阵,用l2表示其对应特征向量,单个数组具体的处理步骤如下:

l1=[6.7500000e+00  0.0000000e+00 -5.1279005e-16]
l2=[[-5.77350269e-01 -5.41302883e-17  8.04908467e-01][-5.77350269e-01 -7.07106781e-01 -5.21162995e-01][-5.77350269e-01  7.07106781e-01 -2.83745472e-01]]
# 为了模拟上面返回的np.array所以进行一下处理,增加适配性:
l1,l2=map(np.array,[l1,l2])
# 获得最大值的下标:
l1_max_idx=list(l1).index(max(l1))
# 获取最大特征值对应的特征向量
l2_max=list()
for i in l2:l2_max.append(i[l1_max_idx])
l2_max=l2_max/l2_max[0]

利用上面的处理步骤,不难得出对应的协方差矩阵的处理方法:

cor_ft=list()
for i in range(len(l)):l_max_idx=list(l[i]).index(max(l[i]))l_max=list()for j in l_mat[i]:l_max.append(j[l_max_idx])l_max=l_max/l_max[0]cor_ft.append(l_max)
print(cor_ft)
# cor_ft=[array([1., 1., 1.]), array([1., 1., 1.])]

为了减少计算量,可以采用归一化处理,即求得向量的模,并用原本的向量除以这个模进而得到归一化处理后的向量。

mod=list()
for i in cor_ft:mod_tmp=0for j in i:mod_tmp=mod_tmp+j**2mod.append(mod_tmp)
print(mod)for i in range(len(cor_ft)):cor_ft[i]=cor_ft[i]/mod[i]
print(cor_ft)
# cor_ft=[array([0.33333333, 0.33333333, 0.33333333]), array([0.33333333, 0.33333333, 0.33333333])]

将原本的特征向量进行降维处理,利用特征向量与原本的向量进行矩阵乘法即可,由于此处均为一维向量,所以直接利用点积即可。压缩过程如下所示:

ft_zip=list()for i in range(len(ftmat)):ft_zip.append(np.dot(ftmat[i],cor_ft[i]))
print(ft_zip)
# ft_zip=[1.9999999999999996, 4.999999999999999]

最终压缩后的向量即为ft_zip,之后即可利用新的向量,采用其他的分类方法进行分类操作。
汇总代码如下所示:

import numpy as npftmat=np.array([[1,2,3],[4,5,6],])m,n=ftmat.shape
##print(ftmat)
##print(f'({m},{n})')u=np.mean(ftmat,axis=0)
##print(u)
u_ex=np.zeros((m,n))
for i in range(m):u_ex[i]=u
##print(u_ex)ft_cen=ftmat-u_ex
##print(ft_cen)##m=np.array([[1,2,3]])
##m_t=m.T
##print(m,m_t)
##print(m*m_t)cor=list()
for i in ft_cen:cor.append(np.array([i])*np.array([i]).T)##print(cor[0],cor[1],sep='\n')
l,l_mat=np.linalg.eig(cor)
##print(l,l_mat)##l1=[6.7500000e+00,0.0000000e+00,-5.1279005e-16]
##l2=[[-5.77350269e-01,-5.41302883e-17,8.04908467e-01],
##  [-5.77350269e-01,-7.07106781e-01,-5.21162995e-01],
##  [-5.77350269e-01, 7.07106781e-01,-2.83745472e-01]]
##l1,l2=map(np.array,[l1,l2])
####print(l1,l2)
####print(list(l1).index(max(l1)))
##l1_max_idx=list(l1).index(max(l1))
##l2_max=list()
##for i in l2:
##    l2_max.append(i[l1_max_idx])
##l2_max=l2_max/l2_max[0]cor_ft=list()
for i in range(len(l)):l_max_idx=list(l[i]).index(max(l[i]))l_max=list()for j in l_mat[i]:l_max.append(j[l_max_idx])l_max=l_max/l_max[0]cor_ft.append(l_max)
print(cor_ft)mod=list()
for i in cor_ft:mod_tmp=0for j in i:mod_tmp=mod_tmp+j**2mod.append(mod_tmp)
print(mod)for i in range(len(cor_ft)):cor_ft[i]=cor_ft[i]/mod[i]
print(cor_ft)ft_zip=list()for i in range(len(ftmat)):ft_zip.append(np.dot(ftmat[i],cor_ft[i]))
print(ft_zip)

利用PCA进行数据压缩相关推荐

  1. ML之DR之PCA:利用PCA对手写数字图片识别数据集进行降维处理(理解PCA)

    ML之DR之PCA:利用PCA对手写数字图片识别数据集进行降维处理(理解PCA) 目录 初步理解PCA 输出结果 核心代码 初步理解PCA #理解PCA:线性相关矩阵秩计算样例 import nump ...

  2. MAT之PCA:利用PCA(四个主成分的贡献率就才达100%)降维提高测试集辛烷值含量预测准确度并《测试集辛烷值含量预测结果对比》

    MAT之PCA:利用PCA(四个主成分的贡献率就才达100%)降维提高测试集辛烷值含量预测准确度并<测试集辛烷值含量预测结果对比> 目录 输出结果 实现代码 输出结果 后期更新-- 实现代 ...

  3. 机器学习实战(十一)利用PCA来简化数据

    第十三章 利用PCA来简化数据 13.1 降维技术 13.1.1 主成分分析(PrincipalComponentAnalysis,PCA) 13.1.2 因子分析(Factor Analysis) ...

  4. Python利用PCA压缩图片

    Python利用PCA压缩图片 参考 Python利用PCA对图片进行降维处理 PCA降维 维度 样本数 feature数 1.python代码实现PCA 这里先将1280的1D向量转变成2D图片之后 ...

  5. 如何利用PCA(Principal component analysis)来简化数据

    本博文的的内容为以下: 降维技术 主成分分析(PCA) 对半导体数据进行降维处理 降维(dimensionality reduction)的目标就是对输入的数目进行消减,由此剔除数据中的噪声并提高机器 ...

  6. 利用PCA(主成分分析法)实现鸢尾花数据集的分类

    利用PCA(主成分分析法)实现鸢尾花数据集的分类 依赖库 sklearn.matplotlib 安装方法 在终端输入 pip install sklearn pip install matplotli ...

  7. STC15单片机利用PCA功能测量脉宽应用示例

    STC15单片机利用PCA功能测量脉宽应用示例

  8. kpca故障诊断matlab,PCA_kpca 利用pca和 对CSTR过程进行故障诊断,包括7个噪声及开环和串 制 matlab 263万源代码下载- www.pudn.com...

    文件名称: PCA_kpca下载  收藏√  [ 5  4  3  2  1 ] 开发工具: matlab 文件大小: 1188 KB 上传时间: 2016-09-05 下载次数: 0 提 供 者: ...

  9. 《机器学习实战》之十三——利用PCA来简化数据

    PCA目录 一.前言 二.降维技术 三.PCA 1.PCA的数学原理 (1)向量内积与投影 (2)基 (3)基变换 (4)方差与协方差 2.PCA算法步骤 3.在numpy中实现PCA (1)零均值化 ...

最新文章

  1. 总体设计和登陆服务器 [游戏服务器的设计思路 转]
  2. CentOS6.4安装gvim
  3. 仪表自定义刻度值_史上最全的仪表选型,就差你还没看了
  4. Lucene学习之——停用词
  5. GM6 PageSet request didn't have target application url
  6. Kylin启动异常:java.lang.outofMemoryError:Requested array size exceeds VM limit
  7. 彻底学会Spring事务——概念+具体实现
  8. SDWebImage之工具类
  9. NYOJ题目219-An problem about date
  10. 如何开发Android安卓APP读写NFC Ntag
  11. NGINX集群+KeepLived实现高可用
  12. 计算机专业评定职称论文,优秀计算机评职称论文参考文献 计算机评职称参考文献怎么写...
  13. java 修改pdf_使用Java编辑PDF文本
  14. Android 读取外接储存设备的数据(如挂载的U盘,SD卡等)
  15. 《微信小程序案例12》图片识别功能
  16. c语言用户标识符不能描述常量,计算机等级二级C语言考试选择题库
  17. java拼接sql语句的in条件
  18. 昂达v80 plus linux,昂达(ONDA)V80 Plus平板电脑整体性能评测-ZOL中关村在线
  19. Python数据分析项目案例
  20. zynq7000 FSBL 源码分析

热门文章

  1. Apple iOS安全分析
  2. miniUI中控制表单元素设置只读方法
  3. 查找雇员表中姓王的员工JAVA_SQLSERVER2008实用教程实验参考答案(实验4)
  4. 【转载】【超级简单入门】用Python从海量文本抽取主题
  5. 抖音上用计算机弹,抖音体面怎么用计算器弹奏_抖音体面计算器乐谱_管理资源吧...
  6. Django人体识别
  7. linux+shell+解压命令,linux shell 压缩解压命令
  8. 现在如何注册台服服务器,《英雄联盟手游》台服怎么注册账号 台服注册账号方法...
  9. HTTP原理/post和get
  10. vue设置输入框输入长度_基于vue的限制输入框可输入字节数的解决方案