Latent semantic analysis中的维度数量如何确定?

10

最近我一直在研究潜在语义分析。我已经使用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个回答

19
关于选择维度数量的问题:
1) http://en.wikipedia.org/wiki/Latent_semantic_indexing:
LSI面临的另一个挑战是确定用于执行SVD的最佳维数。一般而言,较少的维数允许对包含在文本集合中的概念进行更广泛的比较,而更高的维数则使得概念的比较更具体(或更相关)。可以使用的实际维数受到文档数量的限制。研究表明,在中等大小的文档集合(数十万个文档)中通常使用约300个维度会提供最佳结果,而在更大的文档集合(数百万个文档)中可能需要使用400个维度。然而,最近的研究表明,根据文档集合的大小和性质,50-1000个维度都是适当的。
通过计算SVD后检查数据中的方差,可以确定保留的最佳维数。可以通过在屏幕图中绘制奇异值(S)来查看数据中包含的方差。一些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类添加下面一行方法,我们可以将我们的矩阵分解为另外三个矩阵。U矩阵给出了每个单词在我们的“概念”空间中的坐标,Vt矩阵给出了我们的“概念”空间中每个文档的坐标,而奇异值的S矩阵则给出了我们需要包含多少维度或“概念”的线索。为了选择正确的维度数,我们可以制作奇异值平方的直方图。这将图形化每个奇异值对于近似我们的矩阵所做出的贡献的重要性。这是我们示例中的直方图。

enter image description here

对于大量文档的集合,所使用的维度数通常在100到500之间。在我们的小例子中,由于要将其绘制成图形,我们将使用3个维度,丢弃第一个维度,并绘制第二个和第三个维度。我们抛弃第一个维度的原因很有趣。对于文档,第一个维度与文档的长度相关联。对于单词,它与该单词在所有文档中出现的次数相关联。如果我们通过从每列中减去平均列值来使矩阵居中,那么我们将使用第一个维度。类比一下高尔夫记分系统,我们不想知道实际得分,我们想知道它与标准杆的差距,这告诉我们球员是打了小鸟球、柏忌等。

enter image description here


有人在维基百科页面中删除了最后一段,为什么? - wordsforthewise
这条评论是由一个不存在的用户在2019年6月发布的,“他提到已经删除了LSI中有关寻找最优维度的不正确信息。” 我不确定引用70%数字的参考文献是否正确(它们似乎是PCA)。在R的lsa包中,默认使用50%。 - wordsforthewise

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接