Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何确定潜在语义分析的维度数?_Java_Theory_Svd_Lsa_Latent Semantic Indexing - Fatal编程技术网

Java 如何确定潜在语义分析的维度数?

Java 如何确定潜在语义分析的维度数?,java,theory,svd,lsa,latent-semantic-indexing,Java,Theory,Svd,Lsa,Latent Semantic Indexing,我最近一直在做潜在语义分析。我使用Jama包在java中实现了它 代码如下: Matrix vtranspose ; a = new Matrix(termdoc); termdoc = a.getArray(); a = a.transpose() ; SingularValueDecomposition sv =new SingularValueDecomposition(a) ; u = sv.getU(); v = sv

我最近一直在做潜在语义分析。我使用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) :

LSI面临的另一个挑战是据称在 确定用于执行以下操作的最佳尺寸数: SVD。一般来说,维度越少,比较范围就越广 包含在文本集合中的概念,而 尺寸的数量可实现更具体(或更相关) 概念比较。可以使用的实际尺寸数 使用受集合中文档数量的限制。研究 已经证明,大约300个尺寸通常会提供 使用中等大小的文档集(数百个)获得最佳效果 数千个文档),更大的文档可能有400个维度 收藏(数百万份文件)。然而,最近的研究表明 根据尺寸和性质,50-1000个尺寸是合适的 文档集合的一部分

计算SVD后检查数据中的方差量 可用于确定要保留的最佳尺寸数。 数据中包含的差异可以通过绘制 屏幕图中的奇异值。一些LSI从业者选择 与作为分界点的曲线拐点相关联的维度 要保留的标注数的点。其他人则认为 必须保留差异的数量,以及差异的金额 在数据中,应指定要保留的适当维度。 百分之七十经常被称为是项目中的差异量 用于选择最佳维度的数据 重新计算SVD



2) :

使用SVD的诀窍在于计算出有多少个维度或维度 近似矩阵时使用的“概念”。维度太少 而重要的图案被遗漏了,太多和噪音造成的 随机选择的单词会重新出现。 SVD算法有点复杂,但幸运的是Python有一个 使其易于使用的库函数。通过添加一行 对于我们的LSA类,我们可以将我们的矩阵分解为3个因子 矩阵。U矩阵为我们提供了每个单词的坐标 “概念”空间中,Vt矩阵为我们提供了每个 文档在我们的“概念”空间中,以及奇异值的S矩阵中 给我们一个线索,关于我们需要多少维度或“概念” 包括

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

为了 选择合适的维数,我们可以制作直方图 奇异值的平方。这张图表显示了每种方法的重要性 奇异值有助于近似我们的矩阵。这是你的电话号码 我们的例子中的直方图

对于大型文档集合,使用的维度数为 在100到500之间。在我们的小示例中,因为我们要绘制 它,我们将使用3维,去掉第一维,然后用图表 第二和第三维度

我们抛弃第一维度的原因很有趣。对于 文档中,第一个维度与文档的长度相关 文件。对于单词,它与该单词的次数相关 已在所有文档中使用。如果我们把矩阵放在中心 从每列中减去平均列值,我们将 使用第一个维度。作为一个类比,考虑高尔夫得分。我们没有 想知道实际的分数,我们想知道之后的分数 从平价中减去它。这告诉我们球员是否犯了错误 小鸟、转向架等



3) 兰道尔,T.K.,福尔茨,P.W.,拉厄姆,D.,1998,“潜在语义导论” 《分析》,话语过程,25259-284:


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