private double CalculateSecondOrderEntropy() { double entropy = 0; foreach (var byteProb in this.SecondOrderProbabilities) { Comb2 prevBytes = new Comb2(byteProb.Key.Previous, byteProb.Key.PPrevious); double pprevByteProb = this.ZeroOrderProbabilities[prevBytes.Previous]; double prevBytesProb = this.FirstOrderProbabilities[prevBytes]; entropy += pprevByteProb * prevBytesProb * byteProb.Value * Math.Log2(byteProb.Value); } entropy *= -1; return(entropy); }
private Dictionary <Comb2, double> CalculateFirstOrderProbabilities() { int bytesCount = this.Bytes.Count; Dictionary <Comb2, int> bytesCounts = new Dictionary <Comb2, int>(); for (int i = 1; i < bytesCount; i++) { Comb2 comb = new Comb2(this.Bytes[i], this.Bytes[i - 1]); if (!bytesCounts.ContainsKey(comb)) { bytesCounts[comb] = 0; } bytesCounts[comb]++; } Dictionary <Comb2, double> probabilities = new Dictionary <Comb2, double>(); Dictionary <byte, int> prevByteCombinationsCount = new Dictionary <byte, int>(); foreach (var byteCount in bytesCounts) { byte prevByte = byteCount.Key.Previous; int combinationsCount = 0; if (!prevByteCombinationsCount.ContainsKey(prevByte)) { combinationsCount = bytesCounts.Where(x => x.Key.Previous == prevByte).Sum(x => x.Value); prevByteCombinationsCount[prevByte] = combinationsCount; } else { combinationsCount = prevByteCombinationsCount[prevByte]; } probabilities[byteCount.Key] = (double)byteCount.Value / combinationsCount; } return(probabilities); }
private Dictionary <Comb3, double> CalculateSecondOrderProbabilities() { int bytesCount = this.Bytes.Count; Dictionary <Comb3, int> bytesCounts = new Dictionary <Comb3, int>(); for (int i = 2; i < bytesCount; i++) { Comb3 comb = new Comb3(this.Bytes[i], this.Bytes[i - 1], this.Bytes[i - 2]); if (!bytesCounts.ContainsKey(comb)) { bytesCounts[comb] = 0; } bytesCounts[comb]++; } Dictionary <Comb3, double> probabilities = new Dictionary <Comb3, double>(); Dictionary <Comb2, int> prevByteCombinationsCount = new Dictionary <Comb2, int>(); foreach (var byteCount in bytesCounts) { Comb2 prevBytes = new Comb2(byteCount.Key.Previous, byteCount.Key.PPrevious); int combinationsCount = 0; if (!prevByteCombinationsCount.ContainsKey(prevBytes)) { combinationsCount = bytesCounts.Where(x => new Comb2(x.Key.Previous, x.Key.PPrevious).Equals(prevBytes)).Sum(x => x.Value); prevByteCombinationsCount[prevBytes] = combinationsCount; } else { combinationsCount = prevByteCombinationsCount[prevBytes]; } probabilities[byteCount.Key] = (double)byteCount.Value / combinationsCount; } return(probabilities); }