/// <summary>
        /// 高斯牛頓法
        /// </summary>
        /// <param name="InitialthetaPosition">參數初始矩陣</param>
        /// <param name="x">輸入矩陣</param>
        /// <param name="y">輸出矩陣</param>
        /// <param name="Detalx">精確度</param>
        /// <param name="Classname">調用函數的類名</param>
        /// <param name="Methodname">調用函數的方法名</param>
        /// <param name="Param">調用參數</param>
        /// <returns></returns>
        public static double[,] GaussNewton(double[,] InitialthetaPosition, double[,] x, double[,] y, double Detalx, string Classname, string Methodname, object[] Param)
        {
            Type       t     = Type.GetType(Classname);
            MethodInfo minfo = t.GetMethod(Methodname);

            double[,] Yestimate   = (double[, ])minfo.Invoke(t, new object[] { x, InitialthetaPosition });
            double[,] Jacobi      = Calculas.JacobiMatrix(InitialthetaPosition, x, Detalx, Classname, Methodname, Param);
            double[,] DeltaTheata =
                Matrix.Product(
                    Matrix.Inverse(Matrix.Product(Matrix.Trans(Jacobi), Jacobi)),
                    Matrix.Product(Matrix.Trans(Jacobi), Matrix.Subtract(y, Matrix.Trans(Yestimate))));
            double[,] NewThetaPosition = InitialthetaPosition;
            for (int i = 0; i < InitialthetaPosition.GetLength(1); i++)
            {
                NewThetaPosition[0, i] = InitialthetaPosition[0, i] + DeltaTheata[i, 0] * 0.1;
            }
            return(NewThetaPosition);
        }
Beispiel #2
0
        /// <summary>
        /// P-值
        /// </summary>
        /// <param name="x">自变量,維度n*k</param>
        /// <param name="y">因变量,維度n*1,取值1或0</param>
        /// <param name="b">B,維度n*1的估计權值</param>
        /// <returns></returns>
        public static double[,] PValue(double[,] x, double[,] y, double[,] b)
        {
            int leng = b.GetLength(0);

            double[,] P = new double[leng, 1];
            for (int i = 0; i < leng; i++)
            {
                P[i, 0] = Calculas.Integral(-100, b[i, 0] / StandardErrorMatrix(x, y, b)[i, i], "Formulism.BaseMathMethod.Function", "Normal", 0.00001, new object[] {
                    0, 1
                });
                if (P[i, 0] > 0.5)
                {
                    P[i, 0] = (1 - P[i, 0]) * 2;
                }
                else
                {
                    P[i, 0] = P[i, 0] * 2;
                }
            }
            return(P);
        }