PCA 这类的降维算法, 我算是接触好几年了有, 从我学营销的时候, 市场研究方面就经常会用到,相关的还有 "因子分析" 比如, 商品形象认知, 客户细分等场景.

其实多年前我就能够推导了. 当时还从看多元统计的时候, 参数化, 最优化, 引入拉格朗日乘子, 矩阵分解啥的....蛮学术化的, 因为我是学文科的, 理解起来, 真的非常缓慢, 经常去图书馆查资料...而且涉及知识也蛮多.. 差不多大半年我才有所理解哦, 也是真的感慨:

故余虽愚, 卒获有所未闻.

耐心和恒心, 总会获得回报的.

真正理解 PCA 是理解 矩阵的本质是线性变换, 然后工作一段时间后, 才真正对这些概念从认识上, 实践上, 加入认知, 现在倒是随便玩都行.

  • 降维;
  • 协方差矩阵;
  • 特征分解;

前面有一张图, 写的是如何从不那么学术的视角, 从可编程的视角来理解 PCA 的, 当然默认大家是对 矩阵特别熟, 不熟那就没办法了. 就像我小伙伴说, 它想写个软件, 但他说他不会编程.. 那就根本不具备条件, 没办法玩下去了..

PCA 理解

从线性代数的角度, 真的, 很多问题, 会很容易理解, 不要总是试图从微积分来认识.世界是很大的哦.

PCA 实现

从栗子的角度来实现, 我觉得这样算是非常通俗易懂了.

import numpy as np 

# 原始数据
X = np.array([
[90, 60, 90],
[90, 90, 30],
[60, 60, 60],
[60, 60, 90],
[30, 30, 30]
]) # 该数据有 3个特征, 我想降维到 2个特征
# 约束是 方差尽可能大(保留更多的原始信息)
1. 随机向量的中心: \(E(X_i - \mu_i)\) i=1...p个特征, 即随机矩阵的每个分量, 的中心, 所组成的向量
# 1. 求随机向量的 X 的中心(向量) (每列的均值)
center = np.average(X, axis=0) print('随机向量的中心为:', center)
随机向量的中心为: [66. 60. 60.]
2. 对样本矩阵 X 进行中心化 ( 每个值到 各自(列) 中心的距离)
# 2. 对 X 进行中心化
ret = []
for i in range(X.shape[1]):
ret.append(X[:, i] - center[i]) # 垂直拼接
X_center = np.vstack(ret).T print('中心化后的样本:\n', X_center)
中心化后的样本:
[[ 24. 0. 30.]
[ 24. 30. -30.]
[ -6. 0. 0.]
[ -6. 0. 30.]
[-36. -30. -30.]]
3. 计算随机向量 X 的协方差矩阵: \(\Sigma = \frac{1}{n-1} XX^T\) (X 是已经 中心化 后的)

随机向量 X, 其实就是一个矩阵呀

# 3. 计算协方差
X_cov = X_center.T.dot(X_center) / (X.shape[0] -1) print("中心化后的样本的协方差矩阵为:\n", X_cov)
中心化后的样本的协方差矩阵为:
[[630. 450. 225.]
[450. 450. 0.]
[225. 0. 900.]]
4. 对协方差矩阵进行 特征分解
# 特征分解
特征值, 特征向量 = np.linalg.eig(X_cov) print('协方差阵的特征值为:', 特征值)
print("特征值对应-特征向量为:\n", 特征向量)
协方差阵的特征值为: [  56.02457535 1137.5874413   786.38798335]
特征值对应-特征向量为:
[[ 0.6487899 -0.65580225 -0.3859988 ]
[-0.74104991 -0.4291978 -0.51636642]
[-0.17296443 -0.62105769 0.7644414 ]]

假设特征值是升序排列, 真实不是, 暂时没写, 然后降维

# 5. 坐标旋转, 假设这里是从 3维降到 2 维
# 旋转矩阵
rotate_matrix = 特征向量[:, 1:3]
# 降维
print('从3维降到2维:\n', X.dot(rotate_matrix))
从3维降到2维:
[[-140.6692628 3.07784927]
[-116.28173533 -58.27962721]
[-102.36346447 -8.27542884]
[-120.99519515 14.65781313]
[ -51.18173223 -4.13771442]]

小结: PCA 降维的核心, 其实就是 "坐标轴旋转", 然后这个过程, 可以用 一个 旋转矩阵 来描述. 然后是一通推导, 得出 这个旋转矩阵, 恰好是 协方差矩阵的特征分解后的, 特征向量组成的 矩阵, 构成的. 或者说是, 选择 特征较大 的特征向量方向进行投影, 一样道理.

推导过程, 从矩阵变换, 矩阵分解的本质上, 来推导, 会比通过, 参数化, 然后最优化问题来解, 更直观和可编程. 起码不用思考, 怎么去代码实现 拉格朗日乘子...

