数据降维

降维是对数据高维度特征的一种预处理方法。降维是将高维度的数据保留下最重要的一些特征,去除噪声和不重要的特征,从而实现提升数据处理速度的目的。在实际的生产和应用中,降维在一定信息损失范围内,可以为我们节省大量的时间和成本。降维也称为了应用非常广泛的数据预处理方法。

降维的目的:

  • 使得数据更容易使用
  • 确保变量相互独立
  • 降低很多算法的计算开销
  • 去除噪音
  • 使得结果易懂,已解释

常见降维模型

  • 主成分分析(Principal Components Analysis)
  • 因子分析(Factor Analysis)
  • 独立成分分析(Independ Component Analysis, ICA)

主成分分析

思想

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

原理

  1. 找出第一个主成分的方向,也就是数据方差最大的方向。
  2. 找出第二个主成分的方向,也就是数据方差次大的方向,并且该方向与第一个主成分方向正交(orthogonal 如果是二维空间就叫垂直)。
  3. 通过这种方式计算出所有的主成分方向。
  4. 通过数据集的协方差矩阵及其特征值分析,我们就可以得到这些主成分的值。
  5. 一旦得到了协方差矩阵的特征值和特征向量,我们就可以保留最大的 N 个特征。这些特征向量也给出了 N 个最重要特征的真实结构,我们就可以通过将数据乘上这 N 个特征向量 从而将它转换到新的空间上。

算法

  • 输入:$m$ 个 $n$ 维样本数据 $D = (x^{(1)}, x^{(2)}, ldots, x^{(m)})$
  • 输出:$m$ 个 $k$ 维样本数据
  1. 对样本集进行标准化;
  2. 计算样本的协方差矩阵 $XX^{T}$;
  3. 对协方差矩阵进行特征分解,得到 $n$ 个特征向量和其对应的特征值;
  4. 取出最大的 $k$ 个特征值对应的特征向量 $(omega_1, omega_2, ldots, omega_k)$,将所有的特征向量标准化后,组成特征向量矩阵 $W$;
  5. 对样本集中每一个样本 $x^{(i)}$,转化为新的样本 $z^{(i)}=W^{T}x^{(i)}$
  6. 得到输出的样本数据 $D_{pca} = (z^{(1)}, z^{(2)}, ldots, z^{(m)})$

优缺点

  • 优点:降低数据复杂性,识别最终要的多个特征
  • 缺点:
    • 可能损失有用信息
    • 只适用于数值型数据

算法实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27大专栏  主成分分析(PCA)模型概述br/>28
29
30
31
32
33
34
35
36
37
38
39
# -*- coding: utf-8 -*-

import numpy as np
import pandas as pd def (fileName, delim = "t"):
data = pd.read_csv(fileName, sep = delim, header = None) return np.mat(data) def PCA(dataMat, topNfeat = 9999999):
meanVals = np.mean(dataMat, axis = 0)
meanRemoved = dataMat - meanVals # 标准化
covMat = np.cov(meanRemoved, rowvar = 0) # 计算样本协方差矩阵
eigVals, eigVects = np.linalg.eig(np.mat(covMat)) # 对样本协方差矩阵进行特征分解,得到特征向量和对应的特征值
eigValInd = np.argsort(eigVals) # 对特征值进行排序
eigValInd = eigValInd[:-(topNfeat + 1):-1] # 取最大的topNfeat个特征向量对应的index序号
redEigVects = eigVects[:, eigValInd] # 根据取到的特征值对特征向量进行排序
lowDDataMat = meanRemoved * redEigVects # 降维之后的数据集
reconMat = (lowDDataMat * redEigVects.T) + meanVals # 新的数据空间 return lowDDataMat, reconMat def show_picture(dataMat, reconMat):
fig = plt.figure()
ax = fig.add_subplot(111)
ax.scatter(dataMat[:, 0].flatten().A[0], dataMat[:, 1].flatten().A[0], marker='^', s=90,c='green')
ax.scatter(reconMat[:, 0].flatten().A[0], reconMat[:, 1].flatten().A[0], marker='o', s=50, c='red')
plt.show() def main():
data = loadData(fileName = "PCA.txt", delim = "t")
lowDDataMat, reconMat = PCA(data, 1)
show_picture(data, reconMat) if __name__ == "__main__":
main()

