降维方法总结及python实现

系统 131 0

为什么要降维?
高维情形下,样本数据稀疏,距离计算困难。
为什么能进行降维?
收集的数据虽是高维但与学习任务密切相关的也许仅仅是某个低维分布

无监督降维:

PCA
最大重构性:找到一个超平面使得样本点在这个超平面的投影尽量分开。
PCA也可以看作是逐一筛选方差最大方向;对协方差矩阵XX^T特征分解,取最大特征值及其特征向量;在去掉该特征值以及特征向量后,继续取最大特征值;
关于PCA的几个问题:

  1. 投影方向应该取多少才好?
    根据博客https://blog.csdn.net/michael__corleone/article/details/79680183中所说,选取特征值和占总特征值的80%

  2. PCA为什么需要去中心化?
    根据方差公式,如果没有事先进行去中心化后,在计算过程中也会去减去均值,增大计算复杂度

注意点:(1)特征根的大小决定了我们感兴趣信息的多少。即小特征根往往代表了噪声,但实际上,向小一点的特征根方向投影也有可能包括我们感兴趣的数据; (2)特征向量的方向是互相正交(orthogonal)的,这种正交性使得PCA容易受到Outlier的影响(3)PCA适用于非监督的学习的不带标签(带标签的样本,往往用LDA降维)的样本降维,特别是小样本问题。广义认为,这类样本属性之间的相关性很大,通过映射,将高维样本向量映射成属性不相关的样本向量。(4) PCA是一个去属性相关性的过程,这里的相关性主要指的是线性相关性
python代码:

            
              from numpy import  *
def loaddata(filename):
    fr=open(filename)
    stringArr=[line.strip().split('\t') for line in fr.readlines()]
    datArr=[map(float,line)for line in stringArr]
    return mat(datArr)

def pca(dataMat,topNfeat=9999999):
    ##去中心化
    meanVals=mean(dataMat,axis=0)
    meanRemoved=dataMat-meanVals
    #计算协方差矩阵
    covMat=cov(meanRemoved,rowvar=0)
    eigVals,eigVects=linalg.eig(mat(covMat))
    eigValInd=argsort(eigVals)
    ##对特征值进行排序
    eigValInd=eigValInd[:-(topNfeat+1):-1]
    redEigVects=eigVects[:,eigVaInd]
    #将数据转换到新空间
    lowDDataMat=meanRemoved*redEigVects
    reconMat=(lowDDataMat*redEigVects.T)+meanVals
    return lowDDataMat,reconMat
dataMat=loaddata('testSet.txt')
lowDMat,reconMat=pca(dataMat,1)
import matplotlib
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(111)
ax.scatter(dataMat[:,0].flatten().A[0], dataMat[:,1].flatten().A[0], marker='^',  s = 90 )
ax.scatter(reconMat[:,0].flatten().A[0], reconMat[:,1].flatten().A[0],marker='o', s = 50 , c ='red' )
plt.show() 

            
          

TSNE

TSNE是一种非线性的降维方法,上面的PCA无法解释特征之间多项式的关系,t-sne基于领域图上随机游走的概率分布来寻找数据内部结构。
参考链接:https://yq.aliyun.com/articles/70733
https://blog.csdn.net/zhangweiguo_717/article/details/70188517
其基本思想是保证降维后分布概率不变

自编码器
自编码器是一种能够通过无监督学习,学到输入数据高效表示的人工神经网络。
自编码器由两部分组成:
1)编码器:这部分能将输入压缩成潜在空间表征,可以用编码函数h=f(x)表示。
2)解码器:这部分能重构来自潜在空间表征的输入,可以用解码函数r=g(h)表示
自编码器的目标就是让output尽可能等于input,当中间隐层只有一层的时候,优化的目标函数类似于PCA。
降维方法总结及python实现_第1张图片
自动编码器与PCA的比较
  1)它是一种类似于 PCA 的无监督机器学习算法。大体上,AutoEncoder可以看作是PCA的非线性补丁加强版,PCA的取得的效果是建立在降维基础上的。
  2)它要最小化和 PCA 一样的目标函数。自动编码器的目标是学习函数 h(x)≈x。换句话说,它要学习一个近似的恒等函数,使得输出 x^ 近似等于输入 x。
  3)它是一种神经网络,这种神经网络的目标输出就是其输入。自动编码器属于神经网络家族,但它们也和 PCA(主成分分析)紧密相关。
  总之,尽管自动编码器与 PCA 很相似,但自动编码器比 PCA 灵活得多。在编码过程中,自动编码器既能表征线性变换,也能表征非线性变换;而 PCA 只能执行线性变换。因为自动编码器的网络表征形式,所以可将其作为层用于构建深度学习网络。设置合适的维度和稀疏约束,自编码器可以学习到比PCA等技术更有意思的数据投影。

正如主成分分析(principal component analysis,PCA)算法,通过降低空间维数去除冗余,利用更少的特征来尽可能完整的描述数据信息。
  实际应用中将学习得到的多种隐层特征(隐层数通常多个)与原始特征共同使用,可以明显提高算法的识别精度
自编码器的应用
  第一是数据去噪。
  第二是为进行可视化而降维。
  第三是进行图像压缩。
  第四传统自编码器被用于降维或特征学习。

有监督

LDA
Linear Discriminant Analysis(也有叫做Fisher Linear Discriminant)是一种有监督的(supervised)线性降维算法。与PCA保持数据信息不同,LDA是为了使得降维后的数据点尽可能地容易被区分!
假设原始数据表示为X,(m*n矩阵,m是维度,n是sample的数量)
既然是线性的,那么就是希望找到映射向量a, 使得 a‘X后的数据点能够保持以下两种性质:
1、同类的数据点尽可能的接近(within class)
2、不同类的数据点尽可能的分开(between class)
降维方法总结及python实现_第2张图片
所以呢还是上次PCA用的这张图,如果图中两堆点是两类的话,那么我们就希望他们能够投影到轴1去(PCA结果为轴2),这样在一维空间中也是很容易区分的。
降维方法总结及python实现_第3张图片
思路还是非常清楚的,目标函数就是最后一行J(a),μ(一飘)就是映射后的中心用来评估类间距,s(一瓢)就是映射后的点与中心的距离之和用来评估类内距。J(a)正好就是从上述两个性质演化出来的。
因此两类情况下:
加上a’a=1的条件(类似于PCA)


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请请扫描上面二维码支持博主1元、2元、5元等您想捐的金额吧,狠狠点击下面给点支持吧

发表我的评论
最新评论 总共0条评论