彻底掌握 PCA 降维的更多相关文章

  1. [综] PCA降维

    http://blog.json.tw/using-matlab-implementing-pca-dimension-reduction 設有m筆資料, 每筆資料皆為n維, 如此可將他們視為一個mx ...

  2. 机器学习公开课笔记(8):k-means聚类和PCA降维

    K-Means算法 非监督式学习对一组无标签的数据试图发现其内在的结构,主要用途包括: 市场划分(Market Segmentation) 社交网络分析(Social Network Analysis ...

  3. Python机器学习笔记 使用scikit-learn工具进行PCA降维

    之前总结过关于PCA的知识:深入学习主成分分析(PCA)算法原理.这里打算再写一篇笔记,总结一下如何使用scikit-learn工具来进行PCA降维. 在数据处理中,经常会遇到特征维度比样本数量多得多 ...

  4. PCA降维—降维后样本维度大小

    之前对PCA的原理挺熟悉,但一直没有真正使用过.最近在做降维,实际用到了PCA方法对样本特征进行降维,但在实践过程中遇到了降维后样本维数大小限制问题. MATLAB自带PCA函数:[coeff, sc ...

  5. 一步步教你轻松学主成分分析PCA降维算法

    一步步教你轻松学主成分分析PCA降维算法 (白宁超 2018年10月22日10:14:18) 摘要:主成分分析(英语:Principal components analysis,PCA)是一种分析.简 ...

  6. 【资料收集】PCA降维

    重点整理: PCA(Principal Components Analysis)即主成分分析,是图像处理中经常用到的降维方法 1.原始数据: 假定数据是二维的 x=[2.5, 0.5, 2.2, 1. ...

  7. 第四章 PCA降维

    目录 1. PCA降维 PCA:主成分分析(Principe conponents Analysis) 2. 维度的概念 一般认为时间的一维,而空间的维度,众说纷纭.霍金认为空间是10维的. 3. 为 ...

  8. PCA 降维算法详解 以及代码示例

    转载地址:http://blog.csdn.net/watkinsong/article/details/38536463 1. 前言 PCA : principal component analys ...

  9. [学习笔记] numpy次成分分析和PCA降维

    存个代码,以后参考. numpy次成分分析和PCA降维 SVD分解做次成分分析 原图: 次成分复原图: 代码: import numpy as np from numpy import linalg ...

  10. 关于PCA降维中遇到的python问题小结

    由于论文需要,开始逐渐的学习CNN关于文本抽取的问题,由于语言功底不好,所以在学习中难免会有很多函数不会用的情况..... ̄へ ̄ 主要是我自己的原因,但是我更多的把语言当成是一个工具,需要的时候查找就 ...

随机推荐

  1. 5分钟搞定!用比扬云SD-WAN远程访问飞牛NAS全攻略

    作为一个NAS重度用户,我最近遇到了一个头疼的问题:如何在外部安全地访问家里的飞牛NAS?经过一番摸索,我发现比扬云SD-WAN是个不错的解决方案,今天就来分享我的实战经验. 一.为什么选择比扬云SD ...

  2. python基础-元组-集合-字典

    元组 概念 元组:由一系列变量组成的不可变序列容器 序列:支持索引和切片 不可变:1.没有增删改的方法 2.所有的操作都不会直接作用于原数据 定义 <span style="font- ...

  3. 《<吕氏春秋> 刘本》

    <<吕氏春秋> 刘本>(卷三) 编者 刘昱合 其他版本 <吕氏春秋>(卷一) <吕氏春秋>(卷二) <<吕氏春秋> 全本>(卷三 ...

  4. JS实现隐藏手机号码中间4位数

    代码COPY 3. 使用正则 function geTel(tel){ var reg = /^(\d{3})\d{4}(\d{4})$/; return tel.replace(reg, " ...

  5. Vitepress+EdgeOne Pages快速迁移旧网站内容

    Vitepress+EdgeOne Pages快速迁移旧网站内容 目录 Vitepress+EdgeOne Pages快速迁移旧网站内容 下载旧网站文章.图片 网站文章转Markdown Vitepr ...

  6. pikachu搭建

    pikachu靶场搭建教程 下载小皮面板phpstudy: 小皮官网:https://www.xp.cn/ 下载pikachu : https://github.com/zhuifengshaonia ...

  7. wordpress设置自定义字体

    wordpress设置自定义字体: 失败的操作过程: 写在最前:试了一天多的引用字体,方法包括但不限于: 下载.ttf..otf格式字体,转化为wotf .wotf2格式,挂在github仓库用CDN ...

  8. TPC-H 研究和优化尝试

    TPC-H测试提供了8张表,最近做这个测试,记录下过程中的关键点备忘. 1.整体理解TPC-H 8张表 2.建立主外键约束后测试22条SQL 3.分区表改造,确认分区字段 4.重新测试22条SQL 5 ...

  9. angular双向数据绑定踩坑记:

    在angular中使用ngModel时出现了一个报错error NG8002: Can't bind to 'ngModel' since it isn't a known property of ' ...

  10. php处理跨域

    1.允许所有域名访问 header('Access-Control-Allow-Origin: *'); 2.允许单个域名访问 header('Access-Control-Allow-Origin: ...