有 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 ;
    }

共 (3) 个答案

  1. # 1 楼答案

    方法I中的迭代器it2应该在其上的循环内初始化。 通过使用“foreach”符号,您可以简化代码并避免此类错误:

    static public double I(HashMap<String, ArrayList<String>> clusters, HashMap<String, ArrayList<String>> events, int totalN) {
    
        String key;
        ArrayList<String> event;
        ArrayList<String> cluster;
    
        double valueI = 0;
        for (Map.Entry<String, ArrayList<String>> mapItem: events.entrySet()) {
            key = mapItem.getKey();
    
            //if cluster doesn't exist
            //if(!clusters.containsKey(key)) continue;
            //cluster = clusters.get(key);
    
            event = mapItem.getValue();
    
            for (Map.Entry<String, ArrayList<String>> mapItem2: clusters.entrySet()) {
                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
        ArrayList<String> cluster;
    
        double entropy = 0;
        for (Map.Entry<String, ArrayList<String>> mapItem: clusters.entrySet()) {
            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;
        ArrayList<String> item;
    
        for (Map.Entry<String, ArrayList<String>> mapItem: dataset.entrySet()) {
            item = mapItem.getValue();
    
            for (int i = 0; i < item.size(); i++) {
                totalN = totalN + 1;
            }
    
        }
    
        return totalN;
    }
    
  2. # 2 楼答案

    我想没有。我只是检查了I(C,E),在每次迭代中都没有重置它2,这对于嵌套和是必要的

  3. # 3 楼答案

    我的猜测是,由于浮点舍入错误,您没有得到预期的结果(有关更多详细信息,请参见this)。我没有看过您实现这三个函数的方法中的代码,但是我看到您使用了floatdouble,这可能会给您带来麻烦。您可能想改用^{}