主成分分析(PCA)模型概述的更多相关文章

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

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

  2. 线性判别分析(LDA), 主成分分析(PCA)及其推导【转】

    前言: 如果学习分类算法,最好从线性的入手,线性分类器最简单的就是LDA,它可以看做是简化版的SVM,如果想理解SVM这种分类器,那理解LDA就是很有必要的了. 谈到LDA,就不得不谈谈PCA,PCA ...

  3. 机器学习 —— 基础整理(四)特征提取之线性方法:主成分分析PCA、独立成分分析ICA、线性判别分析LDA

    本文简单整理了以下内容: (一)维数灾难 (二)特征提取--线性方法 1. 主成分分析PCA 2. 独立成分分析ICA 3. 线性判别分析LDA (一)维数灾难(Curse of dimensiona ...

  4. 机器学习课程-第8周-降维(Dimensionality Reduction)—主成分分析(PCA)

    1. 动机一:数据压缩 第二种类型的 无监督学习问题,称为 降维.有几个不同的的原因使你可能想要做降维.一是数据压缩,数据压缩不仅允许我们压缩数据,因而使用较少的计算机内存或磁盘空间,但它也让我们加快 ...

  5. 机器学习降维方法概括, LASSO参数缩减、主成分分析PCA、小波分析、线性判别LDA、拉普拉斯映射、深度学习SparseAutoEncoder、矩阵奇异值分解SVD、LLE局部线性嵌入、Isomap等距映射

    机器学习降维方法概括   版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u014772862/article/details/52335970 最近 ...

  6. SciKit-Learn 可视化数据:主成分分析(PCA)

    ## 保留版权所有,转帖注明出处 章节 SciKit-Learn 加载数据集 SciKit-Learn 数据集基本信息 SciKit-Learn 使用matplotlib可视化数据 SciKit-Le ...

  7. 运用sklearn进行主成分分析(PCA)代码实现

    基于sklearn的主成分分析代码实现 一.前言及回顾 二.sklearn的PCA类介绍 三.分类结果区域可视化函数 四.10行代码完成葡萄酒数据集分类 五.完整代码 六.总结 基于sklearn的主 ...

  8. 深度学习入门教程UFLDL学习实验笔记三:主成分分析PCA与白化whitening

    主成分分析与白化是在做深度学习训练时最常见的两种预处理的方法,主成分分析是一种我们用的很多的降维的一种手段,通过PCA降维,我们能够有效的降低数据的维度,加快运算速度.而白化就是为了使得每个特征能有同 ...

  9. CSS 盒子模型概述

    一.简介   CSS 盒子模型(元素框)由元素内容(content).内边距(padding).边框(border).外边距(margin)组成.     盒子模型,最里面的部分是实际内容:直接包围内 ...

随机推荐

  1. UML-如何画通信图?

    1.链 2.消息 3.自身传递消息 4.消息顺序编号 5.有条件消息 6.互斥的有条件消息 7.循环或迭代 8.调用静态方法 9.多态 10.同步和异步调用

  2. 线段树、最短路径、最小生成树、并查集、二分图匹配、最近公共祖先--C++模板

    线段树(区间修改,区间和): #include <cstdio> #include <iostream> #include <cstring> using name ...

  3. JS中的7种设计模式

    第九章Refactoring to OOP Patterns 重构为OOP模式 7种设计模式: 1,模版方法模式(template method) 2,策略模式(strategy) 3,状态模式(st ...

  4. 第二代网关GateWay搭建流程

    Spring Cloud第二代网关GateWay是由纯Netty开发,底层为Reactor,WebFlux构建,不依赖任何Servlet容器,它不同于Zuul,使用的是异步IO,性能较Zuul提升1. ...

  5. vue项目打包部署elementUI的字体图标丢失问题

    自己搭建的Vue项目,没有使用vue-cli,引入elementUI时,使用的是webpack直接打包工具,发现字体图标丢失你 记录一下解决办法: webpack module配置:(build目录下 ...

  6. Matlab高级教程_第三篇:Matlab转码C/C++方式(混编)_第二部分

    这一部分通过一些实例来进行转码和调试的讲解: 1. 输入变量.输出变量和过程内变量的内存预分配 函数代码:函数名test function [A,B] = test( mark,num,array ) ...

  7. 2019-2020-1 20199324《Linux内核原理与分析》第四周作业

    第三章 MenuOs的构造 一.知识点总结 计算机的三大法宝: 存储程序计算机 函数调用堆栈 中断 操作系统的两把宝剑: 中断上下文的切换(保存现场和恢复现场) 进程上下文的切换 它们都和汇编语言有着 ...

  8. java调用IPFS去中心化体系

    Maven pom.xml引入 <repositories> <repository> <id>jitpack.io</id> <url>h ...

  9. LGOJ3975 TJOI2015 弦论

    link:TJOI2015 弦论 题目大意: 给定一个字符串,输出在对该字符串所有的非空子串排序后第\(k\)个 另外的一个限制是\(T\):子串本质相同但位置不同算\(1\)或多个 \(|s| \l ...

  10. pytorch源码解析-动态接口宏

    动态库接口定义: gcc: 定义在动态库的显示属性: 作用对象: 函数.变量.模板以及C++类 default: 表示在动态库内可见 hidden: 表示不可见 #define EXPORT __at ...