/// <summary> Computes entropy of distribution before splitting.</summary>
		public double oldEnt(Distribution bags)
		{
			
			double returnValue = 0;
			int j;
			
			for (j = 0; j < bags.numClasses(); j++)
				returnValue = returnValue + logFunc(bags.perClass(j));
			return logFunc(bags.total()) - returnValue;
		}
		/// <summary> Computes entropy of distribution after splitting.</summary>
		public double newEnt(Distribution bags)
		{
			
			double returnValue = 0;
			int i, j;
			
			for (i = 0; i < bags.numBags(); i++)
			{
				for (j = 0; j < bags.numClasses(); j++)
					returnValue = returnValue + logFunc(bags.perClassPerBag(i, j));
				returnValue = returnValue - logFunc(bags.perBag(i));
			}
			return - returnValue;
		}
Esempio n. 3
0
		/// <summary> Computes entropy of test distribution with respect to training distribution.</summary>
		public override double splitCritValue(Distribution train, Distribution test)
		{
			
			double result = 0;
			int numClasses = 0;
			int i, j;
			
			// Find out relevant number of classes
			for (j = 0; j < test.numClasses(); j++)
				if (Utils.gr(train.perClass(j), 0) || Utils.gr(test.perClass(j), 0))
					numClasses++;
			
			// Compute entropy of test data with respect to training data
			for (i = 0; i < test.numBags(); i++)
				if (Utils.gr(test.perBag(i), 0))
				{
					for (j = 0; j < test.numClasses(); j++)
						if (Utils.gr(test.perClassPerBag(i, j), 0))
							result -= test.perClassPerBag(i, j) * System.Math.Log(train.perClassPerBag(i, j) + 1);
					result += test.perBag(i) * System.Math.Log(train.perBag(i) + numClasses);
				}
			
			return result / log2;
		}
Esempio n. 4
0
		/// <summary> Creates distribution with two bags by merging all bags apart of
		/// the indicated one.
		/// </summary>
		public Distribution(Distribution toMerge, int index)
		{
			
			int i;
			
			totaL = toMerge.totaL;
			m_perClass = new double[toMerge.numClasses()];
			Array.Copy(toMerge.m_perClass, 0, m_perClass, 0, toMerge.numClasses());
			m_perClassPerBag = new double[2][];
			for (int i2 = 0; i2 < 2; i2++)
			{
				m_perClassPerBag[i2] = new double[0];
			}
			m_perClassPerBag[0] = new double[toMerge.numClasses()];
			Array.Copy(toMerge.m_perClassPerBag[index], 0, m_perClassPerBag[0], 0, toMerge.numClasses());
			m_perClassPerBag[1] = new double[toMerge.numClasses()];
			for (i = 0; i < toMerge.numClasses(); i++)
				m_perClassPerBag[1][i] = toMerge.m_perClass[i] - m_perClassPerBag[0][i];
			m_perBag = new double[2];
			m_perBag[0] = toMerge.m_perBag[index];
			m_perBag[1] = totaL - m_perBag[0];
		}
Esempio n. 5
0
		/// <summary> Creates distribution with only one bag by merging all
		/// bags of given distribution.
		/// </summary>
		public Distribution(Distribution toMerge)
		{
			
			totaL = toMerge.totaL;
			m_perClass = new double[toMerge.numClasses()];
			Array.Copy(toMerge.m_perClass, 0, m_perClass, 0, toMerge.numClasses());
			m_perClassPerBag = new double[1][];
			for (int i = 0; i < 1; i++)
			{
				m_perClassPerBag[i] = new double[0];
			}
			m_perClassPerBag[0] = new double[toMerge.numClasses()];
			Array.Copy(toMerge.m_perClass, 0, m_perClassPerBag[0], 0, toMerge.numClasses());
			m_perBag = new double[1];
			m_perBag[0] = totaL;
		}