Pca,Kpca,TSNE降维非线性数据的效果展示与理论解释

  • 前言
  • 一:几类降维技术的介绍
  • 二:主要介绍Kpca的实现步骤
  • 三:实验结果
  • 四:总结

前言

本文主要介绍运用机器学习中常见的降维技术对数据提取主成分后并观察降维效果。我们将会利用随机数据集并结合不同降维技术来比较它们之间的效果。降维技术可以说非常常见的有Pca、Kpca、TSNE、LDA、NMF、神经网络自编码技术等,也是各有各的特点,比较深入且工业上不怎么通用的有密度敏感鲁棒模糊核主成分分析算法(DRF-Kpca)等等,有兴趣的朋友可以查查此类相关文章。这篇文章主要先介绍Pca、Kpca、TSNE这三种方法。

岁月如云,匪我思存,写作不易,望路过的朋友们点赞收藏加关注哈,在此表示感谢!

一:几类降维技术的介绍

由于本篇是应用篇,主要会设计算法介绍与流程,以及实验结果,过多的降维原理不会细致展开。

  • PCA概括

我们主要引用一下百度百科的简洁明了的概括内容。

PCA(principal components analysis)即主成分分析技术,又称主分量分析。主成分分析也称主分量分析,旨在利用降维的思想,把多指标转化为少数几个综合指标。
在统计学中,主成分分析PCA是一种简化数据集的技术。它是一个线性变换。这个变换把数据变换到一个新的坐标系统中,使得任何数据投影的第一大方差在第一个坐标(称为第一主成分)上,第二大方差在第二个坐标(第二主成分)上,依次类推。主成分分析经常用于减少数据集的维数,同时保持数据集的对方差贡献最大的特征。这是通过保留低阶主成分,忽略高阶主成分做到的。这样低阶成分往往能够保留住数据的最重要方面。但是,这也不是一定的,要视具体应用而定。

  • Kpca概括

常见核函数的介绍

核函数 kkk 简单来说是通过内积运算把低维数据映射到高维数据,即 k(x,y)=<φ(x),φ(y)>k(x,y)=<\varphi(x),\varphi(y)>k(x,y)=<φ(x),φ(y)> ,其中 x,yx,yx,y 是低维的输入向量, φ\varphiφ 为低维到高维的映射, <⋅,⋅><\cdot,\cdot><⋅,⋅> 为内积运算。通过升维操作,我们可以很好解决低维的“非线性”问题,最后再降维到我们需要的维度。

现在工程算法上核函数的介绍一般都直接给出个表达式,但是真正基于数学角度触发,核函数很多定义都要加上一些必要的限制,比如“可微、连续、对称、有界、泛函空间”等等(其实很多机器学习(深度学习)算法的真正底层逻辑成立是要很多条件限制才行得通的),由于这里不是存粹数学探讨,我们还是简单概括下。

  1. 线性核函数

k(x,y)=xTy+c,c≥0k(x,y)=x^Ty+c , c\geq0k(x,y)=xTy+c,c≥0 ,主要解决线性可分问题。通过表达式我们可以发现,此时的Kpca降维其实跟传统的Pca没啥区别。

  1. 多项式核函数

k(x,y)=(axTy+c)d,a>0,c≥0,d≥1k(x,y)=(ax^Ty+c)^d , a>0,c\geq0,d\geq1k(x,y)=(axTy+c)d,a>0,c≥0,d≥1 ,这类核函数比较复杂,可以解决非线性问题。

  1. 高斯核函数

k(x,y)=−γ∣∣x−y∣∣2,γ(gamma)=12σ2k(x,y)=-\gamma\left|| x-y \right||^2 , \gamma(gamma)=\frac{1}{2\sigma^2}k(x,y)=−γ∣∣x−y∣∣2,γ(gamma)=2σ21​ 高斯核函数的运用是比较广泛的,这里我们重点说明下几个重要参数。

∣∣⋅,⋅∣∣2||\cdot,\cdot||^2∣∣⋅,⋅∣∣2 :两个向量的2-范数运算,

