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. SpringBoot中使用Netty实现TCP通讯,服务器主动向客户端发送数据

    简述: Springboot项目的web服务后台,web服务运行在9100端口. 后台使用netty实现了TCP服务,运行在8000端口. 启动截图如下:   pom依赖 <dependency ...

  2. Docker 的基本概念和优势,以及在应用程序开发中的实际应用

    Docker是一个开源的容器化平台,它可以将应用程序及其所有依赖关系打包为一个独立的容器,从而实现应用程序的快速部署.可移植性和可扩展性. Docker的基本概念包括以下几个方面: 镜像(Image) ...

  3. 【Matlab】求解复合材料层合板刚度矩阵及柔度矩阵

    1. matlab文件结构 2. main.m代码 clc clear; warning off; %% %铺层角度数组 angles=[0 90 0]; % ° %单层厚度 ply_thicknes ...

  4. 开箱即用的go-zero示例

    一.概述 开箱即用的 go-zero 示例,内置 api.scheduler.queue.script 服务. 框架初始版本基于 go-zero 框架的 1.5.5 版本,后续会参考 go-zero ...

  5. 免费的编程连字等宽字体:Fira Code

    免费的编程连字等宽字体:Fira Code 介绍和特征 介绍 Fira 是 Mozilla 公司 主推的字体系列.Fira Code 专为写程序而生,开源免费.除了具有等宽等基本属性外,还加入了编程连 ...

  6. go time包:秒、毫秒、纳秒时间戳输出

    时间戳 10 位数的是以 秒 为单位: 13 位数的是以 毫秒 为单位: 19 位数的是以 纳秒 为单位: golang 中可以这样写: package main import ( "fmt ...

  7. 入口函数与包初始化:Go程序的执行次序

    前言 我们可能经常会遇到这样一个问题:一个 Go 项目中有数十个 Go 包,每个包中又有若干常量.变量.各种函数和方法,那 Go 代码究竟是从哪里开始执行的呢?后续的执行顺序又是什么样的呢? 事实上, ...

  8. Golang 入门 : 常量

    常量 相对于变量而言,常量是在程序使用过程中,不会改变的数据.有些地方你需要将定义好的常量重复使用,代码中你不允许它的值改变.例如 圆周率 在程序执行过程中不会改变. 常量的声明 const Pi f ...

  9. 查看Unity3D中默认的变量名与按键的映射

    博客地址:https://www.cnblogs.com/zylyehuo/ 选择 Edit/Project Settings/Input Manager 点击 Axes 即可查看对应变量名与按键的映 ...

  10. How to grow old

    An individual human existence should be like a river-small at first,narrowly contained within its ba ...