Exemple #1
0
        //основная функция
        private void BaseFunc(double[,] Data, out double[] Koef, out double[] Ym)
        {
            int N = Data.Length / Q_Col;           //кол-во строк
            int M = Q_Col - 1;                     //кол-во столбцов X

            double[,] x = new double[N - Nstr, M]; //независимые случайные величины
            double[] y = new double[N - Nstr];     //зависимая СВ
            int      i = 0;
            int      j = 0;

            //разделим основной массив на Х и У
            for (i = 0; i < N - Nstr; i++)
            {
                for (j = 0; j < Q_Col; j++)
                {
                    if (j != (Q_Col - 1))
                    {
                        x[i, j] = Data[i, j];                   // TestBox.AppendText(x[i,j].ToString());}
                    }
                    else
                    {
                        y[i] = Data[i, j];   //TestBox.AppendText(y[i].ToString());}
                    }
                }
            }
            //Оценка мат. ож. Х
            double[] ChMx = new double[M];
            for (i = 0; i < M; i++)
            {
                ChMx[i] = 0;                       //начальные значение
            }
            double[] Mx = new double[M];;
            for (j = 0; j < M; j++)
            {
                for (i = 0; i < N - Nstr; i++)
                {
                    ChMx[j] += x[i, j];
                }
                Mx[j] = ChMx[j] / N - Nstr;
            }

            //Оценка мат. ож. Y
            double ChMy = 0;
            double My;
            for (i = 0; i < N - Nstr; i++)
            {
                ChMy += y[i];
            }
            My = ChMy / N - Nstr;

            //Оценка дисперсии Х
            double[] ChDx = new double[M];
            double[] Dx   = new double[M];
            for (j = 0; j < M; j++)
            {
                for (i = 0; i < N - Nstr; i++)
                {
                    ChDx[j] += Math.Pow((x[i, j] - Mx[j]), 2);
                }
                Dx[j] = ChDx[j] / (N - Nstr - 1);
            }

            //Оценка дисперсии Y
            double ChDy = 0;
            double Dy;
            for (i = 0; i < N - Nstr; i++)
            {
                ChDy += Math.Pow((y[i] - My), 2);
            }
            Dy = ChDy / (N - Nstr - 1);

            //Оценка коэф-тов корреляции между зависимыми и независимыми СВ
            double[] ChRxy  = new double[M];
            double[] ZnRxy1 = new double[M];
            double[] ZnRxy2 = new double[M];
            double[] Rxy    = new double[M];
            for (j = 0; j < M; j++)
            {
                for (i = 0; i < N - Nstr; i++)
                {
                    ChRxy[j]  += (x[i, j] - Mx[j]) * (y[i] - My);
                    ZnRxy1[j] += Math.Pow((x[i, j] - Mx[j]), 2);
                    ZnRxy2[j] += Math.Pow((y[i] - My), 2);
                }
                Rxy[j] = ChRxy[j] / Math.Sqrt(ZnRxy1[j] * ZnRxy2[j]);
            }

            //Оценка коэф-тов корреляции между независимыми СВ
            double[] ChRxx  = new double[M];
            double[] ZnRxx1 = new double[M];
            double[] ZnRxx2 = new double[M];
            double[,] Rxx = new double[M, M];
            for (j = 0; j < M; j++)
            {
                for (int k = 0; k < M; k++)
                {
                    for (i = 0; i < N - Nstr; i++)
                    {
                        ChRxx[j]  += (x[i, j] - Mx[j]) * (x[i, k] - Mx[k]);
                        ZnRxx1[j] += Math.Pow((x[i, j] - Mx[j]), 2);
                        ZnRxx2[j] += Math.Pow((x[i, k] - Mx[k]), 2);
                    }
                    Rxx[j, k] = ChRxx[j] / Math.Sqrt(ZnRxx1[j] * ZnRxx2[j]);
                }
            }

            Koef = new double[M + 1];
            for (i = 0; i < M + 1; i++)
            {
                Koef[i] = 0;
            }

            //дополним матрицу Х единичным столбцом
            double[,] newX = new double[N - Nstr, M + 1];
            for (i = 0; i < N - Nstr; i++)
            {
                for (j = 0; j < M + 1; j++)
                {
                    if (j == 0)
                    {
                        newX[i, j] = 1;
                    }
                    else
                    {
                        newX[i, j] = x[i, j - 1];
                    }
                    //richTextBox1.AppendText(newX[i, j].ToString() + "\t");
                }
                //richTextBox1.AppendText("\n");
            }

            double[,] xT = new double[newX.GetLength(1), newX.GetLength(0)];
            Transpose(newX, out xT);
            double[,] xTx = new double[xT.GetLength(0), xT.GetLength(0)];
            Multiplication(xT, newX, out xTx);
            double[,] xTy  = new double[xT.GetLength(0), xT.GetLength(0)];
            double[,] newY = new double[N - Nstr, 1];  //для корректного умножения
            for (i = 0; i < N - Nstr; i++)
            {
                newY[i, 0] = y[i];
            }
            Multiplication(xT, newY, out xTy);
            double[,] xTxConv = new double[xTx.GetLength(0), xTx.GetLength(1)];
            Converting(xTx, out xTxConv);
            double[,] K = new double[xTxConv.GetLength(0), xTxConv.GetLength(0)];
            Multiplication(xTxConv, xTy, out K);

            Ym = new double[N - Nstr];
            for (i = 0; i < M + 1; i++)
            {
                Koef[i] = K[i, 0];
            }

            for (i = 0; i < N - Nstr; i++)
            {
                for (j = 1; j < M; j++)
                {
                    Ym[i] += Koef[j] * x[i, j - 1];
                }
                Ym[i] += Koef[0];
                if (Ym[i] < 0)
                {
                    Ym[i] = 0;              //если Ym<0, обнуляем
                }
            }


            //оценка остаточной дисперсии
            double ChDe = 0;
            double De;
            for (i = 0; i < N - Nstr; i++)
            {
                ChDe += Math.Pow((Ym[i] - y[i]), 2);
            }
            De = ChDe / (N - Nstr - M + 1 - 1);

            //Оценка коэффициента детерминации(коэффициент множественной корреляции)
            double R2 = Math.Abs(1 - De / Dy);

            //оценки дисперсий коэффициентов уравнения регрессии
            double[] Da = new double[M];
            double[,] Matrix = new double[N - Nstr, 1];
            double[,] MatrixT, MatrixT_Matrix, MatrixT_Matrix_Conv;

            for (j = 0; j < M; j++)
            {
                for (i = 0; i < N - Nstr; i++)
                {
                    Matrix[i, 0] = x[i, j];
                }
                Transpose(Matrix, out MatrixT);
                Multiplication(MatrixT, Matrix, out MatrixT_Matrix);
                Converting(MatrixT_Matrix, out MatrixT_Matrix_Conv);
                Da[j] = De * MatrixT_Matrix_Conv[0, 0];
            }

            //расчет статистики Z для проверки коэффициентов на  значимость
            double[] Z = new double[M];
            for (j = 0; j < M; j++)
            {
                Z[j] = Koef[j] / Math.Sqrt(Da[j]);
            }

            int q = N - Nstr - M - 1;  //количество степеней свобод
            double Tkr;
            Chart Chart1 = new Chart();
            Tkr = Chart1.DataManipulator.Statistics.InverseTDistribution(.05, q);   //критическое значение критерия Стьюдента, соответствующее вероятности 0,05
            double[] P = new double[M];
            i = 0;

            //вычислим достигнутые уровни значимости и выведем на экран
            foreach (double el in Z)
            {
                P[i] = Chart1.DataManipulator.Statistics.TDistribution(el, q, false);

                if (Math.Abs(el) > Tkr)
                {
                    Znachimost.AppendText(" - значимый. Р = " + Math.Round(P[i], 6) + "\n");
                }
                else
                {
                    Znachimost.AppendText(" - незначимый. Р = " + Math.Round(P[i], 6) + "\n");
                }
                i++;
            }

            //Оценка прогнозирующей способности
            double[,] x_new = new double[Nstr, M];
            double[] y_new  = new double[Nstr];
            double[] Ym_new = new double[Nstr];
            int n_new       = Nstr;

            for (i = N - n_new; i < N; i++)
            {
                for (j = 0; j < Q_Col; j++)
                {
                    if (j != (Q_Col - 1))
                    {
                        x_new[i - (N - n_new), j] = Data[i, j];
                    }
                    else
                    {
                        y_new[i - (N - n_new)] = Data[i, j];
                    }
                }
            }

            for (i = 0; i < n_new; i++)
            {
                for (j = 1; j < M; j++)
                {
                    Ym_new[i] += Koef[j] * x_new[i, j - 1];
                }
                Ym_new[i] += Koef[0];
            }

            //Оценка дисперсии адекватности
            double Dad   = 0;
            double ChDad = 0;
            for (i = 0; i < n_new; i++)
            {
                ChDad += Math.Pow((Ym_new[i] - y_new[i]), 2);
            }
            Dad = ChDad / n_new;

            Adekvatnost.AppendText("R2 = " + Math.Round(R2, 4) + "\nDe = " + Math.Round(De, 4) + "\nDad = " + Math.Round(Dad, 4) + "\n");
            double F   = Dad / De;
            double Fkr = Chart1.DataManipulator.Statistics.InverseFDistribution(.05, n_new, N - n_new - M - 1);
            if (F < Fkr)
            {
                Adekvatnost.AppendText("Модель адекватна\n");
            }
            else
            {
                Adekvatnost.AppendText("Модель неадекватна\n");
            }

            double p = 0;

            p = Chart1.DataManipulator.Statistics.FDistribution(F, n_new, q);
            Adekvatnost.AppendText("P = " + Math.Round(p, 4));

            //заполнение промежуточного файла данными о модели
            //полученное уравнение регрессии
            string str = "y = ";
            for (i = 0; i <= M; i++)
            {
                if (Koef[i] != null)
                {
                    if (i == 0)
                    {
                        str += +Koef[i];
                    }
                    else
                    {
                        str += " + " + Koef[i] + " * x" + i;
                    }
                }
            }

            File.WriteAllText("PromFile.txt", "\r\nПолученная модель: \r\n\r\n" + str + "\r\n\r\nФакторы:\r\n\r\nВключенные в модель:", Encoding.GetEncoding(1251));
            bool[] check = new bool[] { checkBox1.Checked, checkBox2.Checked, checkBox3.Checked, checkBox4.Checked };
            int k1       = 0;
            //включенные факторы
            for (i = 0; i < 4; i++)
            {
                if (check[i])
                {
                    File.AppendAllText("PromFile.txt", "\r\nx" + (i + 1), Encoding.GetEncoding(1251));

                    switch (i)
                    {
                    case 0: File.AppendAllText("PromFile.txt", " - средняя температура.\t", Encoding.GetEncoding(1251)); break;

                    case 1: File.AppendAllText("PromFile.txt", " - максимальная температура.\t", Encoding.GetEncoding(1251)); break;

                    case 2: File.AppendAllText("PromFile.txt", " - минимальная температура.\t", Encoding.GetEncoding(1251)); break;

                    case 3: File.AppendAllText("PromFile.txt", " - тепловая нагрузка.\t", Encoding.GetEncoding(1251)); break;
                    }


                    if (Math.Abs(Z[k1]) > Tkr)
                    {
                        File.AppendAllText("PromFile.txt", " Значимый.\tДостигнутый уровень значимости Р = " + Math.Round(P[k1], 6), Encoding.GetEncoding(1251));
                    }
                    else
                    {
                        File.AppendAllText("PromFile.txt", " Незначимый.\tДостигнутый уровень значимости Р = " + Math.Round(P[k1], 6), Encoding.GetEncoding(1251));
                    }
                    k1++;
                }
            }
            //исключенные факторы
            File.AppendAllText("PromFile.txt", "\r\n\r\nИсключенные из модели: \r\n", Encoding.GetEncoding(1251));
            for (i = 0; i < 4; i++)
            {
                if (!check[i])
                {
                    File.AppendAllText("PromFile.txt", "x" + (i + 1), Encoding.GetEncoding(1251));

                    switch (i)
                    {
                    case 0: File.AppendAllText("PromFile.txt", " - средняя температура.\t", Encoding.GetEncoding(1251)); break;

                    case 1: File.AppendAllText("PromFile.txt", " - максимальная температура.\t", Encoding.GetEncoding(1251)); break;

                    case 2: File.AppendAllText("PromFile.txt", " - минимальная температура.\t", Encoding.GetEncoding(1251)); break;

                    case 3: File.AppendAllText("PromFile.txt", " - тепловая нагрузка.\t", Encoding.GetEncoding(1251)); break;
                    }
                }
            }
            //характеристики модели
            File.AppendAllText("PromFile.txt", "\r\n\r\nХарактеристики модели: \r\n", Encoding.GetEncoding(1251));

            File.AppendAllText("PromFile.txt", "\r\nОценка коэффициентов корреляции между независимыми и зависимыми СВ: \r\nRxy[j] = ", Encoding.GetEncoding(1251));
            for (i = 0; i < M; i++)
            {
                File.AppendAllText("PromFile.txt", Rxy[i].ToString() + "\r\n");
            }

            File.AppendAllText("PromFile.txt", "\r\nОценка коэффициентов корреляции между независимыми СВ: \r\nRxx[i,j] = ", Encoding.GetEncoding(1251));
            for (i = 0; i < M; i++)
            {
                for (j = 0; j < M; j++)
                {
                    File.AppendAllText("PromFile.txt", Rxx[i, j].ToString() + "\t ");
                }
                File.AppendAllText("PromFile.txt", "\r\n");
            }

            File.AppendAllText("PromFile.txt", "\r\nОценка остаточной дисперсии: \r\nDe = ", Encoding.GetEncoding(1251));
            File.AppendAllText("PromFile.txt", De.ToString() + "\r\n");

            File.AppendAllText("PromFile.txt", "\r\nОценка коэффициента детерминации: \r\nR2 = ", Encoding.GetEncoding(1251));
            File.AppendAllText("PromFile.txt", R2.ToString() + "\r\n");

            File.AppendAllText("PromFile.txt", "\r\nОценка дисперсии коэффициентов уравнения регрессии: \r\nDa[j] = ", Encoding.GetEncoding(1251));
            for (i = 0; i < M; i++)
            {
                File.AppendAllText("PromFile.txt", Da[i].ToString() + "\r\n");
            }

            File.AppendAllText("PromFile.txt", "\r\nZ - статистика: \r\nZ[j] = ", Encoding.GetEncoding(1251));
            for (i = 0; i < M; i++)
            {
                File.AppendAllText("PromFile.txt", Z[i].ToString() + "\r\n");
            }

            File.AppendAllText("PromFile.txt", "\r\nКритическое значение критерия Стьюдента, соответствующее вероятности 0,05: \r\nTkr = ", Encoding.GetEncoding(1251));
            File.AppendAllText("PromFile.txt", Tkr.ToString() + "\r\n");

            File.AppendAllText("PromFile.txt", "\r\n\r\nМодель была построена на " + (N - n_new) + " данных. И проверена на " + n_new + " данных.\r\n\r\nОценка дисперсии адекватности: \r\nDad = ", Encoding.GetEncoding(1251));
            File.AppendAllText("PromFile.txt", Dad.ToString() + "\r\n");

            File.AppendAllText("PromFile.txt", "\r\nКритерий Фишера: \r\nF = ", Encoding.GetEncoding(1251));
            File.AppendAllText("PromFile.txt", F.ToString() + "\r\n");

            File.AppendAllText("PromFile.txt", "\r\nКритическое значение критерия Фишера: \r\nFkr = ", Encoding.GetEncoding(1251));
            File.AppendAllText("PromFile.txt", Fkr.ToString() + "\r\n");

            if (F < Fkr)
            {
                File.AppendAllText("PromFile.txt", "\r\nМодель адекватна\r\n", Encoding.GetEncoding(1251));
            }
            else
            {
                File.AppendAllText("PromFile.txt", "\r\nМодель неадекватна\r\n", Encoding.GetEncoding(1251));
            }
            File.AppendAllText("PromFile.txt", "\r\nДостигнутый уровень значимости: \r\nP = ", Encoding.GetEncoding(1251));
            File.AppendAllText("PromFile.txt", p.ToString() + "\r\n");

            File.AppendAllText("PromFile.txt", "________________________________________________________________________________________\r\n\r\n");
        }