gamma:gamma越大,高斯分布越窄。gamma越小,高斯分布越宽。gamma相当于调整模型的复杂度,gamma值越小模型复杂度越低,gamma值越高,模型复杂度越大。换句话说当gamma非常大,模型容易过拟合,模型对数据比较敏感,因为分布曲线尖端太“狭窄”,每一个样本点几乎占有独立的分布曲线,分布曲线很难再含有其他样本了,反之亦然。但gamma参数是高斯核的“独特”之处,太小体现不出来高斯核特点,太大容易过拟合,所以在实际运用中(如降维、分类等),可以多次实验发现规律并解决问题。

这里我们我们借鉴下百度图库给的图形,因为 σ\sigmaσ 跟γ\gammaγ 属于倒数关系,可以从图1看出σ\sigmaσ 越大, γ\gammaγ 越小,分布越宽。

图1

  • TSNE概括
  1. SNE算法

SNE的思想是基于在高维空间相似的点,或者离得近的点,那么映射到低维希望也是离得近的点,那整个过程就自然实现了降维。我们也有表达“离得近”的公式来描述,那就是高斯条件概率:pj∣i(x)=exp(−∣∣xi−xj∣∣2/2σi2)∑k≠iexp(−∣∣xi−xk∣∣2/2σi2)p_{j|i}(x)=\frac{exp(-||x_i-x_j||^2/2\sigma_i^2)}{\sum_{k\ne i}{exp(-||x_i-x_k||^2/2\sigma_i^2)}}pj∣i​(x)=∑k​=i​exp(−∣∣xi​−xk​∣∣2/2σi2​)exp(−∣∣xi​−xj​∣∣2/2σi2​)​ ,这里点 xjx_jxj​ 越靠近 xix_ixi​ 时,概率越大;同理降维到低维的数据点 yj,yiy_j,y_iyj​,yi​ 的离得远近也是用高斯概率判定。但是,怎么评判两高斯概率分布相似?我们可以用数理统计的 KLKLKL 散度距离(Kullback-Leibler Divergence)判定,最终的目的就是想把 KLKLKL 的值降到最低。

KLKLKL 散度主要基于理论分布拟合真实分布时产生的信息损耗的期望值,我们用公式表示如下:

DKL(p∣∣q)=E[log2p(x)−log2(q(x))]D_{KL}(p||q)=E[log_2p(x)-log_2(q(x))]DKL​(p∣∣q)=E[log2​p(x)−log2​(q(x))] ,

那么对应的离散形式可以表示为 :

DKL(p∣∣q)=∑i=1Np(xi)(log2p(xi)−log2q(xi))D_{KL}(p||q)=\sum_{i=1}^{N}{p(x_i)}(log_2p(x_i)-log_2q(x_i))DKL​(p∣∣q)=∑i=1N​p(xi​)(log2​p(xi​)−log2​q(xi​)) ,

对应的连续形式可以表示为:

DKL(p∣∣q)=∫−∞+∞p(x)(log2p(x)−log2q(x))dxD_{KL}(p||q)=\int_{-\infty}^{+\infty}p(x)(log_2p(x)-log_2q(x))dxDKL​(p∣∣q)=∫−∞+∞​p(x)(log2​p(x)−log2​q(x))dx ,

这里的 p(xi),q(xi)p(x_i),q(x_i)p(xi​),q(xi​) 就是表示真实和理论上的每个随机变量的概率值。

对于SNE算法,那么当 D=pj∣i(x)D=p_{j|i}(x)D=pj∣i​(x) 时,我们希望存在

