1 主成分分析(PCA)
1.1 主成分應用
從第二章的圖1.1.1中能看出來哪部電影的人氣指數最高嗎?當然是票房比較高或者檢索次數比較高的電影人氣指數要高。如何用主成分來分析人氣指數哪?沿着數據跨度最大的方向,即方差最大的方向畫出一條座標軸,然後將原始的數據投影在新的座標軸上,投影后值越大代表綜合人氣指數最高,見下圖。下面會以一個例子演示如何計算主成分,及其相關應用。
![這裏寫圖片描述](https://img-blog.csdn.net/20170127092317275?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemMwMjA1MTEyNg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
圖1.1.1 各個樣本點在主成分上的投影
1.2 一個例子
依然以電影爲例,量表經常用於調查,例如在電影院看電影時遇到工作人員給你的一個量表,量表統計的內容包括:電影劇情,音樂,演員。經過打分後得到如下十部電影的評分結果
表1.1
| | 電影劇情得分 | 音樂得分 | 演員得分 |
|—-|————–|———-|———-|
| 1 | 2 | 4 | 5 |
| 2 | 1 | 5 | 1 |
| 3 | 5 | 3 | 4 |
| 4 | 2 | 2 | 3 |
| 5 | 3 | 5 | 5 |
| 6 | 4 | 3 | 2 |
| 7 | 4 | 4 | 3 |
| 8 | 1 | 2 | 1 |
| 9 | 3 | 3 | 2 |
| 10 | 5 | 5 | 3 |
通過這個量表調查,如何能確定“**人氣指數**”最高的電影?表1.1中的數據的三維圖如下
![這裏寫圖片描述](https://img-blog.csdn.net/20170127092328634?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemMwMjA1MTEyNg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
圖1.2.1
下面忽略所有關於主成分的公式推導,直接給出求解步驟
1.2.1 求主成分和主成分得分
1 對數據進行標準化
電影劇情得分,音樂得分,演員得分所對應的屬性分別爲u,v,w ,u 的均值和方差計算方法如下
mu=u1+u2+⋯+u1010
stdu=(u1−mu)2+(u2−mu)2+⋯+(u10−mu)210−1−−−−−(1.2.1−1)
v,w 的計算方法與之類似,經過計算後,表1.1的結果如下
表1.2
| 1 | 電影劇情得分 | 音樂得分 | 演員得分 |
|—-|————–|————–|————–|
| 2 | \-0.67082039 | 0.3407771 | 1.44913767 |
| 3 | \-1.34164079 | 1.19271985 | \-1.31112456 |
| 4 | 1.34164079 | \-0.51116565 | 0.75907212 |
| 5 | \-0.67082039 | \-1.3631084 | 0.06900656 |
| 6 | 0. | 1.19271985 | 1.44913767 |
| 7 | 0.67082039 | \-0.51116565 | \-0.621059 |
| 8 | 0.67082039 | 0.3407771 | 0.06900656 |
| 9 | \-1.34164079 | \-1.3631084 | \-1.31112456 |
| 10 | 0. | \-0.51116565 | \-0.621059 |
| 11 | 1.34164079 | 1.19271985 | 0.06900656 |
**2 求相關矩陣**
表1.2的協方差矩陣如下
表1.3
| 1. | 0.19050019 | 0.36004115 |
|————|————|————|
| 0.19050019 | 1. | 0.30048036 |
| 0.36004115 | 0.30048036 | 1. |
**3 求相關矩陣的特徵值和對應的特徵向量**
表1.4
| **特徵值** | **特徵向量** |
|—————-|——————————————–|
| **1.57285386** | **[ 0.571511 , 0.52211611, 0.63306393]** |
| **0.81400832** | **[ 0.60447096, -0.78960694, 0.105526 ]** |
| **0.61313782** | **[-0.5549685 , -0.32235949, 0.76687308]** |
**4 畫出特徵向量**
畫出特徵值**1.57285386和0.81400832所對應的特徵向量**
![這裏寫圖片描述](https://img-blog.csdn.net/20170127092341306?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemMwMjA1MTEyNg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
圖1.2.1.1 特徵在主成分座標系下的散點圖
**5 求出第一、二主成分**
**求第一二主成分的公式如下,**ui 爲原始數據的特徵
z1=0.571511×u1+0.571511×u2+0.571511×u3
z2= 0.604470×u1−0.789606×u2+0.105526×u3
所以求得的第一二主成分如下
表1.5
| | z1 | z2 |
|—-|——————|——————|
| 1 | 0.711940768936 | 0.521649701201 |
| 2 | \-0.974049885433 | 1.89112050144 |
| 3 | 0.98041582444 | \-1.29470468257 |
| 4 | \-1.05139653499 | \-0.678110402438 |
| 5 | 1.54013504262 | 0.788858169925 |
| 6 | \-0.276676639586 | \-0.743573516808 |
| 7 | 0.604992012377 | \-0.143693464988 |
| 8 | \-2.30848899902 | \-0.126979236679 |
| 9 | \-0.660057875408 | \-0.338082072825 |
| 10 | 1.43318628606 | 0.123515003736 |
第一二主成分畫出的散點圖如下
![這裏寫圖片描述](https://img-blog.csdn.net/20170127092354213?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemMwMjA1MTEyNg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
圖1.2.1.2 第一二主成分的散點圖
1.2.2 確定分析精度
主成分分析的結果精度如何,是通過累積貢獻率來確定的,第i個主成分的貢獻率定義如下
λi∑λi
本例中各個主成分的累積貢獻率爲
特徵值 |
特徵向量 |
1.57285386 |
1.57285386/3=52.42% |
0.81400832 |
(0.81400832+1.57285386)/3=79.56% |
0.61313782 |
(0.81400832+1.57285386+0.61313782)/3=100% |
累積貢獻率越大精度越高,一般只求第一二主成分,所以第一二主成分的累積貢獻率越高越好,但是高到什麼程度沒有一個固定的標準。
1.2.3 分析結果
第一主成分代表的物理意義爲“綜合性能”最好,在這個例子中就是“人氣指數”
圖1.2.1.2中表示的就是原始數據在第一主成分上的投影,投影越大“人氣指數”越高,所以可以看出來5和10的人氣指數最高,返回到表1.1中可以看出確實是5和10的人氣指數比較高。
從圖1.2.1.1中看出演員在對“人氣指數”的影響最大。
圖1.2.1.2可以用於數據降維。
1.2.4 程序解析
第一步:對數據標準化處理,對應1.2.1節中第1步
def unit(data):
mean_ = np.mean(data, axis = 0)
std_ = np.std(data, axis = 0, ddof = 1)
return (data - mean_) / std_
第二步:計算協方差矩陣,對應於1.2.1節中第2步
def cov(data):
mean_ = np.mean(data, axis = 0)
data = data - mean_
cov_mat = data.T.dot(data) / (data.shape[0] - 1)
return cov_mat
第三步:直接調用scipy.linalg中特徵值求解函數,求特徵值,對應於1.2.1節中第3步
[u, s] = eig(cov_matrix)
第四步:畫出特徵在新的座標系下的散點圖,對應於對應於1.2.1節中第4步
def plotItems(u):
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(np.abs(u[:, 0]), u[:, 1], 'o')
u[:, 0] = np.abs(u[:, 0])
plt.text(u[0, 0], u[0, 1], 'story')
plt.text(u[1, 0], u[1, 1], 'music')
plt.text(u[2, 0], u[2, 1], 'performer')
plt.xlabel('z1')
plt.ylabel('z2')
plt.show()
第五步:求出第一二主成分,並畫出它們的散點圖,對應於1.2.1節中第5步
def samplesPca(data, u):
z1 = np.sum(data * np.abs(u[:, 0]), axis = 1)
z2 = np.sum(data * u[:, 1], axis = 1)
fig = plt.figure()
ax = fig.add_subplot(111)
markerline, stemlines, baseline = ax.stem(z1, z2, '-.')
for i in range(0,z1.shape[0]):
plt.text(z1[i], z2[i], str(i+1))
plt.xlabel('z1')
plt.ylabel('z2')
plt.setp(markerline, 'markerfacecolor', 'b')
plt.setp(baseline, 'color','r', 'linewidth', 2)
u[:, 0] = np.abs(u[:, 0])
ax.plot(u[:, 0], u[:, 1], '*')
plt.text(u[0, 0], u[0, 1], 'story')
plt.text(u[1, 0], u[1, 1], 'music')
plt.text(u[2, 0], u[2, 1], 'performer')
plt.show()
2 隱性語意分析(LSA)
隱性語意分析是自然語言處理中常用的方法,其基於SVD,和PCA類似,又有所不同,在對文本的處理中,LSA直接對詞-文檔矩陣進行處理,而不是協方差矩陣,下面介紹LSA在文本處理中的兩種應用:文本摘要,文本降維。
2.1 基於LSA的文本摘要算法
(1)假設存在文本D,將文本D分解爲單個句子,句子的集合爲S,爲單個句子;並將文檔D中所有的詞提取出來,這些詞的集合爲T,,爲詞語。
(2)用S和T構建文檔D的術語-句子詞頻矩陣A。下圖中的每一行表示文檔中的詞語在每個句子中出現的次數,該矩陣的構造有多種方式,如直接統計詞頻,或者採用權重策略,詳細的過程見文獻(1)4.3節。
![這裏寫圖片描述](https://img-blog.csdn.net/20170127092835395?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemMwMjA1MTEyNg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
圖1 術語-句子詞頻矩陣示意圖
(3)對矩陣*A*進行奇異值分解(*SVD*),
如果
其中,是列正交矩陣,矩陣中的列向量稱爲左奇異向量;爲對角陣它的對角線元素爲從小到大排列的非負值;也爲正交陣,它的列向量稱之爲右奇異向量,向量表示第*i*個特徵中的句子,中每個元素表示句子在這個特徵中的重要程度。
**如果**
**分解後U,S,V的物理意義如下(時)**
**注:**
如果,則滿足:
可以從兩個方面理解,將奇異值分解方法應用於術語-句子矩陣*A*的物理意義:(1)從變換觀點看,*SVD*將*m*個術語-頻率向量(*A*的行向量)張成的空間變換爲*r*維線性無關的奇異矩陣向量空間。這種變換將*A*中的每列(代表句子*i*
所包含的術語頻率)變換爲矩陣的每列;同時把*A*中的行向量*j*(表示每個術語在每個句子中出現的頻率)映射到矩陣的行向量。其中的每個元素,的每個元素分別稱爲*x*和
*y*個奇異向量的索引。(2)從語義的觀點看,*SVD*可以獲得矩陣*A*所代表的隱形語義結構,通過對A進行奇異值分解可以將A分解爲*r*個線性無關的基向量或者稱爲概念,這些基向量或者說是概念可以表示文檔中的術語和句子,SVD與傳統的*IR*方法不同,*SVD*方法可以提取術語之間的相互關係,所以*SVD*方法可以對句子和術語的隱性語意進行聚類。比如有這幾個詞:doctor,physician,
hospital,medicine,nurse,這些詞有相近的概念,同義詞doctor和physician出現在相似的上下文中時,可能會有很多相關的詞如:hospital,medicine,nurse和它們相聯繫。由於這些相似的詞之間的結合模式,經過計算,就可以把doctor和physician映射到r維的奇異向量空間中相近的位置;除此之外,在一篇文檔中,如果詞的組合模式很重要且經常出現,那麼這種特性也可以通過奇異向量表示,在奇異向量中的每個元素的幅值就表示了這種特性在文檔中的重要性,任何句子,如果包含這種詞語結合模式的特性,其將被映射到同一個奇異向量中去,奇異向量中的最大值代表的就是這個句子。因爲在文檔中每個特定詞的組合模式都表示一定的主題或者概念,所以以上所討論的事實將會導出如下情形:每個奇異向量代表一個主題或者概念,而奇異向量所對應的奇異值的大小表示可隱性語意的重要性。
(4)從中取出第i個列向量。
(5)從的第i個列向量中選出最大的值所對應的句子作爲摘要。
(6)如果選擇的句子數目已經達到了要求用戶的要求,則停止計算。
2.2 文本降維
在2.1中看到經過分解的U矩陣如下,在文本聚類中原始的矩陣“詞語-文檔”可能會非常稀疏,在計算餘弦相似性時導致計算的精度下降,所以可以採用SVD對其分解,然後對U矩陣進行聚類,因爲U矩陣中的每行還是代表詞語,只不過每列代表了隱性的語意,而且U矩陣是稠密的在計算餘弦相似性是會比稀疏的效果更好。
3 應用實例-文本聚類
下面採用sklearn中的一個例子,詳見http://scikit-learn.org/stable/auto_examples/document_clustering.html#example-document-clustering-py
對文本進行聚類,可以看到在採用降維後聚類的準確率從55%左右提高到了75%左右