/// <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); }
/// <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); }