数据降维

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

降维的目的:

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

常见降维模型

  • 主成分分析(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. 第五章——Pytorch中常用的工具

    2018年07月07日 17:30:40 __矮油不错哟 阅读数:221   1. 数据处理 数据加载 ImageFolder DataLoader加载数据 sampler:采样模块 1. 数据处理 ...

  2. c指针(1)

    #include<stdio.h> void swap(int *a,int *b); void dummy_swap(int *a,int *b); int main() { ,d=; ...

  3. 初次运行Git前的配置

    初次运行Git前的配置 一.初次运行 Git 前的配置 一般在新的系统上,我们都需要先配置下自己的 Git 工作环境.配置工作只需一次,以后升级时还会沿用现在的配置.当然,如果需要,你随时可以用相同的 ...

  4. tf.boolean_mask

    tf.boolean_mask 的作用是 通过布尔值 过滤元素 def boolean_mask(tensor, mask, name="boolean_mask", axis=N ...

  5. 吴裕雄--天生自然 JAVA开发学习:包(package)

    package pkg1[.pkg2[.pkg3…]]; package net.java.util; public class Something{ ... } package animals; i ...

  6. Opencv笔记(十七)——轮廓性质

    边界矩形的宽高比 x,y,w,h = cv2.boundingRect(cnt) aspect_ratio = float(w)/h Extent Extent就是轮廓面积与边界矩形面积的比. are ...

  7. 【Java杂货铺】JVM#Class类结构

    代码编译的结果从本地机器码转为字节码,是储存格式发展的一小步,却是编程语言的一大步.--<深入理解Java虚拟机> 计算机只认识0和1.所以我们写的编程语言只有转义成二进制本地机器码才能让 ...

  8. linux下特殊命令集锦

    1.ifconfig -a | grep enp0 | cut -d : -f 1   //按照:进行切割网络文件名 如:ifconfig `ifconfig -a | grep enp0 | cut ...

  9. [USACO09DEC]音符Music Notes (二分、STL)

    https://www.luogu.org/problem/P2969 题目描述 FJ is going to teach his cows how to play a song. The song ...

  10. 吴裕雄--天生自然 JAVA开发学习:文档注释

    /*** 这个类绘制一个条形图 * @author runoob * @version 1.2 */ import java.io.*; /** * 这个类演示了文档注释 * @author Ayan ...