【zt】TSVD

提要:

下面汇集了几篇文章的部分内容:

文章目录:

1. scikit-learn:通过TruncatedSVD实现LSA(隐含语义分析)

2. 用截断奇异值分解降维

3. 机器学习_用SVD奇异值分解给数据降维(理论讲解)

4. sklearn中的降维:SVD和LSA

=====================================================================

TSVD实现LSA(隐含语义分析)

http://scikit-learn.org/stable/modules/decomposition.html#lsa

第2.5.2部分:

2.5.2. Truncated singular value decomposition and latent semantic analysis(截断SVD和LSA/LSA)

先说明:latent semantic indexing, LSI和latent semantic analysis, LSA本质一样。

TruncatedSVD是SVD的变形,只计算用户指定的最大的K,个奇异值。

runcated SVD 用于term-document matrices (as returned by CountVectorizer or TfidfVectorizer), 就是所谓的 latent semantic analysis(LSA), because 他将term-document matrices 转换到低维的“semantic” space。

再说一点,TruncatedSVD 类似于PCA,,不同的是TSVD直接处理样本矩阵X,而不是X的协方差矩阵。(如果feature-mean被减去后,TSVD和PCA的结果一样,也就是说,PCA是处理X的协方差矩阵,需要将整个训练样本矩阵X还原成邻人讨厌的high-dimensional sparse marices,对于处理一个中等大小的文本集合这也很容易造成内存溢满。但TSVD直接使用scipy.sparse矩阵,不需要densify操作,所以推荐使用TSVD而不是PCA!

使用TSVD走LSA/document处理时,推荐用tf-idf矩阵,而不是tf矩阵。特别的,需要设置 (sublinear_tf=True,use_idf=True)使特征值近似于高斯分布,这能弥补LSA对于文本数据的错误的前提假设(compensating for LSA’s erroneous assumptions about textual data) 。

最后给一个例子:Clustering text documents using k-means

http://scikit-learn.org/stable/auto_examples/text/document_clustering.html#example-text-document-clustering-py

原帖链接:https://blog.csdn.net/mmc2015/article/details/46867773

--------------------------------------------------------------------------------------------

【其他】

用截断奇异值分解降维:https://blog.csdn.net/u013719780/article/details/51767427

截断奇异值分解(Truncated singular value decomposition,TSVD)是一种矩阵因式分解(factorization)技术,将矩阵分解成,和。它与PCA很像,只是SVD分解是在数据矩阵上进行,而PCA是在数据的协方差矩阵上进行。通常,SVD用于发现矩阵的主成份。

Getting ready

TSVD与一般SVD不同的是它可以产生一个指定维度的分解矩阵。例如,有一个矩阵,通过SVD分解后仍然是一个矩阵,而TSVD可以生成指定维度的矩阵。这样就可以实现降维了。

这里我们还用iris数据集来演示TSVD:

from sklearn.datasets import load_iris

iris=load_iris()

iris_data=iris.data

TSVD对象的用法和其他对象类似。首先导入需要的类,初始化,然后拟合:

from sklearn.decomposition import TruncatedSVD

svd=TruncatedSVD(2)

iris_transformed=svd.fit_transform(iris_data)

iris_data[:5]

iris_transformed[:5]

最终结果如下图所示:

%matplotlib inline

import matplotlib.pyplot as plt

f=plt.figure(figsize=(5,5))

ax=f.add_subplot(111)

ax.scatter(iris_transformed[:,0],iris_transformed[:,1],c=iris.target)

ax.set_title("Truncated SVD, 2 Components")


There's more...

TruncatedSVD还有一些细节需要注意。

符号翻转(Sign flipping)

TruncatedSVD有个“陷阱”。随着随机数生成器状态的变化,TruncatedSVD连续地拟合会改变输出的符合。为了避免这个问题,建议只用TruncatedSVD拟合一次,然后用其他变换。这正是管线命令的另一个用处。

要避免这种情况,可以这样:

tsvd=TruncatedSVD(2)

tsvd.fit(iris_data)

tsvd.transform(iris_data)[:5]

稀疏矩阵

TruncatedSVD相比PCA的一个优势是TruncatedSVD可以操作PCA处理不了的矩阵。这是因为PCA必须计算协方差矩阵,需要在整个矩阵上操作,如果矩阵太大,计算资源可能会不够用。

---------------------------------------------------------------------------------------------------------------------

【其他】

TSVD截断奇异值分解:https://blog.csdn.net/zhangweiguo_717/article/details/71778470

TSVD经常被用在特征提取和病态问题的解决上。

从某种程度上来说,PCA和SVD是一对表亲,PCA对特征的协方差矩阵进行分解,找到一堆特征的线性组合,尽可能多的表示出原始特征中成分,SVD则对原始数据直接进行奇异值分解,找到原始数据中尽可能大的特征值,以这些特征值多对应的特征向量作为新的特征。对于病态矩阵,目前主要的处理办法有预调节矩阵方法、区域分解法、正则化方法等,截断奇异值分解技术TSVD就是一种正则化方法,它牺牲部分精度换去解的稳定性,使得结果具有更高的泛化能力。

对于原始数据矩阵A(N*M) ,N代表样本个数,M代表维度,对其进行SVD分解:

上式中的delta就是数据的奇异值,且delta(1)>delta(2)>delta(3)...,通常如果A非常病态,delta的后面就越趋向于0,delta(1)/delta(n)就是数据的病态程度,越大说明病态程度越高,无用的特征越多,通常会截取前p个最大的奇异值,相应的U截取前p列,V截取前p列,这样A依然是N*M的矩阵,用这样的计算出来的A代替原始的A,就会比原始的A更稳定。

那么,提取的出的特征在哪里呢?delta(i)*U(:,i)*V(i,:)就是我们最终得到的第i重要的一个特征。

截断参数p的选取是TSVD方法的一个难点,确定何时开始舍弃小奇异值得贡献,统计学领域中该技术被称为主成分分析,本文在后面的数值计算中采用L曲线法求得p。

------------------------------------------------------------------------------------------------------------

【其他】

机器学习_用SVD奇异值分解给数据降维 https://blog.csdn.net/xieyan0811/article/details/78603789

本想把PCA和SVD写在一起,可上篇PCA还没写清楚就已经4页word了。再把SVD和特征工程的内容加上,实在是太长了,一下说太多也记不住,于是重开一篇。

SVD用到的原理和 PCA非常相似,就不再此赘述了,如果对特征值、特征向量相关问题不清楚请参见前篇《机器学习_用PCA主成分分析给数据降维》

1. 原理

先回忆一下特征值分解:把向量x往特征向量方向上分解,然后每个方向上做伸缩,最后再把结果加起来即可。也可以理解为将向量x转到正交坐标系,在各个坐标轴的方向上缩放后,再转换回原来的坐标系。只有方阵才能做特征值分解,因此我们在PCA中不是直接对数据做分解,而是对参数的协方差矩阵做分解。

我们知道,任何矩阵都可以分解为三个矩阵的乘积 A=U * Sigma * VT,也就是奇异值分解.其中 U 和VT 均是酉阵(正交阵在复数域的推广),而 Sigma 为增广对角阵。从直观上讲,U 和 VT 可视为旋转操作,Sigma 可视为缩放操作。因此奇异值分解的含义就是说,若将矩阵看做一个变换,那么任何这样的变换可以看做是两个旋转和一个缩放变换的复合,这点和特征值分解基本一样。它也可以通过对Sigma的调整实现降维,通过U和VT在高维和低维间转换。相比特征值分解,奇异值分解可处理的不只是协方差矩阵(方阵),还可以直接处理数据。

【zt】TSVD_第1张图片

但SVD也有一些问题,比如数据多的时候,奇异值分解的计算量会很大,不像PCA做特征值分解时,矩阵的大小只和属性个数相关。

中间略过一些内容。。。

3. 具体应用

(1) 图片压缩

 把图片的像素放一个矩阵里,做SVD分解,只保留Sigma中值大的前N项。则存储时只需保存三个矩阵,假设原图大小100x100,N为5,则原图要10000点存储,而拆分后100x5+100x5+5=1005,图像大小变为原来的1/10。

(2) 数据降维

矩阵中记20人试吃这5种套餐的评价(5x20),先对整体数据做SVD分解,假设保留Sigma的前3项,把原矩阵转置并和U,Sigma相乘,矩阵就从520维变成了35维。再套用各种学习算法时,数据就大大缩减了(从高维到低维投影)。不过20个维度变为3个维度后,属性意义也不像之前那么直观了,我们可以使用VT矩阵把数据恢复到原来的维度。

------------------------------------------------------------------------------------------------------------------

【其他】

sklearn中的降维:SVD和LSA:http://d0evi1.com/sklearn/svd/

svd和LSA

TruncatedSVD 实现了奇异值分解(SVD)的一个变种,它只需要计算k个最大的奇异值,参数k由用户指定。

当TruncatedSVD用于term-doc矩阵上时(通过CountVectorizer 或 TfidfVectorizer返回),该变换就是LSA(潜语义分析),因为它将这样的矩阵转换到一个隐含(semantic)的低维空间上。特别的,LDA与同义(synonymy)和多义(polysemy)经常对比(两者都意味着每个词都有多个意思),这造成了term-doc矩阵过于稀疏,以至于使用余弦相似度进行计算时通常不相似。

注意:LSA经常以LSI(latent semantic indexing)的方式被大家熟知,尽管它严格意义上指的是在信息检索领域用于保存索引。

数学上,TruncatedSVD将训练样本X,产生一个低维的近似矩阵Xk:

在这项操作后,

是转换后带有k个features的训练集(在API中称为: n_components)。

为了在测试集X上进行这样的转换,我们也需要乘上Vk:

注意:大多数在自然语言处理(NLP)以及信息检索(IR)文献中的LSA方法,交换了矩阵X的axes,它的shape为:n_features × n_samples。而我们以不同的方式来表示以便更好地适配sklearn API,但奇异值本身是一致的。

TruncatedSVD和PCA很相似,但不同的是,它在样本矩阵X上直接运行,而非它们的协方差矩阵(covariance matrices)。当X的列(每个feature)已经从feature值中提取后,在结果矩阵上进行TruncatedSVD与PCA相同。在实际上术语中, 这意味着TruncatedSVD转换器接受scipy.sparse 参数矩阵,不需要dense矩阵;即使对于中等size的docment集,使用dense矩阵会填满整个内存。

TruncatedSVD转换器可以在任何(稀疏)特征矩阵上运行,推荐在LDA文档处理时对原始词频TF进行tf-idf矩阵转换。特别的,次线性归一化(sublinear scaling)和IDF可以通过参数(sublinear_tf=True, use_idf=True) 进行设置,使得feature的值更接近高斯分布(Gaussian distribution),从而补偿对文本数据进行LSA的误差。

示例:

Clustering text documents using k-means

参考:

1.http://scikit-learn.org/stable/modules/decomposition.html#lsa

你可能感兴趣的:(【zt】TSVD)