www.pudn.com > neuroocr_src.zip > Statistics.cs


// AForge Math Library 
// 
// Copyright © Andrew Kirillov, 2005 
// andrew.kirillov@gmail.com 
// 
 
namespace AForge.Math 
{ 
	using System; 
 
	///  
	/// Set of statistics functions 
	///  
	public class Statistics 
	{ 
		///  
		/// Calculate mean value 
		///  
		/// Input: histogram array 
		///  
		public static double Mean(int[] values) 
		{ 
			int		v; 
			int		mean = 0; 
			int		total = 0; 
 
			// for all values 
			for (int i = 0, n = values.Length; i < n; i++) 
			{ 
				v = values[i]; 
 
				// accumulate mean 
				mean += i * v; 
				// accumalate total 
				total += v; 
			} 
 
			return (double) mean / total; 
		} 
 
 
		///  
		/// Calculate standard deviation 
		///  
		/// Input: histogram array 
		///  
		public static double StdDev(int[] values) 
		{ 
			double	mean = Mean(values); 
			double	stddev = 0; 
			double	t; 
			int		v; 
			int		total = 0; 
 
			// for all values 
			for (int i = 0, n = values.Length; i < n; i++) 
			{ 
				v = values[i]; 
				t = (double) i - mean; 
 
				// accumulate mean 
				stddev += t * t * v; 
				// accumalate total 
				total += v; 
			} 
 
			return Math.Sqrt(stddev / total); 
		} 
 
 
		///  
		/// Calculate median value 
		///  
		/// Input: histogram array 
		///  
		public static int Median(int[] values) 
		{ 
			int total = 0, n = values.Length; 
 
			// for all values 
			for (int i = 0; i < n; i++) 
			{ 
				// accumalate total 
				total += values[i]; 
			} 
 
			int halfTotal = total / 2; 
			int median, v; 
 
			// find median value 
			for (median = 0, v = 0; median < n; median++) 
			{ 
				v += values[median]; 
				if (v >= halfTotal) 
					break; 
			} 
 
			return median; 
		} 
 
 
		///  
		/// Get range around median containing specified percentile of values 
		///  
		/// Input: histogram array 
		///  
		public static Range GetRange(int[] values, double percent) 
		{ 
			int total = 0, n = values.Length; 
 
			// for all values 
			for (int i = 0; i < n; i++) 
			{ 
				// accumalate total 
				total += values[i]; 
			} 
 
			int min, max, v; 
			int h = (int)(total * (percent + (1 - percent) / 2)); 
 
			// get range min value 
			for (min = 0, v = total; min < n; min++) 
			{ 
				v -= values[min]; 
				if (v < h) 
					break; 
			} 
			// get range max value 
			for (max = n - 1, v = total;  max >= 0; max--) 
			{ 
				v -= values[max]; 
				if (v < h) 
					break; 
			} 
			return new Range(min, max); 
		} 
 
 
		///  
		/// Calculate an entropy 
		///  
		/// Input: histogram array 
		///  
		public static double Entropy(int[] values) 
		{ 
			int total = 0; 
 
			for (int i = 0, n = values.Length; i < n; i++) 
			{ 
				total += values[i]; 
			} 
 
			return Entropy(values, total); 
		} 
		public static double Entropy(int[] values, int total) 
		{ 
			int		n = values.Length; 
			double	e = 0; 
			double	p; 
 
			// for all values 
			for (int i = 0; i < n; i++) 
			{ 
				// get item probability 
				p = (double) values[i] / total; 
				// calculate entropy 
				if (p != 0) 
					e += (-p * Math.Log(p, 2)); 
			} 
			return e; 
		} 
	} 
}