目录:

  • 主成分分析
    • 1. PCA目的/作用
    • 2. 求解步骤
    • 3. 写代码加分析
      • 1. 去除平均值,也称零均值化
      • 2. 计算协方差矩阵
      • 3. 计算协方差矩阵的特征值和特征向量
      • 4. 将特征值排序
      • 5. 保留前N个最大的特征值对应的特征向量
      • 6.将原始特征转换到上面得到的N个特征向量构建的新空间中(最后两步,实现了特征压缩)
      • 7. 随带着求个相关性
    • 所有代码
  • 参考

主成分分析

主成分分析是利用降维的思想,在损失很少信息的前提下把多个指标转化为几个综合指标的多元统计方法。通常把转化生成的综合指标称之为主成分,其中每个主成分都是原始变量的线性组合,且各个主成分之间互不相关,这就使得主成分比原始变量具有某些更优越的性能。这样在研究复杂问题时就可以只考虑少数几个主成分而不至于损失太多信息,从而更容易抓住主要矛盾,揭示事物内部变量之间的规律性,同时使问题得到简化,提高分析效率。

主成分分析正是研究如何通过原来变量的少数几个线性组合来解释原来变量绝大多数信息的一种多元统计方法。

1. PCA目的/作用

主成分分析算法(PCA)是最常用的线性降维方法,它的目标是通过某种线性投影,将高维的数据映射到低维的空间中,并期望在所投影的维度上数据的信息量最大(方差最大),以此使用较少的数据维度,同时保留住较多的原数据点的特性。

PCA降维的目的,就是为了在尽量保证“信息量不丢失”的情况下,对原始特征进行降维,也就是尽可能将原始特征往具有最大投影信息量的维度上进行投影。将原特征投影到这些维度上,使降维后信息量损失最小。

2. 求解步骤

去除平均值
计算协方差矩阵
计算协方差矩阵的特征值和特征向量
将特征值排序
保留前N个最大的特征值对应的特征向量
将原始特征转换到上面得到的N个特征向量构建的新空间中(最后两步,实现了特征压缩)

3. 写代码加分析

1. 去除平均值,也称零均值化

叫做中心化,也叫零均值处理,就是将每个原始数据减去这些数据的均值。
x ′ = x − μ x ′ = x − μ x′=x−μ给定一个数值型数据集合,将每个属性的数据都减去这个属性的均值后,形成一个新数据集合,变换后各属性的数据之和与均值都为零。在我看来,就是把图像移动到中心处。

看图像:

data = np.array([[2.5,0.5,2.2,1.9,3.1,2.3,2,1,1.5,1.1],[2.4,0.7,2.9,2.2,3,2.7,1.6,1.1,1.6,0.9]]).T
plt.scatter(data[:,0],data[:,1],label='The original image')
plt.axhline(y=0,ls=":")#添加水平直线
plt.axvline(x=0,ls=":")#添加垂直直线
plt.legend()
plt.show()
n_samples, n_features = data.shape
mean=np.array([np.mean(data[:,i]) for i in range(n_features)])
print("data:\n",data)
print("mean:\n",mean)
text=data-mean
print("text:\n",text)
plt.scatter(text[:,0],text[:,1],label='Now the image')
plt.axhline(y=0,ls=":")#添加水平直线
plt.axvline(x=0,ls=":")#添加垂直直线
plt.legend()
plt.show()

运行结果:

data:[[2.5 2.4][0.5 0.7][2.2 2.9][1.9 2.2][3.1 3. ][2.3 2.7][2.  1.6][1.  1.1][1.5 1.6][1.1 0.9]]
mean:[1.81 1.91]
text:[[ 0.69  0.49][-1.31 -1.21][ 0.39  0.99][ 0.09  0.29][ 1.29  1.09][ 0.49  0.79][ 0.19 -0.31][-0.81 -0.81][-0.31 -0.31][-0.71 -1.01]]


2. 计算协方差矩阵

