gpt4 book ai didi

java - 归一化 double 值时的 NAN

转载 作者:行者123 更新时间:2023-12-01 18:30:47 24 4
gpt4 key购买 nike

我正在尝试计算文件的 tfidf 值并将它们保存到矩阵中,我想首先将 tfidf 值标准化在 0 和 1 之间。但我有一个问题,归一化后计算的第一个值是 NAN,我该如何解决这个问题。

这就是我所做的

    double tf; //term frequency
double idf; //inverse document frequency
double tfidf = 0; //term frequency inverse document frequency
double minValue=0.0;
double maxValue=0;
File output = new File("E:/hsqldb-2.3.2/hsqldb-2.3.2/hsqldb/hsqldb/matrix.txt");
FileWriter out = new FileWriter(output);
mat= new String[termsDocsArray.size()][allTerms.size()];
int c=0; //for files
for (String[] docTermsArray : termsDocsArray) {
int count = 0;//for words
for (String terms : allTerms) {
tf = new TfIdf().tfCalculator(docTermsArray, terms);
idf = new TfIdf().idfCalculator(termsDocsArray, terms);
tfidf = tf * idf;
//System.out.print(terms+"\t"+tfidf+"\t");
//System.out.print(terms+"\t");

tfidf = Math.round(tfidf*10000)/10000.0d;
tfidfList.add(tfidf);
maxValue=Collections.max(tfidfList);
tfidf=(tfidf-minValue)/(maxValue-minValue); //Normalization here
mat[c][count]=Double.toString(tfidf);
count++;
}
c++;
}

这是我得到的输出

NaN 1.0  0.0  0.021
0.0 1.0 0.0 0.365 ... and others

只有第一个数字是NAN,而且这个数字原本是矩阵中重复多次的数字,但其值不是NAN

请给我一些解决此问题的想法。

谢谢

最佳答案

您正在除以零。当添加到 tfidflist 的第一个值为 0.0 时,就会发生这种情况。

为了执行真正的标准化,您可能必须首先计算所有可能的值,然后计算这些值的最小值/最大值,然后根据这些最小值标准化所有值/最大值。大致:

// First collect all values and compute min/max on the fly
double minValue=Double.MAX_VALUE;
double maxValue=-Double.MAX_VALUE;
double values = new String[termsDocsArray.size()][allTerms.size()];
int c=0; //for files
for (String[] docTermsArray : termsDocsArray) {
int count = 0;//for words
for (String terms : allTerms) {
double tf = new TfIdf().tfCalculator(docTermsArray, terms);
double idf = new TfIdf().idfCalculator(termsDocsArray, terms);
double tfidf = tf * idf;
tfidf = Math.round(tfidf*10000)/10000.0d;
minValue = Math.min(minValue, tfidf);
maxValue = Math.max(maxValue, tfidf);
values[c][count]=tfidf;
count++;
}
c++;
}

// Then, create the matrix containing the strings of the normalized
// values (although using strings here seems like a bad idea)
c=0; //for files
for (String[] docTermsArray : termsDocsArray) {
int count = 0;//for words
for (String terms : allTerms) {
double tfidf = values[c][count];
tfidf=(tfidf-minValue)/(maxValue-minValue); //Normalization here
mat[c][count]=Double.toString(tfidf);
count++;
}
c++;
}

关于java - 归一化 double 值时的 NAN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24333074/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com