我有一个这样的代码序列,它是数据挖掘算法的准确性检查的一部分。
即将经过训练的数据与我的算法中的某些预测值进行比较,并比较两个类别标签进行准确性检查。
说我的值是[No,No],[No,Yes],[1.0,1],[1,1],[1,0]
,它们是类标签
我想比较我预测数据的准确性
public void reduce(Text key, Iterable<Text> values, Context context)
Set<String> set = new HashSet<String>();
for (Text val : values) {
set.add(val.toString());
}
int count = set.size();
if(count == 1){
System.out.println("Correct class label");
corClass++;
}
else{
System.out.println("InCorrect class label");
}
[No,No]: Correct class label
[No,Yes]: InCorrect class label
[1.0,1]: InCorrect class label
[1,1]: Correct class label
[1,0]:InCorrect class label
对于我 [1.0,1] ,这会落入错误的classlabel 。
Set<String>
set将[1.0,1]视为不同,尽管它们相等但是为double和整数。
如何修复变通方法。
请建议
提前致谢。
答案 0 :(得分:3)
您似乎有规则,您的代码不尊重。你说1.0
是&#34; double&#34;。是否有规则确定代码在哪种条件下是双倍的?例如,是&#34; 1e10&#34;一双 - 1 x 10 ^ 10?或者是#34;是&#34;大概是?
1.0
和1
是不同的字符串。如果你有一些比较规则让这两件事情完全相同,你就必须在某个地方实施它 - 它不会通过魔法发生。从你的问题中不清楚这条规则究竟是什么,但无论它是什么,都要实施它。
答案 1 :(得分:1)
您没有存储一组严格的字符串,而是存储一组字符串和整数。你不知道接下来会把哪一个放进去,但你并不一定关心那个;您只是利用用例的设置属性。
你可以做什么,而不只是创建一个存储大多数任何对象的集合。
Set<?> set = new HashSet<>();
for (Text val : values) {
try {
set.add(Double.valueOf(val.toString()).intValue());
} catch (NumberFormatException nfe) {
set.add(val.toString());
}
}
当我们谈论使用异常作为控制流程时,这不是一件有吸引力的事情,但这会让你超越你的直接痛苦。
答案 2 :(得分:0)
目前,您使用一组字符串来存储数据。由于它是一组字符串,因此该集合将允许任何不相等字符串的元素。如果你正在编写一个不同的应用程序,你真的需要字符串相等,如果"1".equals("1.000")==true
,那会不会让人感到困惑?
在这种情况下,我认为最好不要使用套装......
此函数应适用于任何数字或基于字符串的相等:
public boolean stringOrDoubleEqual(String a,String b){
try{
//Change the 0.001 to the acceptable error for your application.
return Math.abs(Double.parseDouble(a)-Double.parseDouble(b))<0.001;
}catch(NumberFormatException e){
return a.equals(b);
}
}
如果这符合您的使用案例,我相信其余部分应该是自然而然的:)