矩阵: C = [ c o v ( x 1 , x 1 ) c o v ( x 1 , x 2 ) c o v ( x 2 , x 1 ) c o v ( x 2 , x 2 ) ] C=\left[ \begin{matrix} cov(x_1,x_1) & cov(x_1,x_2) \\ cov(x_2,x_1) & cov(x_2,x_2) \end{matrix} \right] C=[cov(x1​,x1​)cov(x2​,x1​)​cov(x1​,x2​)cov(x2​,x2​)​]其中 c o v ( x 1 , x 1 ) cov(x_1,x_1) cov(x1​,x1​)得求解公式:
c o v ( x 1 , x 1 ) = ∑ i = 1 M ( x 1 i − x ˉ 1 ) ( x 1 i − x ˉ 1 ) M − 1 cov(x_1,x_1)={\sum^M_{i=1}(x^i_1-\bar x_1)(x^i_1-\bar x_1)\over M-1} cov(x1​,x1​)=M−1∑i=1M​(x1i​−xˉ1​)(x1i​−xˉ1​)​

求协方差的代码:

Cov = np.cov(data.T)print("协方差:", Cov)

3. 计算协方差矩阵的特征值和特征向量

定义: A A A为 n n n阶矩阵,若数 λ λ λ和 n n n维非0列向量x满足 A x = λ x Ax=λx Ax=λx,那么数 λ λ λ称为 A A A的特征值, x x x称为 A A A的对应于特征值 λ λ λ的特征向量。

这里我就不详细写计算过程了(可以自行查询)

代码实现:

val, vec = np.linalg.eig(Cov)
for i in range(len(val)):print('特征值:{0}\n对应的特征向量:\n{1}\n'.format(val[i], np.transpose([vec[:,i]])))

4. 将特征值排序

代码实现:

pairs = [(val[i], vec.T[i]) for i in range(len(val))]
pairs.sort(key=lambda x: x[0], reverse=True) # 排序

5. 保留前N个最大的特征值对应的特征向量

这里我保留的是前两个最大的特征值对应的特征向量

代码实现:

matrix_U = np.hstack((pairs[0][1].reshape(-1,1),pairs[1][1].reshape(-1,1))).squeeze() # 拼接

6.将原始特征转换到上面得到的N个特征向量构建的新空间中(最后两步,实现了特征压缩)

代码实现:

matrix_F = matrix_U.T.dot(text.T)
print(matrix_F.T)

7. 随带着求个相关性

代码实现:

correlationXF=np.corrcoef(text.T,matrix_F)
print(correlationXF.round(4))

所有代码

def PCA(dataNew):n_samples, n_features = dataNew.shapemean=np.array([np.mean(dataNew[:,i]) for i in range(n_features)])print("mean:",mean)text=dataNew-meanprint("零均值化:", text)# 2.协方差Cov = np.cov(dataNew.T)print("协方差:", Cov)# 3. 特征值# 先转一下数据val, vec = np.linalg.eig(Cov)for i in range(len(val)):print('特征值:{0}\n对应的特征向量:\n{1}\n'.format(val[i], np.transpose([vec[:,i]])))# 4. 标准正交特征向量pairs = [(val[i], vec.T[i]) for i in range(len(val))]pairs.sort(key=lambda x: x[0], reverse=True) # 排序# 5. 取前两行数据matrix_U = np.hstack((pairs[0][1].reshape(-1,1),pairs[1][1].reshape(-1,1))).squeeze() # 拼接print("matrix_U:",matrix_U)print("text:",text)# 6. 新坐标matrix_F = matrix_U.T.dot(text.T)print(matrix_F.T)plt.scatter(matrix_F[0],matrix_F[1],color='b')plt.show()# 7. 计算原属性与各个主成分的相关性print("text:\n",text)print("matrix_F:\n",matrix_F)correlationXF=np.corrcoef(text.T,matrix_F)print(correlationXF.round(4))

我们导入一个数据:

data = np.array([[2.5,0.5,2.2,1.9,3.1,2.3,2,1,1.5,1.1],[2.4,0.7,2.9,2.2,3,2.7,1.6,1.1,1.6,0.9]]).T
print(data)
PCA(data)

运行结果:

