protected virtual void _CalcGradient(double[] solution, double[] grad) { GradientEstimation.CalcGradient(solution, grad, (s, constraints) => { return(Evaluate(s)); }); mEvaluationCount += mDimensionCount; }
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]); } }