提要:
下面汇集了几篇文章的部分内容:
文章目录:
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在高维和低维间转换。相比特征值分解,奇异值分解可处理的不只是协方差矩阵(方阵),还可以直接处理数据。
但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