[[2.5 2.4][0.5 0.7][2.2 2.9][1.9 2.2][3.1 3. ][2.3 2.7][2.  1.6][1.  1.1][1.5 1.6][1.1 0.9]]
mean: [1.81 1.91]
零均值化: [[ 0.69  0.49][-1.31 -1.21][ 0.39  0.99][ 0.09  0.29][ 1.29  1.09][ 0.49  0.79][ 0.19 -0.31][-0.81 -0.81][-0.31 -0.31][-0.71 -1.01]]
协方差: [[0.61655556 0.61544444][0.61544444 0.71655556]]
特征值:0.04908339893832736
对应的特征向量:
[[-0.73517866][ 0.6778734 ]]特征值:1.2840277121727837
对应的特征向量:
[[-0.6778734 ][-0.73517866]]matrix_U: [[-0.6778734  -0.73517866][-0.73517866  0.6778734 ]]
text: [[ 0.69  0.49][-1.31 -1.21][ 0.39  0.99][ 0.09  0.29][ 1.29  1.09][ 0.49  0.79][ 0.19 -0.31][-0.81 -0.81][-0.31 -0.31][-0.71 -1.01]]
matrix_F.T: [[-0.82797019 -0.17511531][ 1.77758033  0.14285723][-0.99219749  0.38437499][-0.27421042  0.13041721][-1.67580142 -0.20949846][-0.9129491   0.17528244][ 0.09910944 -0.3498247 ][ 1.14457216  0.04641726][ 0.43804614  0.01776463][ 1.22382056 -0.16267529]]text:[[ 0.69  0.49][-1.31 -1.21][ 0.39  0.99][ 0.09  0.29][ 1.29  1.09][ 0.49  0.79][ 0.19 -0.31][-0.81 -0.81][-0.31 -0.31][-0.71 -1.01]]
matrix_F:[[-0.82797019  1.77758033 -0.99219749 -0.27421042 -1.67580142 -0.91294910.09910944  1.14457216  0.43804614  1.22382056][-0.17511531  0.14285723  0.38437499  0.13041721 -0.20949846  0.17528244-0.3498247   0.04641726  0.01776463 -0.16267529]]
[[ 1.      0.9259 -0.9782 -0.2074][ 0.9259  1.     -0.9841  0.1774][-0.9782 -0.9841  1.     -0.    ][-0.2074  0.1774 -0.      1.    ]]


注:
最后的相关系数是4*4的数据,旧数据是x1,x2,新数据是F1,F2

x1 x2 F1 F2
x1 1. 0.9259 -0.9782 -0.2074
x2 0.9259 1. -0.9841 0.1774
F1 -0.9782 -0.9841 1. -0.
F -0.2074 0.1774 -0. 1.

参考

PCA:详细解释主成分分析
一篇深入剖析PCA的好文
线性代数学习之特征值与特征向量


创作不易,如果对你有帮助,求求你给我个赞!!!
点赞 + 收藏 + 关注!!!
如有错误与建议,望告知!!!(将于下篇文章更正)
请多多关注我!!!谢谢!!!

