提要:
下面匯集了幾篇文章的部分內(nèi)容:
文章目錄:
1. scikit-learn:通過(guò)TruncatedSVD實(shí)現(xiàn)LSA(隱含語(yǔ)義分析)
2. 用截?cái)嗥娈愔捣纸饨稻S
3.?機(jī)器學(xué)習(xí)_用SVD奇異值分解給數(shù)據(jù)降維(理論講解)
4. sklearn中的降維:SVD和LSA
=====================================================================
TSVD實(shí)現(xiàn)LSA(隱含語(yǔ)義分析)
http://scikit-learn.org/stable/modules/decomposition.html#lsa
第2.5.2部分:
2.5.2. Truncated singular value decomposition and latent semantic analysis(截?cái)郤VD和LSA/LSA)
先說(shuō)明:latent semantic indexing, LSI和latent semantic analysis,?LSA本質(zhì)一樣。
TruncatedSVD是SVD的變形,只計(jì)算用戶指定的最大的K砾隅,個(gè)奇異值。
runcated SVD 用于term-document matrices (as returned by?CountVectorizer?or?TfidfVectorizer), 就是所謂的?latent semantic analysis(LSA), because 他將term-document matrices?轉(zhuǎn)換到低維的“semantic” space抖所。
再說(shuō)一點(diǎn),TruncatedSVD?類似于PCA,痕囱,不同的是TSVD直接處理樣本矩陣X田轧,而不是X的協(xié)方差矩陣。(如果feature-mean被減去后鞍恢,TSVD和PCA的結(jié)果一樣傻粘,也就是說(shuō),PCA是處理X的協(xié)方差矩陣有序,需要將整個(gè)訓(xùn)練樣本矩陣X還原成鄰人討厭的high-dimensional sparse marices抹腿,對(duì)于處理一個(gè)中等大小的文本集合這也很容易造成內(nèi)存溢滿。但TSVD直接使用scipy.sparse矩陣旭寿,不需要densify操作警绩,所以推薦使用TSVD而不是PCA!)
使用TSVD走LSA/document處理時(shí)盅称,推薦用tf-idf矩陣肩祥,而不是tf矩陣。特別的缩膝,需要設(shè)置?(sublinear_tf=True,use_idf=True)使特征值近似于高斯分布混狠,這能彌補(bǔ)LSA對(duì)于文本數(shù)據(jù)的錯(cuò)誤的前提假設(shè)(compensating for LSA’s erroneous assumptions about textual data) 。
最后給一個(gè)例子: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
--------------------------------------------------------------------------------------------
【其他】
用截?cái)嗥娈愔捣纸饨稻S:https://blog.csdn.net/u013719780/article/details/51767427
截?cái)嗥娈愔捣纸猓═runcated singular value decomposition疾层,TSVD)是一種矩陣因式分解(factorization)技術(shù)将饺,將矩陣分解成,和痛黎。它與PCA很像予弧,只是SVD分解是在數(shù)據(jù)矩陣上進(jìn)行,而PCA是在數(shù)據(jù)的協(xié)方差矩陣上進(jìn)行湖饱。通常掖蛤,SVD用于發(fā)現(xiàn)矩陣的主成份。
TSVD與一般SVD不同的是它可以產(chǎn)生一個(gè)指定維度的分解矩陣井厌。例如蚓庭,有一個(gè)矩陣致讥,通過(guò)SVD分解后仍然是一個(gè)矩陣,而TSVD可以生成指定維度的矩陣器赞。這樣就可以實(shí)現(xiàn)降維了垢袱。
這里我們還用iris數(shù)據(jù)集來(lái)演示TSVD:
from sklearn.datasets import load_iris
iris=load_iris()
iris_data=iris.data
TSVD對(duì)象的用法和其他對(duì)象類似。首先導(dǎo)入需要的類港柜,初始化惶桐,然后擬合:
from sklearn.decomposition import TruncatedSVD
svd=TruncatedSVD(2)
iris_transformed=svd.fit_transform(iris_data)
iris_data[:5]
iris_transformed[:5]
最終結(jié)果如下圖所示:
%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還有一些細(xì)節(jié)需要注意。
符號(hào)翻轉(zhuǎn)(Sign flipping)
TruncatedSVD有個(gè)“陷阱”潘懊。隨著隨機(jī)數(shù)生成器狀態(tài)的變化,TruncatedSVD連續(xù)地?cái)M合會(huì)改變輸出的符合贿衍。為了避免這個(gè)問(wèn)題授舟,建議只用TruncatedSVD擬合一次,然后用其他變換贸辈。這正是管線命令的另一個(gè)用處释树。
要避免這種情況,可以這樣:
tsvd=TruncatedSVD(2)
tsvd.fit(iris_data)
tsvd.transform(iris_data)[:5]
稀疏矩陣
TruncatedSVD相比PCA的一個(gè)優(yōu)勢(shì)是TruncatedSVD可以操作PCA處理不了的矩陣擎淤。這是因?yàn)镻CA必須計(jì)算協(xié)方差矩陣奢啥,需要在整個(gè)矩陣上操作,如果矩陣太大嘴拢,計(jì)算資源可能會(huì)不夠用桩盲。
---------------------------------------------------------------------------------------------------------------------
【其他】
TSVD截?cái)嗥娈愔捣纸猓篽ttps://blog.csdn.net/zhangweiguo_717/article/details/71778470
TSVD經(jīng)常被用在特征提取和病態(tài)問(wèn)題的解決上。
從某種程度上來(lái)說(shuō)席吴,PCA和SVD是一對(duì)表親赌结,PCA對(duì)特征的協(xié)方差矩陣進(jìn)行分解,找到一堆特征的線性組合孝冒,盡可能多的表示出原始特征中成分柬姚,SVD則對(duì)原始數(shù)據(jù)直接進(jìn)行奇異值分解,找到原始數(shù)據(jù)中盡可能大的特征值庄涡,以這些特征值多對(duì)應(yīng)的特征向量作為新的特征量承。對(duì)于病態(tài)矩陣,目前主要的處理辦法有預(yù)調(diào)節(jié)矩陣方法穴店、區(qū)域分解法撕捍、正則化方法等,截?cái)嗥娈愔捣纸饧夹g(shù)TSVD就是一種正則化方法迹鹅,它犧牲部分精度換去解的穩(wěn)定性卦洽,使得結(jié)果具有更高的泛化能力。
對(duì)于原始數(shù)據(jù)矩陣A(N*M) 斜棚,N代表樣本個(gè)數(shù)阀蒂,M代表維度该窗,對(duì)其進(jìn)行SVD分解:
上式中的delta就是數(shù)據(jù)的奇異值,且delta(1)>delta(2)>delta(3)...蚤霞,通常如果A非常病態(tài)酗失,delta的后面就越趨向于0,delta(1)/delta(n)就是數(shù)據(jù)的病態(tài)程度昧绣,越大說(shuō)明病態(tài)程度越高规肴,無(wú)用的特征越多,通常會(huì)截取前p個(gè)最大的奇異值夜畴,相應(yīng)的U截取前p列拖刃,V截取前p列,這樣A依然是N*M的矩陣贪绘,用這樣的計(jì)算出來(lái)的A代替原始的A兑牡,就會(huì)比原始的A更穩(wěn)定。
那么税灌,提取的出的特征在哪里呢均函?delta(i)*U(:,i)*V(i,:)就是我們最終得到的第i重要的一個(gè)特征。
截?cái)鄥?shù)p的選取是TSVD方法的一個(gè)難點(diǎn)菱涤,確定何時(shí)開(kāi)始舍棄小奇異值得貢獻(xiàn)苞也,統(tǒng)計(jì)學(xué)領(lǐng)域中該技術(shù)被稱為主成分分析,本文在后面的數(shù)值計(jì)算中采用L曲線法求得p粘秆。
------------------------------------------------------------------------------------------------------------
【其他】
機(jī)器學(xué)習(xí)_用SVD奇異值分解給數(shù)據(jù)降維?https://blog.csdn.net/xieyan0811/article/details/78603789
本想把PCA和SVD寫(xiě)在一起如迟,可上篇PCA還沒(méi)寫(xiě)清楚就已經(jīng)4頁(yè)word了。再把SVD和特征工程的內(nèi)容加上攻走,實(shí)在是太長(zhǎng)了氓涣,一下說(shuō)太多也記不住,于是重開(kāi)一篇陋气。
SVD用到的原理和 PCA非常相似劳吠,就不再此贅述了,如果對(duì)特征值巩趁、特征向量相關(guān)問(wèn)題不清楚請(qǐng)參見(jiàn)前篇《機(jī)器學(xué)習(xí)_用PCA主成分分析給數(shù)據(jù)降維》
先回憶一下特征值分解:把向量x往特征向量方向上分解痒玩,然后每個(gè)方向上做伸縮,最后再把結(jié)果加起來(lái)即可议慰。也可以理解為將向量x轉(zhuǎn)到正交坐標(biāo)系蠢古,在各個(gè)坐標(biāo)軸的方向上縮放后,再轉(zhuǎn)換回原來(lái)的坐標(biāo)系别凹。只有方陣才能做特征值分解草讶,因此我們?cè)赑CA中不是直接對(duì)數(shù)據(jù)做分解,而是對(duì)參數(shù)的協(xié)方差矩陣做分解炉菲。
我們知道堕战,任何矩陣都可以分解為三個(gè)矩陣的乘積 A=U * Sigma * VT坤溃,也就是奇異值分解.其中 U 和VT 均是酉陣(正交陣在復(fù)數(shù)域的推廣),而 Sigma 為增廣對(duì)角陣嘱丢。從直觀上講薪介,U 和 VT 可視為旋轉(zhuǎn)操作,Sigma 可視為縮放操作越驻。因此奇異值分解的含義就是說(shuō)汁政,若將矩陣看做一個(gè)變換,那么任何這樣的變換可以看做是兩個(gè)旋轉(zhuǎn)和一個(gè)縮放變換的復(fù)合缀旁,這點(diǎn)和特征值分解基本一樣记劈。它也可以通過(guò)對(duì)Sigma的調(diào)整實(shí)現(xiàn)降維,通過(guò)U和VT在高維和低維間轉(zhuǎn)換并巍。相比特征值分解抠蚣,奇異值分解可處理的不只是協(xié)方差矩陣(方陣),還可以直接處理數(shù)據(jù)履澳。
但SVD也有一些問(wèn)題,比如數(shù)據(jù)多的時(shí)候怀跛,奇異值分解的計(jì)算量會(huì)很大距贷,不像PCA做特征值分解時(shí),矩陣的大小只和屬性個(gè)數(shù)相關(guān)吻谋。
中間略過(guò)一些內(nèi)容忠蝗。。漓拾。
3. 具體應(yīng)用
(1) 圖片壓縮
?把圖片的像素放一個(gè)矩陣?yán)锔笞睿鯯VD分解,只保留Sigma中值大的前N項(xiàng)骇两。則存儲(chǔ)時(shí)只需保存三個(gè)矩陣速种,假設(shè)原圖大小100x100,N為5低千,則原圖要10000點(diǎn)存儲(chǔ)配阵,而拆分后100x5+100x5+5=1005,圖像大小變?yōu)樵瓉?lái)的1/10示血。
(2) 數(shù)據(jù)降維
矩陣中記20人試吃這5種套餐的評(píng)價(jià)(5x20)棋傍,先對(duì)整體數(shù)據(jù)做SVD分解,假設(shè)保留Sigma的前3項(xiàng)难审,把原矩陣轉(zhuǎn)置并和U,Sigma相乘瘫拣,矩陣就從520維變成了35維。再套用各種學(xué)習(xí)算法時(shí)告喊,數(shù)據(jù)就大大縮減了(從高維到低維投影)麸拄。不過(guò)20個(gè)維度變?yōu)?個(gè)維度后派昧,屬性意義也不像之前那么直觀了,我們可以使用VT矩陣把數(shù)據(jù)恢復(fù)到原來(lái)的維度感帅。
------------------------------------------------------------------------------------------------------------------
【其他】
sklearn中的降維:SVD和LSA:http://d0evi1.com/sklearn/svd/
svd和LSA
TruncatedSVD?實(shí)現(xiàn)了奇異值分解(SVD)的一個(gè)變種斗锭,它只需要計(jì)算k個(gè)最大的奇異值,參數(shù)k由用戶指定失球。
當(dāng)TruncatedSVD用于term-doc矩陣上時(shí)(通過(guò)CountVectorizer 或 TfidfVectorizer返回)岖是,該變換就是LSA(潛語(yǔ)義分析),因?yàn)樗鼘⑦@樣的矩陣轉(zhuǎn)換到一個(gè)隱含(semantic)的低維空間上实苞。特別的豺撑,LDA與同義(synonymy)和多義(polysemy)經(jīng)常對(duì)比(兩者都意味著每個(gè)詞都有多個(gè)意思),這造成了term-doc矩陣過(guò)于稀疏黔牵,以至于使用余弦相似度進(jìn)行計(jì)算時(shí)通常不相似聪轿。
注意:LSA經(jīng)常以LSI(latent semantic indexing)的方式被大家熟知,盡管它嚴(yán)格意義上指的是在信息檢索領(lǐng)域用于保存索引猾浦。
數(shù)學(xué)上陆错,TruncatedSVD將訓(xùn)練樣本X,產(chǎn)生一個(gè)低維的近似矩陣Xk:
在這項(xiàng)操作后金赦,
是轉(zhuǎn)換后帶有k個(gè)features的訓(xùn)練集(在API中稱為: n_components)音瓷。
為了在測(cè)試集X上進(jìn)行這樣的轉(zhuǎn)換,我們也需要乘上Vk:
注意:大多數(shù)在自然語(yǔ)言處理(NLP)以及信息檢索(IR)文獻(xiàn)中的LSA方法夹抗,交換了矩陣X的axes绳慎,它的shape為:n_features × n_samples。而我們以不同的方式來(lái)表示以便更好地適配sklearn API漠烧,但奇異值本身是一致的杏愤。
TruncatedSVD和PCA很相似,但不同的是已脓,它在樣本矩陣X上直接運(yùn)行珊楼,而非它們的協(xié)方差矩陣(covariance matrices)。當(dāng)X的列(每個(gè)feature)已經(jīng)從feature值中提取后度液,在結(jié)果矩陣上進(jìn)行TruncatedSVD與PCA相同亥曹。在實(shí)際上術(shù)語(yǔ)中, 這意味著TruncatedSVD轉(zhuǎn)換器接受scipy.sparse 參數(shù)矩陣恨诱,不需要dense矩陣媳瞪;即使對(duì)于中等size的docment集,使用dense矩陣會(huì)填滿整個(gè)內(nèi)存照宝。
TruncatedSVD轉(zhuǎn)換器可以在任何(稀疏)特征矩陣上運(yùn)行蛇受,推薦在LDA文檔處理時(shí)對(duì)原始詞頻TF進(jìn)行tf-idf矩陣轉(zhuǎn)換。特別的厕鹃,次線性歸一化(sublinear scaling)和IDF可以通過(guò)參數(shù)(sublinear_tf=True, use_idf=True) 進(jìn)行設(shè)置兢仰,使得feature的值更接近高斯分布(Gaussian distribution)乍丈,從而補(bǔ)償對(duì)文本數(shù)據(jù)進(jìn)行LSA的誤差。
示例:
Clustering text documents using k-means
參考:
1.http://scikit-learn.org/stable/modules/decomposition.html#lsa