机器学习基础 第五章 降维算法

来源:互联网 发布:中日海军对比2017知乎 编辑:程序博客网 时间:2024/06/06 10:40

1 主成分分析(PCA)

1.1 主成分应用

从第二章的图1.1.1中能看出来哪部电影的人气指数最高吗?当然是票房比较高或者检索次数比较高的电影人气指数要高。如何用主成分来分析人气指数哪?沿着数据跨度最大的方向,即方差最大的方向画出一条坐标轴,然后将原始的数据投影在新的坐标轴上,投影后值越大代表综合人气指数最高,见下图。下面会以一个例子演示如何计算主成分,及其相关应用。

![这里写图片描述](http://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中的数据的三维图如下
![这里写图片描述](http://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,wu的均值和方差计算方法如下

mu=u1+u2++u1010

stdu=(u1mu)2+(u2mu)2++(u10mu)21011.2.11

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所对应的特征向量**
![这里写图片描述](http://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×u10.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 |第一二主成分画出的散点图如下
![这里写图片描述](http://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节。

![这里写图片描述](http://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%左右

0 0
原创粉丝点击