大数据分析与实践 数据预处理-主成分分析相关推荐

  1. 大数据可视化python_大数据分析之Python数据可视化的四种简易方法

    本篇文章探讨了大数据分析之Python数据可视化的四种简易方法,希望阅读本篇文章以后大家有所收获,帮助大家对相关内容的理解更加深入. < 数据可视化是任何数据科学或机器学习项目的一个重要组成部分 ...

  2. Python数据分析中的数据预处理:数据标准化

    [小白从小学Python.C.Java] [Python全国计算机等级考试] [Python数据分析考试必会题] ● 标题与摘要 Python数据分析中的 数据预处理:数据标准化 ● 选择题 以下关于 ...

  3. 工业制造中的大数据分析应用_工业大数据分析方案-美林数据

    认识工业大数据 什么是工业大数据? 我们先看看维基百科的说法:"工业大数据(Industrialbig data)是构成工业人工智能的重要元素,指由工业设备高速产生的大量数据,对应不同时间下 ...

  4. 大数据分析如何保证数据质量

    平时企业都会处理数据质量的问题,越来越能够懂得数据库整套系统的运行模式和模型概念,深深觉得数据挖掘的本质其实不仅仅是从海量的数据中发现有效的,有用的,有目的性的数据,深入来说,如果大数据平台里的数据质 ...

  5. 【TL第二期】动手学数据分析-第二章 数据预处理

    文章目录 第二章 第一节 数据清洗及特征处理 第二节 数据重构1 第三节 数据重构2 第四节 数据可视化 第二章 第一节 数据清洗及特征处理 数据清洗:对于原始数据中的缺失值.异常值进行处理.相当于数 ...

  6. HIT-大数据分析Lab1:数据预处理-实验记录

    本文是哈工大大数据分析实验1的完整实验记录,包含环境配置,相关知识介绍以及实验解析.希望对后来人有帮助(新手小白没什么头绪,走一步查一步对应的博客o(╥﹏╥)o),博客链接之间会穿插一些我自己的理解, ...

  7. 大数据分析与实践 使用Python以UCI心脏病数据集为例,进行数据简单分析

    目录: 模型介绍 题目: 处理一下数据 1. 求心脏病患者年龄的平均值.中位数和众数,从结果里分析年龄与心脏病的关系 2. 胆固醇正常值是0-200mg/dL,区分胆固醇不合格和不合格人员,用百分位数 ...

  8. 大数据项目实训总结_大数据分析处理实践的一点心得

    最近的项目中,需要对海量的原始数据进行加工处理.并且数据的来源也不尽相同,数据处理链条很长.针对这种实际应用中的场景,有几点小小的新的体会,特意总结一下. 1.最重要的是,编码之前尽可能多地搞清楚原始 ...

  9. MATLAB数据分析与挖掘 --数据预处理篇

    数据清洗 主要工作是删除原始数据集中的无关数据.重复数据.平滑噪声数据,筛选掉与挖掘主题无关的数据,处理缺失值.异常值等. 缺失值处理: 一般可删除记录.数据插补和不处理.数据插补常用方法如下: 其中 ...

最新文章

  1. R语言使用table1包绘制(生成)三线表、使用单变量分列构建三线表、设置transpose参数转置三线表、变量作为列,子组(strata)作为行
  2. 章节之外:makefile中的函数定义
  3. microsoft 官方学习资源
  4. 杭电oj2043密码
  5. linux freopen函数
  6. 使用NFC读卡器ACR122u读取银行卡信息
  7. 清华EMBA课程系列思考之十七(1) -- 新企业的孵化与创业投资
  8. 火狐浏览器50Linux32位,火狐浏览器32位完整离线安装包下载
  9. NYOJ 吃土豆(动态规划)
  10. 腾讯地图定位 代码
  11. 最简单日柱推算法_干支记日推算方法揭秘
  12. 日历插件(项目总结)(包括mobiscroll.js LCalendar 和Calendar这三个日历插件)
  13. Chromium for windows (2015)
  14. 愿你编码半生,归来仍是少年
  15. srg2220_华为SRG2200路由器系列配置说明
  16. 有苦有乐的算法 --- 可能有环也可能无环的两个单链表,判断这两个链表是否相交,如果相交返回相交的第一个节点
  17. 透明度百分比8位色值
  18. CSU 1596: Dick.Z 的炉石赛(模拟)
  19. 爬虫-requests库(二)get请求参数的使用 —搜狗搜索后爬取搜索结果
  20. Linux学习 第一期 Ubuntu入门篇

热门文章

  1. matlab 生成Blocks和Heavysine等典型非线性非平稳信号代码
  2. 2种js动态绑定事件方法
  3. “华为杯”第一届中国研究生网络安全创新大赛
  4. 仿qq聊天程序设计之借鉴
  5. python 文件命令_python中写入文件数据及文件定位操作命令
  6. 脑动力PHP函数速查效率手册pdf
  7. GCC NOT FOUNT
  8. mysql复制--主从复制配置
  9. 地球气候系统模式cesm的基本运行流程
  10. HDFS集群内文件移动的Java实现