protected virtual void _CalcGradient(double[] solution, double[] grad)
 {
     GradientEstimation.CalcGradient(solution, grad, (s, constraints) =>
     {
         return(Evaluate(s));
     });
     mEvaluationCount += mDimensionCount;
 }
Exemple #2
0
        public static void Test_CollaborativeFilteringRSCostFunction_CalcGradient(double lambda = 0)
        {
            Matrix <double> X_t     = CreateRandomMatrix(4, 3);
            Matrix <double> Theta_t = CreateRandomMatrix(5, 3);

            Matrix <double> Y = X_t.Multiply(Theta_t.Transpose());

            int[,] R = new int[Y.RowCount, Y.ColumnCount];

            for (int i = 0; i < Y.RowCount; ++i)
            {
                for (int j = 0; j < Y.ColumnCount; ++j)
                {
                    if (mRand.NextDouble() > 0.5)
                    {
                        Y[i, j] = 0;
                    }
                    if (Y[i, j] == 0)
                    {
                        R[i, j] = 0;
                    }
                    else
                    {
                        R[i, j] = 1;
                    }
                }
            }


            Matrix <double> X            = CreateRandomMatrix(4, 3);
            Matrix <double> Theta        = CreateRandomMatrix(5, 3);
            int             num_users    = Y.ColumnCount;
            int             num_movies   = Y.RowCount;
            int             num_features = Theta_t.ColumnCount;

            int dimension = num_movies * num_features + num_users * num_features; //total number of entries in X and Theta

            double[] theta_x = new double[dimension];
            CollaborativeFilteringRSCostFunction.UnrollMatrixIntoVector(Theta, X, theta_x);

            CollaborativeFilteringRSCostFunction f = new CollaborativeFilteringRSCostFunction(Y, R, num_movies, num_features, dimension);

            f.RegularizationLambda = lambda;

            double[] numgrad = new double[dimension];
            double[] grad    = new double[dimension];
            GradientEstimation.CalcGradient(theta_x, numgrad, (x_pi, constraints) =>
            {
                return(f.Evaluate(x_pi));
            });
            f.CalcGradient(theta_x, grad);

            Console.WriteLine("The relative difference will be small:");
            for (int i = 0; i < dimension; ++i)
            {
                Console.WriteLine("{0}\t{1}", numgrad[i], grad[i]);
            }
        }