键按下划线聚合哈希值

时间:2014-03-28 19:10:39

标签: node.js hash functional-programming machine-learning underscore.js

我从事机器学习应用程序。当我需要使用数组和哈希值时,我使用了underscorejs。

问题在于,在ML中有一种cross-validation方法,当你需要计算多次折叠的表现时。

对于每个折叠,我有一个性能参数的散列,如下面的

{ 'F1': 0.8,
'Precision': 0.7,
'Recall':0.9
}

我将所有哈希值推送到数组,最后我有一个哈希数组,如下所示

[  { 'F1': 0.8,
    'Precision': 0.7,
    'Recall':0.9
    },
  { 'F1': 0.5,
    'Precision': 0.6,
    'Recall':0.4
    },
  { 'F1': 0.4,
    'Precision': 0.3,
    'Recall':0.4
    }
]

问题是,最后我想计算散列的每个参数的平均值,即我想通过参数总结所有散列,然后将每个参数除以折叠数,在我的情况下为3. / p>

如果使用下划线和javascript有任何优雅的方法吗?

有一点很重要,有时我需要进行这种聚合,当折叠的哈希值如下

{
label1:{ 'F1': 0.8,
    'Precision': 0.7,
    'Recall':0.9
    },
label2:{ 'F1': 0.8,
    'Precision': 0.7,
    'Recall':0.9
    },
...
}

任务是相同的,F1,Precision,Recall的平均值,适用于所有折叠中的每个标签。

目前我有一些丑陋的解决方案可以多次运行所有哈希,感谢您的帮助,谢谢。

1 个答案:

答案 0 :(得分:2)

如果是数组,只需使用数组即可。如果它不是数组,请使用_.values将其变为一个并使用它。然后,我们可以对数据进行折叠(或reduce):

_.reduce(data, function(memo, obj) {
  return {
    F1: memo.F1 + obj.F1,
    Precision: memo.Precision + obj.Precision,
    Recall: memo.Recall + obj.Recall,
    count: memo.count + 1
  };
}, {F1: 0, Precision: 0, Recall: 0, count: 0})

这会返回一个包含F1PrecisionRecall的哈希值,它们是和,而count是对象的数量。从那些人那里获得平均值应该很容易。