12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- function [centroids, idx] = runkMeans(X, initial_centroids, ...
- max_iters, plot_progress)
- %RUNKMEANS runs the K-Means algorithm on data matrix X, where each row of X
- %is a single example
- % [centroids, idx] = RUNKMEANS(X, initial_centroids, max_iters, ...
- % plot_progress) runs the K-Means algorithm on data matrix X, where each
- % row of X is a single example. It uses initial_centroids used as the
- % initial centroids. max_iters specifies the total number of interactions
- % of K-Means to execute. plot_progress is a true/false flag that
- % indicates if the function should also plot its progress as the
- % learning happens. This is set to false by default. runkMeans returns
- % centroids, a Kxn matrix of the computed centroids and idx, a m x 1
- % vector of centroid assignments (i.e. each entry in range [1..K])
- %
- % Set default value for plot progress
- if ~exist('plot_progress', 'var') || isempty(plot_progress)
- plot_progress = false;
- end
- % Plot the data if we are plotting progress
- if plot_progress
- figure;
- hold on;
- end
- % Initialize values
- [m n] = size(X);
- K = size(initial_centroids, 1);
- centroids = initial_centroids;
- previous_centroids = centroids;
- idx = zeros(m, 1);
- % Run K-Means
- for i=1:max_iters
-
- % Output progress
- fprintf('K-Means iteration %d/%d...\n', i, max_iters);
- if exist('OCTAVE_VERSION')
- fflush(stdout);
- end
-
- % For each example in X, assign it to the closest centroid
- idx = findClosestCentroids(X, centroids);
-
- % Optionally, plot progress here
- if plot_progress
- plotProgresskMeans(X, centroids, previous_centroids, idx, K, i);
- previous_centroids = centroids;
- fprintf('Press enter to continue.\n');
- pause;
- end
-
- % Given the memberships, compute new centroids
- centroids = computeCentroids(X, idx, K);
- end
- % Hold off if we are plotting progress
- if plot_progress
- hold off;
- end
- end
|