前言

为什么要进行数据降维?直观地好处是维度降低了,便于计算和可视化,其深层次的意义在于有效信息的提取综合及无用信息的摈弃,并且数据降维保留了原始数据的信息,我们就可以用降维的数据进行机器学习模型的训练和预测,但将有效提高训练和预测的时间与效率。

降维方法分为线性和非线性降维,非线性降维又分为基于核函数和基于特征值的方法(流形学习),代表算法有线性降维方法:PCA  ICA LDA  LFA

基于核的非线性降维方法KPCA  KFDA

流形学习:ISOMAP  LLE  LE LPP

本文主要对线性降维方法中的PCA、ICA、LDA的Python实现进行讲解。

请注意本文将不对各种数据降维方法的原理与理论推导过程做过多的讲解,旨在用尽可能少的语言说清楚以及如何用Python实现,先实现再理解,并在读完代码之后自行查阅相关文献理解其不同的思想。但读者应具有一定的统计学、代数学、机器学习的基础。

主成分分析PCA

主成分分析(Principal Component Analysis),是一种常用的数据降维方法。通过正交变换将一组可能存在相关性的变量转换为一组线性不相关的变量,转换后的这组变量就叫主成分。关于主成分分析的思想与理论推导过程在互联网上很容易找到完美的证明,用人话说来就是找到一个轴,将你的数据映射到这个轴上之后所计算的方差最大,再换句人话说就是从原始数据的一堆变量中提取出一部分变量,而这部分变量能完美解释原始数据中包含的信息(或保留原始的数据特性)

注意:进行主成分分析前需对数据进行归一化处理

PCA流程:对数据行归一化处理

计算归一化后的数据集的协方差矩阵与其特征值、特征向量

对特征值从大到小排序并保留最大的个特征向量

将数据转换到个特征向量构建的新空间中

优点:无参数限制

提取了主要信息并且结果容易理解

缺点:方差小的主成分可能含有对样本差异的重要信息

在某些情况下,PCA方法得出的主元可能并不是最优的

相关Python代码

sklearn.decomposition.PCA

Python实现示例(已注释)

#来看个官网最简单的例子

>>>import numpy as np

>>>from sklearn.decomposition import PCA

#创建数据 矩阵形式

>>>X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])

#设定两个主成分

>>>pca = PCA(n_components=2)

#用X训练

>>>pca.fit(X)

PCA(n_components=2)

#查看每个主成分解释程度

>>>print(pca.explained_variance_ratio_)

[0.9924... 0.0075...]

>>>print(pca.singular_values_)

[6.30061... 0.54980...]

#降维

>>>pca = PCA(n_components=1, svd_solver='arpack')

>>>pca.fit(X)

PCA(n_components=1, svd_solver='arpack')

>>>print(pca.explained_variance_ratio_)

[0.99244...]

>>>print(pca.singular_values_)

[6.30061...]

线性判别分析LDA

线性判别分析(Linear Discriminant Analysis)是一种有监督的(supervised)线性降维算法。与PCA保持数据信息不同,LDA的核心思想:往线性判别超平面的法向量上投影,使得区分度最大(高内聚,低耦合)。LDA是为了使得降维后的数据点尽可能地容易被区分!

与PCA比较PCA为无监督降维,LDA为有监督降维

LDA降维最多降到类别数K-1的维数,PCA没有这个限制。

PCA希望投影后的数据方差尽可能的大(最大可分性),而LDA则希望投影后相同类别的组内方差小,而组间方差大。

相关Python代码

sklearn.discriminant_analysis.LinearDiscriminantAnalysis

Python实现示例(已注释)

import numpy as np

import matplotlib.pyplot as plt

from mpl_toolkits.mplot3d import Axes3D

%matplotlib inline

from sklearn.datasets.samples_generator import make_classification

#生成数据

