private double log(double num, int base){
return Math.log(num)/Math.log(base);
}
public double entropy(List<String> data){
double entropy = 0.0;
double prob = 0.0;
if(this.iFrequency.getKeys().length==0){
this.setInterestedFrequency(data);
}
String[] keys = iFrequency.getKeys();
for(int i=0;i<keys.length;i++){
prob = iFrequency.getPct(keys[i]);
entropy = entropy - prob * log(prob,2);
}
iFrequency.clear();
return entropy;
}
我写了一个计算数据集熵的函数。该功能正常,数学正确。如果我使用小数据集,一切都会好的,但问题是我正在使用这个函数来计算有成千上万或几万成员的集合的熵,而我的算法运行缓慢。
除了我正在使用的算法之外,还有其他算法可用于计算集合的熵吗?如果没有,是否有任何优化可以添加到我的代码中以使其运行得更快?
我发现了this个问题,但他们并没有详细说明。
答案 0 :(得分:1)
首先,您似乎构建了一个O(N ^ 2)算法,因为您重新计算每次调用getPct时的计数总和。我建议两个操作: (1)对计数求和并存储该值。手动计算概率值[i] / sum。 (2)如果您将熵计算为总和概率* Math.log(概率),您将节省少量时间。当您完成所有操作后,请通过Math.log(2)将划分为。