public BigDecimal calculateEntropy( Map<Integer, AttributeValue> attributeValues, boolean withVariance) throws MLException { if (!withVariance) { return calculateEntropy(attributeValues); } else { BigDecimal attributeEntropyresult = new BigDecimal(0); for (AttributeValue attributeValue : attributeValues.values()) { int attributeValueCount = attributeValue.getAttributeValueCount(); BigDecimal innerVarianceResult = new BigDecimal(1); for (Integer corrospondingClassifiedCount : attributeValue.getClassifiedCountMap().values()) { BigDecimal fraction = BigDecimal.valueOf(corrospondingClassifiedCount) .divide(new BigDecimal(attributeValueCount), globalMathContext); innerVarianceResult.multiply(fraction, globalMathContext); } attributeValue.setEntropy(innerVarianceResult); BigDecimal attributeGlobalFraction = BigDecimal.valueOf(attributeValueCount) .divide(new BigDecimal(size()), globalMathContext); attributeEntropyresult = attributeEntropyresult.add(attributeGlobalFraction.multiply(innerVarianceResult)); } return attributeEntropyresult; } }
public BigDecimal calculateEntropy(Map<Integer, AttributeValue> attributeValues) throws MLException { BigDecimal attributeEntropyresult = new BigDecimal(0); for (AttributeValue attributeValue : attributeValues.values()) { int attributeCount = attributeValue.getAttributeValueCount(); BigDecimal innerResult = new BigDecimal(0); for (Integer corrospondingClassifiedCount : attributeValue.getClassifiedCountMap().values()) { BigDecimal fraction = BigDecimal.valueOf(corrospondingClassifiedCount) .divide(new BigDecimal(attributeCount), globalMathContext); BigDecimal logFraction = BigDecimal.valueOf(Math.log(fraction.doubleValue())) .divide(new BigDecimal(Math.log(2)), globalMathContext); innerResult = innerResult.add(fraction.multiply(logFraction, globalMathContext)); } innerResult = innerResult.negate(); attributeValue.setEntropy(innerResult); BigDecimal attributeGlobalFraction = BigDecimal.valueOf(attributeValue.getAttributeValueCount()) .divide(new BigDecimal(size()), globalMathContext); attributeEntropyresult = attributeEntropyresult.add(attributeGlobalFraction.multiply(innerResult)); } return attributeEntropyresult; }