我们如何确定潜在语义分析的维数?

最近我一直在研究潜在的语义分析。 我通过使用Jama软件包在java中实现了它。

代码如下:

    Matrix vtranspose ; 
    a = new Matrix(termdoc);  
    termdoc = a.getArray(); 
    a = a.transpose() ; 
    SingularValueDecomposition sv =new SingularValueDecomposition(a) ; 
    u = sv.getU();
    v = sv.getV(); 
    s = sv.getS();
    vtranspose = v.transpose() ; // we obtain this as a result of svd 

    uarray = u.getArray();
    sarray = s.getArray(); 
    varray = vtranspose.getArray(); 
    if(semantics.maketerms.nodoc>50)
    {

        sarray_mod = new double[50][50]; 
        uarray_mod = new double[uarray.length][50];
        varray_mod = new double[50][varray.length]; 
        move(sarray,50,50,sarray_mod); 
        move(uarray,uarray.length,50,uarray_mod); 
        move(varray,50,varray.length,varray_mod); 
        e = new Matrix(uarray_mod); 
        f = new Matrix(sarray_mod);
        g = new Matrix(varray_mod);
        Matrix temp  =e.times(f); 
        result = temp.times(g);  

    }
    else 
    {
        Matrix temp = u.times(s); 
        result = temp.times(vtranspose); 
    }
    result = result.transpose(); 
    results = result.getArray() ; 

    return results ; 

但是,我们如何确定维度的数量? 有没有一种方法可以确定系统应该减少的维数以获得最佳结果? 我们考虑哪些其他参数来提高LSA的有效性能?


关于维数的选择:

1)http://en.wikipedia.org/wiki/Latent_semantic_indexing:

LSI面临的另一个挑战是难以确定用于执行SVD的最佳维数。 作为一般规则,更少的维度允许对文本集合中包含的概念进行更广泛的比较,而更多的维度则可以对概念进行更具体(或更相关)的比较。 可以使用的实际维度数量受到集合中文档数量的限制。 研究表明,大约300个维度通常会为中等规模的文档集合(数十万个文档)提供最佳结果,对于较大的文档集合(数百万个文档),维度可能会达到400个维度。 然而,最近的研究表明,根据文件收集的大小和性质,50-1000个尺寸是合适的。

在计算SVD之后检查数据中的方差量可用于确定要保留的最佳维数。 数据中包含的方差可以通过绘制奇异值(S)在scree图中查看。 一些LSI从业者选择与曲线拐点相关的维度作为要保留的维度数量的截止点。 其他人则认为,必须保留一定数量的差异,并且数据中的差异量应该决定保留的适当维度。 经常提到70%的数据是应用于选择重新计算SVD的最佳维度的数据变化量。



2)http://www.puffinwarellc.com/index.php/news-and-articles/articles/33-latent-semantic-analysis-tutorial.html?showall=1:

使用SVD的诀窍在于计算近似矩阵时要使用多少维或“概念”。 太多的维度和重要的模式被遗漏,太多的噪音和随机的词汇选择所导致的噪音会慢慢回来.SVD算法有一点涉及,但幸运的是,Python有一个库函数,使它易于使用。 通过将下面的一行方法添加到我们的LSA类中,我们可以将我们的矩阵分成3个其他矩阵。 U矩阵给出了我们的“概念”空间上每个单词的坐标,Vt矩阵给出了我们在“概念”空间中每个文档的坐标,而奇异值的S矩阵给出了关于多少维度的线索或我们需要包括的“概念”。

def calc(self): self.U, self.S, self.Vt = svd(self.A)

为了选择正确数量的维度,我们可以制作奇异值平方的直方图。 这表示每个奇异值有助于近似矩阵的重要性。 这里是我们例子中的直方图。

在这里输入图像描述

对于大量文档集合,所使用的维度数量在100到500个范围内。 在我们的小例子中,因为我们想要绘制它,我们将使用3维,抛出第一维,并绘制第二维和第三维。

我们抛出第一个维度的原因很有趣。 对于文档,第一个维度与文档的长度相关。 就单词而言,它与在所有文档中使用单词的次数相关。 如果我们通过从每列中减去平均列值来集中矩阵,那么我们将使用第一维。 作为比喻,考虑高尔夫比分。 我们不想知道实际的分数,我们想知道得分后减去它的分数。 这告诉我们玩家是否制作了小鸟,转向架等。



3)Landauer,TK,Foltz,PW,Laham,D.,(1998),'潜在语义分析入门',Discourse Processes,25,259-284:

在这里输入图像描述

链接地址: http://www.djcxy.com/p/49101.html

上一篇: How do we decide the number of dimensions for Latent semantic analysis ?

下一篇: Problems with svd in java