X, y = make_classification(n_samples=1000, n_features=3, n_redundant=0, n_classes=3, n_informative=2,

n_clusters_per_class=1,class_sep =0.5, random_state =10)

#LDA降维

from sklearn.discriminant_analysis import LinearDiscriminantAnalysis

lda = LinearDiscriminantAnalysis(n_components=2)

lda.fit(X,y)

X_new = lda.transform(X)

plt.scatter(X_new[:, 0], X_new[:, 1],marker='o',c=y)

plt.show()

独立成分分析ICA

独立成分分析(Independent component analysis)是一种利用统计原理进行计算的方法,它是一个线性变换,这个变换把数据或信号分离成统计独立的非高斯的信号源的线性组合。之前介绍的PCA、LDA都是以观测数据点呈高斯分布模型为基本假设前提的,而ICA将适用于非高斯分析数据集,是PCA的一种有效扩展。

与PCA比较ICA寻找的是最能使数据的相互独立的方向,而PCA仅要求方向是不相关的

PCA认为主元之间彼此正交,样本呈高斯分布;ICA则不要求样本呈高斯分布

相关Python代码

sklearn.decomposition.FastICA

Python实现示例(已注释)

import numpy as np

import matplotlib.pyplot as plt

from scipy import signal

from sklearn.decomposition import FastICA, PCA

# 生成观测模拟数据

np.random.seed(0)

n_samples = 2000

time = np.linspace(0, 8, n_samples)

s1 = np.sin(2 * time) # 信号源 1 : 正弦信号

s2 = np.sign(np.sin(3 * time)) # 信号源 2 : 方形信号

s3 = signal.sawtooth(2 * np.pi * time) # 信号源 3: 锯齿波信号

S = np.c_[s1, s2, s3]

S += 0.2 * np.random.normal(size=S.shape) # 增加噪音数据

S /= S.std(axis=0) # 标准化

# 混合数据

A = np.array([[1, 1, 1], [0.5, 2, 1.0], [1.5, 1.0, 2.0]]) # 混合矩阵

X = np.dot(S, A.T) # 生成观测信号源

# ICA模型

ica = FastICA(n_components=3)

S_ = ica.fit_transform(X) # 重构信号

A_ = ica.mixing_ # 获得估计混合后的矩阵

# PCA模型

pca = PCA(n_components=3)

H = pca.fit_transform(X) # 基于PCA的成分正交重构信号源

# 图形展示

plt.figure()

models = [X, S, S_, H]

names = ['Observations (mixed signal)',

'True Sources',

'ICA recovered signals',

'PCA recovered signals']

colors = ['red', 'steelblue', 'orange']

for ii, (model, name) in enumerate(zip(models, names), 1):

plt.subplot(4, 1, ii)

plt.title(name)

for sig, color in zip(model.T, colors):

plt.plot(sig, color=color)

plt.subplots_adjust(0.09, 0.04, 0.94, 0.94, 0.26, 0.46)

plt.show()

