我在Java中实现一个机器学习流程。其中包括一个表示调参的类。最终,我需要遍历所有调参对并计算准确率。例如,一个调参可能是k近邻算法中的k值,范围从1到9。
首先,哪种数据结构最适合存储调参?每个调参都与一组可能的值相关联。参数的值主要是双精度浮点数(或整数),但不仅仅如此,它们也可能是字符串。
其次,我想为这个对象创建某种迭代器。一个名为getNextPair()的方法应该返回下一组调参,直到hasNext()返回false。这样我就可以用一个while循环(而不是嵌套的for循环)来遍历它。
如何为getNextPair()和hasNext()方法计算所有调参对?当然,这在很大程度上取决于所使用的数据结构。
回答:
我建议使用多重映射(Multimaps)。它类似于映射(Map),但一个键可以有多个值。
Guava实现了多重映射,你可以用单个循环来遍历它,如下所示:
Multimap<String, Double> mm = ArrayListMultimap.create(); mm.put("alpha", 0.0); mm.put("alpha", 0.7); mm.put("alpha", 0.9); for (double lambda = 0.0; lambda < 2.0; lambda += .25) mm.put("lambda", lambda); List<Double> A = (List<Double>)mm.get("alpha"); System.out.println(A); System.out.println("alpha的值的数量: " + A.size()); for (Map.Entry<String, Double> e : mm.entries()) System.out.println(e); System.out.println("元素数量:" + mm.entries().size());
有一个很好的教程在这里。希望对你有帮助。