Пример #1
0
        /// <summary>
        /// Вычислить значение хи-квадрат
        /// </summary>
        /// <param name="values"></param>
        /// <param name="intervalNumber"></param>
        /// <returns></returns>
        public static double GetChiSquared(double[] values, int intervalNumber)
        {
            DescriptiveStatistic stat = new DescriptiveStatistic(values);

            int[]     m     = new int[intervalNumber];    //эмпирические частоты
            double[]  mt    = new double[intervalNumber]; //теоретические частоты
            const int round = 13;                         //насколько округлять расчеты, делается, чтобы все значения попали в интервал
            //формирование массива m
            double step = (stat.Interval) / intervalNumber;

            foreach (double val in values)
            {
                for (int i = 0; i < intervalNumber; i++)
                {
                    if (Math.Round(val, round) <= Math.Round(stat.Min + step * (i + 1), round))
                    {
                        ++m[i];
                        break;
                    }
                }
            }

            if (m.Sum() != values.Length)
            {
                throw new Exception();
            }

            //формирование массива mt
            for (int i = 0; i < mt.Length; i++)
            {
                double x = stat.Min + step * i + step / 2;
                double u = (x - stat.Average) / stat.StandardDeviation;
                double f = Math.Pow(Math.E, -u * u / 2) / Math.Sqrt(2 * Math.PI);
                double p = (step / stat.StandardDeviation) * f;
                mt[i] = stat.Count * p;
            }

            Console.WriteLine(string.Join(", ", m) + "\n" + string.Join(", ", mt));

            //вычисление хи-квадрат
            double chiSquare = 0;

            for (int i = 0; i < intervalNumber; i++)
            {
                chiSquare += Math.Pow(m[i] - mt[i], 2) / mt[i];
            }

            return(chiSquare);
        }
Пример #2
0
        /// <summary>
        /// Получить таблицу со статистиками
        /// </summary>
        /// <param name="matrix"></param>
        /// <param name="round"></param>
        /// <returns></returns>
        public static double[][] GetTotalStatistic(double[][] matrix)
        {
            double[][] result = new double[Headers.Length][].Select(e => e = new double[matrix.Length]).ToArray();
            for (int i = 0; i < matrix.Length; i++)
            {
                DescriptiveStatistic stat = new DescriptiveStatistic(matrix[i]);
                int j = 0;
                foreach (double value in stat.GetNextStatistic())
                {
                    result[j][i] = value;
                    j++;
                }
            }

            return(MatrixOperations.Transpose(result));
        }
Пример #3
0
 /// <summary>
 /// Получить массив нормированных значений
 /// </summary>
 /// <returns></returns>
 public static double[][] GetNormalizedValues(double[][] values)
 {
     return(values.Select(e => e = new DescriptiveStatistic(e).GetNormalizedValues()).ToArray());
 }