python降维将多列数据压缩为一列_使用Python进行数据降维|线性降维相关推荐

  1. python降维将多列数据压缩为一列_Python机器学习(Sebastian著 ) 学习笔记——第五章通过降维压缩数据(Windows Spyder Python 3.6)...

    数据压缩是机器学习领域中重要的内容,通过数据压缩技术可以将原始数据集变换到一个维度更低的新的特征子空间,帮助对数据存储和分析. 降维压缩数据,分为无监督和有监督两类,先来介绍无监督数据压缩--主成分分 ...

  2. R语言tidyr包Unite()函数实战详解:多个数据列合并为一列

    R语言tidyr包Unite()函数实战详解:多个数据列合并为一列 目录 R语言tidyr包Unite()函数实战详解:多个数据列合并为一列

  3. Excel 两列合并为一列中间加空格

    Excel 两列合并为一列中间加空格 需求:,在C1,C2中得到22 33,33 44. 步骤: 1.点击C列,在上方输入框中输入 =A1&" "&B1 得到 2. ...

  4. 数据预处理-Excel 两列合并为一列中间加空格

    一:问题描述 把Excel中两列数据合并为一列,并且以空格隔开. 二:方法一 把Excel中的两列数据复制粘贴到txt文本文档中,再从txt文本文档中把数据粘贴到excel中的某一列. [注意]:数据 ...

  5. SQL将两列合并为一列

    SQL将两列合并为一列: 结构: select cast(列名 as 类型) + cast(列名 as 类型) as 新列名称 from 表 select (CAST( FirstName as nv ...

  6. mysql 多列合并为一列_多列数据合并一列,还在用数据透视就out了,用=号只要三步完成...

    以前我们经常使用Excel表格进行数据分类,比如将多列的数据合并到一列当中,这个时候我们会使用数据透视表.函数等多种方法来操作.今天我们就来学习,如何利用一个=号,快速将多列数据合并为一列. 如上图所 ...

  7. sqlserver 如何把一列分为一行显示_EXCEL神乎其技 多列追加为一列

    甲纯们在工作中,可能会经常遇到要把多列数据,以追加的形式,凑成一列的情况. 现如今20后都跑出来了,难道还要用拷贝粘贴的原始方法?! 纯老师对此研发了操作简单.适用性好的小程序,供甲纯们参考使用. 本 ...

  8. python按某列拆分excel表格_利用Python+Pandas实现从一个excel表中提取列形成新表

    简要 利用python实现把一个工作表中的某些列,和其中单独的一列,提取成为一个个新表. 如图(处理前)蓝色部分是需要保留的列,红色是需要一项一项分出来作为单独表格的列. 其中,第一行的名字是用的回车 ...

  9. Mysql 多列合并为一列

    如下表结构: 子表: 双表查询: 映射了多行数据,而实际情况下,只想把这些数据给进行合并,可以采用GROUP_CONCAT()函数: select fc.*,GROUP_CONCAT(fb.from_ ...

最新文章

  1. 我国北斗卫星导航系统在轨卫星已达39颗
  2. response.setHeader()的用法
  3. html 获取鼠标在canvas上的坐标,html5-canvas 检测鼠标在画布上的位置
  4. Tomcat显示文件列表
  5. Java关键字:final,static,this,super
  6. .net winform 的 OnKeyDown 与 方向键
  7. strak组件(5):为列表定制预留钩子方法
  8. el 能否定义作用域变量_JS块级作用域和let,const,var区别
  9. 戴尔服务器进入pxe启动
  10. 服务器win2003系统升级,Windows server 2003 升级 到2008 R2
  11. Gym 101778G
  12. Matlab中fit函数的局限以及其解决方案
  13. 近期研究方向 (内部参考)
  14. 小型电子管通用计算机103机,中国第一台电脑
  15. 三进网吧后,我“被跳槽”了!
  16. 微信扫码支付模式一提示系统繁忙
  17. oracle云怎么购买,使用免费的Oracle云服务-创建云主机
  18. 最近想到的一些事情。
  19. Java SE 网络编程
  20. Cobalt Strike使用详解

热门文章

  1. https nginx 换成其他端口_nginx 80端口下HTTPS请求跳转到指定其他端口
  2. 开箱评测:双十一刚买的云服务器,到底好不好用?
  3. 处理硬盘物理坏道方法
  4. 干货分享|巧用CSS滤镜绘制安卓手机充电动效(uni-app|view组件版)
  5. 计算机网络布线画图软件,一种计算机网络布线辅助工具的制作方法
  6. Linux中一个ip绑定多个域名的详细步骤
  7. 从咸鱼到offer收割机,30天逆袭详细过程!
  8. 数据库存储过程(全网最全)
  9. 【JavaEE基础与高级 第1章】— 基础知识1初识JavaEE
  10. H5微信分享接口开发JS-SDK PHP[附源码]