java - 我需要一些关于这些公式实现的帮助

标签 java

我需要一些帮助来实现这些公式。我想我正确地实现了它们,但由于某种原因我没有得到预期的结果:

enter image description here

这分别是NMI、I、H函数的代码。 公式是否正确执行? 谢谢

int totalN = getTotalN(events);
        double h1 = H(clusters, totalN);
        double h2 = H(events, totalN);
        double valueI = I(clusters, events, totalN);
        double value_NMI = valueI / (double) ((h1 + h2) / (double) 2);
        System.out.println("NMI: " + value_NMI);

static public double I(HashMap<String, ArrayList<String>> clusters, HashMap<String, ArrayList<String>> events, int totalN) {

        //store sorted content to contents
        Iterator<Map.Entry<String, ArrayList<String>>> it = events.entrySet().iterator();
        Iterator<Map.Entry<String, ArrayList<String>>> it2 = clusters.entrySet().iterator();

        String key;
        ArrayList<String> event;
        ArrayList<String> cluster;

        double valueI = 0;
        while (it.hasNext()) {

            Map.Entry<String, ArrayList<String>> mapItem = it.next();
            key = mapItem.getKey();

            //if cluster doesn't exist
            //if(!clusters.containsKey(key)) continue;
            //cluster = clusters.get(key);

            event = mapItem.getValue();

            while (it2.hasNext()) {
                Map.Entry<String, ArrayList<String>> mapItem2 = it2.next();
                cluster = mapItem2.getValue();

            float common_docs = 0;
            for (int i=0; i< event.size(); i++) {   
                for (int j=0; j< cluster.size(); j++) { 
                    if (event.get(i).equals(cluster.get(j))) {
                        common_docs = common_docs + 1;
                        break;
                    }
                }
            }


            if (common_docs != 0) valueI = valueI + ( ( common_docs / (float) totalN) * Math.log((common_docs * totalN) / (float) (event.size() * cluster.size())) );       
            }
        }

        return valueI;
    }


    static public double H(HashMap<String, ArrayList<String>> clusters, int totalN) {

        //store sorted content to contents
        Iterator<Map.Entry<String, ArrayList<String>>> it = clusters.entrySet().iterator();
        ArrayList<String> cluster;

        double entropy = 0;
        while (it.hasNext()) {

            Map.Entry<String, ArrayList<String>> mapItem = it.next();
            cluster = mapItem.getValue();

            double ratio = cluster.size() / (float) totalN;
            entropy = entropy + ratio * Math.log(ratio);

        }

        return -entropy;
    }

    static public int getTotalN(HashMap<String, ArrayList<String>> dataset) {

        int totalN = 0;
        Iterator<Map.Entry<String, ArrayList<String>>> it = dataset.entrySet().iterator();
        ArrayList<String> item;

        while (it.hasNext()) {

            Map.Entry<String, ArrayList<String>> mapItem = it.next();
            item = mapItem.getValue();

            for (int i=0; i< item.size(); i++) {
                totalN = totalN + 1;
            }

        }

        return totalN ;
    }

最佳答案

我猜没有。我刚刚检查了 I(C,E),并且您不会在它的每次迭代中都重置 it2,这对于嵌套总和是必需的。

关于java - 我需要一些关于这些公式实现的帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5621397/

相关文章:

java - 处理来自 Spring 的 WebServiceTemplate.marshalSendAndReceive 的错误响应

java - 无法为 JSP : BooksWorker cannot be resolved 编译类

java - 如何设置 Lenskit 推荐工具包以在网站中运行?

java - Maven 无法在 ubuntu 上下载 archetype 的插件

java - 除打印提示和扫描仪之外的用户输入

java - 链接和组合 Jooq 命令

java - 如何使用 XML 中的 CXF JAX-RS 和 Jackson 2 配置服务器返回的日期格式?

java - 在 Lucene 中索引多级 JSON 对象

java - "No matching benchmarks"当在 eclipse 中从 main 运行 JMH 时

生成两个 Json 文件差异的 Java 库