D′=pj∣i(y)D^{'}=p_{j|i}(y)D′=pj∣i​(y)使得

minDKL(D∣∣D′)=min∑ij[Dijlog2DijDij′−Dij+Dij′]minD_{KL}(D||D^{'})=min\sum_{ij}\left[ {D_{ij}log_2\frac{D_{ij}}{D_{ij}^{'}}-D_{ij}+D_{ij}^{'}} \right]minDKL​(D∣∣D′)=min∑ij​[Dij​log2​Dij′​Dij​​−Dij​+Dij′​] 存在。

那么每个 yiy_iyi​ 变量的更新如何处理,这就很自然想到梯度下降算法(这里先不展开叙述了)。

  1. TSNE是SNE的升级版

升级主要一是在梯度下降算法中的优化,二是在低维空间用T分布代替高斯分布。

  1. TSNE非常适用于高维数据降维到2维或者3维,进行可视化。

二:主要介绍Kpca的实现步骤

(由于Kpca是Pca的推广,我们略过Pca)

  • 我们先获得一个 m×nm\times nm×n 的数据矩阵( mmm 是样本个数, nnn 是每个样本的特征),
  • 选择相应核函数计算核矩阵,这里的核矩阵计算主要是根据公式k(xi,xj)=<φ(xi),φ(xj)>k(x_i,x_j)=<\varphi(x_i),\varphi(x_j)>k(xi​,xj​)=<φ(xi​),φ(xj​)> 计算,其中 0≤i,j≤m0\leq i,j\leq m0≤i,j≤m ,
  • 根据相应公式计算中心化后的核矩阵 kl=k−l∗k/m−k∗l/m+l∗k∗l/(m∗m)kl =k-l\ast k/m-k*l/m+l*k*l/(m*m)kl=k−l∗k/m−k∗l/m+l∗k∗l/(m∗m) ,lll 是 m×mm\times mm×m 的单位矩阵,
  • 再计算 klklkl 的特征值 λ1,λ2,...λn\lambda_1,\lambda_2,... \lambda_nλ1​,λ2​,...λn​ 和对应的特征向量ν1,ν2,...νn\nu_1,\nu_2,...\nu_nν1​,ν2​,...νn​ ,对特征值按照降序排序展开,与此同时特征向量也随之改变,通过斯密特正交化方法得到单位正交化特征向量 αi,α2,...αn\alpha_i,\alpha_2,...\alpha_nαi​,α2​,...αn​ ,确定主成分的个数 p=∑i=1pλi/∑i=1nλi≥βp=\sum_{i=1}^{p}{\lambda_i}/\sum_{i=1}^{n}{\lambda_i}\geq\betap=∑i=1p​λi​/∑i=1n​λi​≥β ,其中 β\betaβ 的取值根据实际情况来定,一般不小于0.8,
  • 最后我们计算主成分矩阵值: P=kl∗αP=kl\ast\alphaP=kl∗α ,即为降维后的数据。

三:实验结果

Kpca的实现是比较成熟而且步骤不是很复杂,我们不再自己编写,主要是调用相关模块来进行实验。

import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
from sklearn.decomposition import PCA
from sklearn.decomposition import KernelPCA
from sklearn.manifold import TSNEdef circle():fig = plt.figure()ax = fig.add_subplot(111, projection='3d')a1 = 1r1 = 2.5x1 = np.arange(-a1 + 0.5, a1 + 0.5, 0.05)y1 = np.arange(-a1, a1, 0.05)hah = 10np.random.seed(hah)z1 = np.sqrt(r1 ** 2 - x1 ** 2 - y1 ** 2) + np.random.uniform(0,1,len(x1))Z1 = list(z1) + list(-z1)Y1 = list(y1) + list(y1)X1 = list(x1) + list(x1)ax.scatter(X1, Y1, Z1)a2 = 1r2 = 1.75x2 = np.arange(-a2, a2, 0.05)y2 = np.arange(-a2, a2, 0.05)np.random.seed(hah)z2 = np.sqrt(r2 ** 2 - x2 ** 2 - y2 ** 2) + np.random.uniform(0,1,len(x1))Z2 = list(z2) + list(-z2)Y2 = list(y2) + list(y2)X2 = list(x2) + list(x2)ax.scatter(X2, Y2, Z2)ax.set_xlabel('X Label')ax.set_ylabel('Y Label')ax.set_zlabel('Z Label')plt.show()X = X1 + X2Y = Y1 + Y2Z = Z1 + Z2dn = np.array([X, Y, Z]).Tpca = PCA(n_components=2)x_pca = pca.fit_transform(dn)print('pca信息值:', pca.explained_variance_ratio_)plt.figure()plt.scatter(x_pca[:, 0][:int(len(X1))], x_pca[:, 1][:int(len(X1))], color='red', marker='^', alpha=0.5)plt.scatter(x_pca[:, 0][int(len(X2)):], x_pca[:, 1][int(len(X2)):], color='blue', marker='o', alpha=0.5)plt.xlabel('PC1')plt.ylabel('PC2')plt.show()kpca = KernelPCA(n_components=2, kernel='rbf', gamma=20, degree=5)  ###kernel : {'linear', 'poly',  'rbf', 'sigmoid', 'cosine', 'precomputed'}, default='linear'x_kpca = kpca.fit_transform(dn)explained_variance = np.var(x_kpca, axis=0)explained_variance_ratio = explained_variance / np.sum(explained_variance)print('kpca信息值:', explained_variance_ratio)plt.figure()plt.scatter(x_kpca[:, 0][:int(len(X1))], x_kpca[:, 1][:int(len(X1))], color='red', marker='^', alpha=0.5)plt.scatter(x_kpca[:, 0][int(len(X2)):], x_kpca[:, 1][int(len(X2)):], color='blue', marker='o', alpha=0.5)plt.xlabel('PC1')plt.ylabel('PC2')plt.show()tsne = TSNE(n_components=2,metric='euclidean')x_tsne = tsne.fit_transform(dn)explained_variance = np.var(x_tsne, axis=0)explained_variance_ratio = explained_variance / np.sum(explained_variance)print('tsne信息值:', explained_variance_ratio)plt.figure()plt.scatter(x_tsne[:, 0][:int(len(X1))], x_tsne[:, 1][:int(len(X1))], color='red', marker='^', alpha=0.5)plt.scatter(x_tsne[:, 0][int(len(X2)):], x_tsne[:, 1][int(len(X2)):], color='blue', marker='o', alpha=0.5)plt.xlabel('PC1')plt.ylabel('PC2')plt.show()
circle()

图1

图2:Pca

图3:Kpca(gamma=20)

图4:Kpca(gamma=10)

图5:Kpca(gamma=1)

图6:TSNE

从上图3、图4我们可以看出,基于Kpca算法的降维,当核函数取高斯核时,随着gamma的增大,这时候的Kpca算法的特色就显示的淋淋尽致。降维至低维的数据很明显是线性可分的。TSNE得出的结果让低维数据分布的更加集中,但明显线性是不可分的。一般Pca降维非线性数据的效果似乎只是对高维数据做了下在低维空间的投影。

四:总结

这篇文章主要讲述了3种降维技术对非线性数据的降维处理,我们可以感受到Kpca算法在选择恰当的核函数时,会表现出明显的算法特色。普通的Pca技术在处理非线性问题方面,是很难做出相应的优化选择,所以在实际工业中,Kpca算法对于非线性数据的处理,无论是理论上的解释还是实际效果,不失为一种可靠的选择。

Pca,Kpca,TSNE降维非线性数据的效果展示与理论解释相关推荐

  1. PCA与t-SNE降维数据

    PCA 主成分分析(Principal Component Analysis,简称PCA ),是常用的降维方法.PCA是一种线性的降维方法,线性变换的直观表示为: 其中, x \bm{x} x是原始的 ...

  2. python用tsne降维_哈工大硕士实现了 11 种经典数据降维算法,源代码库已开放

    网上关于各种降维算法的资料参差不齐,同时大部分不提供源代码.这里有个 GitHub 项目整理了使用 Python 实现了 11 种经典的数据抽取(数据降维)算法,包括:PCA.LDA.MDS.LLE. ...

  3. 主成分分析旋转矩阵MATLAB实现,R语言高维数据的主成分pca、t-SNE算法降维与可视化分析案例报告...

    维度降低有两个主要用例:数据探索和机器学习.它对于数据探索很有用,因为维数减少到几个维度(例如2或3维)允许可视化样本.然后可以使用这种可视化来从数据获得见解(例如,检测聚类并识别异常值).对于机器学 ...

  4. matlab 数据降维和重构_核主成分分析(Kernel PCA, KPCA)的MATLAB 实现

    前言 核主成分分析 (KPCA) 是一种非线性数据处理方法,其核心思想是通过一个非线性映射把原始空间的数据投影到高维特征空间, 然后在高维特征空间中进行基于主成分分析 (PCA) 的数据处理.KPCA ...

  5. PCA图像数据降维及重构误差分析实战并使用TSNE进行异常数据可视化分析

    PCA图像数据降维及重构误差分析实战并使用TSNE进行异常数据可视化分析 目录 PCA图像数据降维及重构误差分析实战并使用TSNE进行异常数据可视化分析</

  6. 使用t-SNE算法对数据进行降维并可视化实战,与KernalPCA、LLE对比降维可视化的效果

    使用t-SNE算法对数据进行降维并可视化,与KernalPCA.LLE对比降维可视化的效果 MNIST 数据集已经是一个被"嚼烂"了的数据集, 很多教程都会对它"下手&q ...

  7. 常见的PCA、tSNE、UMAP降维及聚类基本原理及代码实例

    常见的降维方法基本原理及代码实例 0.前言:什么时候要降维聚类?降维目的-方法概述 1.PCA(主成分分析) 1.1PCA概念 1.2 PCA代码实例 2.tSNE 2.1tSNE概念 2.2 tSN ...

  8. 基于TensorFlow理解三大降维技术:PCA、t-SNE 和自编码器

    ythonista 数据科学家 Elior Cohen 近日在 Medium 上发文解读了最常见的三大降维技术:PCA.t-SNE 和自编码器.为了帮助理解,他还为其中每种相关算法编写了代码(也发布在 ...

  9. R实战| PCA、tSNE、UMAP三种降维方法在R中的实现

    降维 在组学分析中,一般通过降维算法得到低纬度如二维或三维的新坐标数据,再结合可视化技术去展示样本的在新坐标的空间分布,接着加上统计检验结果证实整体组学水平上组间的差异性.降维算法有基于线性模型的PC ...

最新文章

  1. g-gdb调试core文件
  2. 手机壳释放致癌物质“苯”吗?专家:确实会
  3. CvSVM::EPS_SVR train_auto assertion sv_count != 0 failed原因
  4. BeautifulSoup总结
  5. xml.modify() 实例演示(二)
  6. [wordpress]更新插件时,免去FTP操作
  7. rsync+lsync实现多服务器多文件夹双向同步
  8. 第二阶段团队站立会议02
  9. 基于imx6ul下调试tlv320aic3x声卡
  10. led数字字体_led电视质量排行榜
  11. 电子电路基础 (14)——稳压电源的工作原理分析
  12. php soap wsse,改变xmlns:wsse命名空间在使用Python Zeep的SOAP请求中
  13. bitset——定义及常用操作。
  14. 关于MyEclipse的servers和WTPservers
  15. 【初级算法】10.有效的数独
  16. vue报错:vue.js:634 [Vue warn]: Cannot find element: #app
  17. 深入浅出移动直播技术之帧率、码率和分辨率
  18. ubuntu 18.04 解决网易云音乐图标不能打开的问题
  19. 2019年京东PLUS会员前端开发之路总结
  20. 基于 springboot + websocket 的实时聊天系统

热门文章

  1. 蝉知门户系统迁移到SAE平台-对蝉知2.5版本部分功能的限制
  2. Think PHP 提示验证码输入错误
  3. 职场人怎么提醒自己下班打卡?
  4. 联想e550笔记本怎么样_联想e550测评及价格
  5. C语言*p、p以及p的区别,*p和**p的区别
  6. 这所【上海985大学】的专业课科目变了!
  7. 电信CDMA是什么意思
  8. 通信原理(3)——模拟通信系统的幅度调制(AM DSB SSB VSB)和角度调制(PM FM)
  9. 树莓派+PyQt制作魔镜
  10. Hadoop之机架感知