123456789101112131415161718192021222324252627282930313233343536373839404142434445464748 |
- function checkCostFunction(lambda)
- %CHECKCOSTFUNCTION Creates a collaborative filering problem
- %to check your cost function and gradients
- % CHECKCOSTFUNCTION(lambda) Creates a collaborative filering problem
- % to check your cost function and gradients, it will output the
- % analytical gradients produced by your code and the numerical gradients
- % (computed using computeNumericalGradient). These two gradient
- % computations should result in very similar values.
- % Set lambda
- if ~exist('lambda', 'var') || isempty(lambda)
- lambda = 0;
- end
- %% Create small problem
- X_t = rand(4, 3);
- Theta_t = rand(5, 3);
- % Zap out most entries
- Y = X_t * Theta_t';
- Y(rand(size(Y)) > 0.5) = 0;
- R = zeros(size(Y));
- R(Y ~= 0) = 1;
- %% Run Gradient Checking
- X = randn(size(X_t));
- Theta = randn(size(Theta_t));
- num_users = size(Y, 2);
- num_movies = size(Y, 1);
- num_features = size(Theta_t, 2);
- numgrad = computeNumericalGradient( ...
- @(t) cofiCostFunc(t, Y, R, num_users, num_movies, ...
- num_features, lambda), [X(:); Theta(:)]);
- [cost, grad] = cofiCostFunc([X(:); Theta(:)], Y, R, num_users, ...
- num_movies, num_features, lambda);
- disp([numgrad grad]);
- fprintf(['The above two columns you get should be very similar.\n' ...
- '(Left-Your Numerical Gradient, Right-Analytical Gradient)\n\n']);
- diff = norm(numgrad-grad)/norm(numgrad+grad);
- fprintf(['If your cost function implementation is correct, then \n' ...
- 'the relative difference will be small (less than 1e-9). \n' ...
- '\nRelative Difference: %g\n'], diff);
- end
|