Machine Learning Online Class

Exercise 7 | Principle Component Analysis and K-Means Clustering
Instructions
------------
This file contains code that helps you get started on the
exercise. You will need to complete the following functions:
pca.m
projectData.m
recoverData.m
computeCentroids.m
findClosestCentroids.m
kMeansInitCentroids.m
For this exercise, you will not need to change any code in this file,
or any other files other than those mentioned above.

Initialization

clear ; close all; clc;

================= Part 1: Find Closest Centroids ====================

To help you implement K-Means, we have divided the learning algorithm
into two functions -- findClosestCentroids and computeCentroids. In this
part, you should complete the code in the findClosestCentroids function.
fprintf('Finding closest centroids.\n\n');
Finding closest centroids.
% Load an example dataset that we will be using
load('ex7data2.mat');
% X 300x2
% Select an initial set of centroids
K = 3; % 3 Centroids
initial_centroids = [3 3; 6 2; 8 5];
% Find the closest centroids for the examples using the
% initial_centroids
idx = findClosestCentroids(X, initial_centroids);
fprintf('Closest centroids for the first 3 examples: \n')
Closest centroids for the first 3 examples:
fprintf(' %d', idx(1:3));
1 3 2
fprintf('\n(the closest centroids should be 1, 3, 2 respectively)\n');
(the closest centroids should be 1, 3, 2 respectively)

===================== Part 2: Compute Means =========================

After implementing the closest centroids function, you should now
complete the computeCentroids function.
fprintf('\nComputing centroids means.\n\n');
Computing centroids means.
% Compute means based on the closest centroids found in the previous part.
centroids = computeCentroids(X, idx, K);
fprintf('Centroids computed after initial finding of closest centroids: \n')
Centroids computed after initial finding of closest centroids:
fprintf(' %f %f \n' , centroids');
2.428301 3.157924
5.813503 2.633656
7.119387 3.616684
fprintf('\n(the centroids should be\n');
(the centroids should be
fprintf(' [ 2.428301 3.157924 ]\n');
[ 2.428301 3.157924 ]
fprintf(' [ 5.813503 2.633656 ]\n');
[ 5.813503 2.633656 ]
fprintf(' [ 7.119387 3.616684 ]\n\n');
[ 7.119387 3.616684 ]

=================== Part 3: K-Means Clustering ======================

After you have completed the two functions computeCentroids and
findClosestCentroids, you have all the necessary pieces to run the
kMeans algorithm. In this part, you will run the K-Means algorithm on
the example dataset we have provided.
fprintf('\nRunning K-Means clustering on example dataset.\n\n');
Running K-Means clustering on example dataset.
% Load an example dataset
load('ex7data2.mat');
% Settings for running K-Means
K = 3;
max_iters = 10;
% For consistency, here we set centroids to specific values
% but in practice you want to generate them automatically, such as by
% settings them to be random examples (as can be seen in
% kMeansInitCentroids).
initial_centroids = [3 3; 6 2; 8 5];
% Run K-Means algorithm. The 'true' at the end tells our function to plot
% the progress of K-Means
% 这里不便于使用实时脚本观测,实时脚本只能输出最后的图像
[centroids, idx] = runkMeans(X, initial_centroids, max_iters, true);
K-Means iteration 1/10...
Press enter in console to continue.
K-Means iteration 2/10...
Press enter in console to continue.
fprintf('\nK-Means Done.\n\n');

============= Part 4: K-Means Clustering on Pixels ===============

In this exercise, you will use K-Means to compress an image. To do this,
you will first run K-Means on the colors of the pixels in the image and
then you will map each pixel onto its closest centroid.
You should now complete the code in kMeansInitCentroids.m
fprintf('\nRunning K-Means clustering on pixels from an image.\n\n');
Running K-Means clustering on pixels from an image.
% Load an image of a bird
A = double(imread('bird_small.png'));
% If imread does not work for you, you can try instead
% load ('bird_small.mat');
A = A / 255; % Divide by 255 so that all values are in the range 0 - 1
% Size of the image
img_size = size(A)
img_size = 1×3
128 128 3
% Reshape the image into an Nx3 matrix where N = number of pixels.
% Each row will contain the Red, Green and Blue pixel values
% This gives us our dataset matrix X that we will use K-Means on.
% 将A重构为Nx3
X = reshape(A, img_size(1) * img_size(2), 3);
% 将各像素作为样本,这针对的是一幅图片
% Run your K-Means algorithm on this data
% You should try different values of K and max_iters here
% 压缩到十六种颜色,即十六类颜色
K = 16;
max_iters = 10;
% When using K-Means, it is important the initialize the centroids
% randomly.
% You should complete the code in kMeansInitCentroids.m before proceeding
initial_centroids = kMeansInitCentroids(X, K);
% Run K-Means
[centroids, idx] = runkMeans(X, initial_centroids, max_iters);
K-Means iteration 1/10...
K-Means iteration 2/10...
K-Means iteration 3/10...
K-Means iteration 4/10...
K-Means iteration 5/10...
K-Means iteration 6/10...
K-Means iteration 7/10...
K-Means iteration 8/10...
K-Means iteration 9/10...
K-Means iteration 10/10...

================= Part 5: Image Compression ======================

In this part of the exercise, you will use the clusters of K-Means to
compress an image. To do this, we first find the closest clusters for
each example. After that, we
fprintf('\nApplying K-Means to compress an image.\n\n');
Applying K-Means to compress an image.
% Find closest cluster members
idx = findClosestCentroids(X, centroids);
% Essentially, now we have represented the image X as in terms of the
% indices in idx.
% We can now recover the image from the indices (idx) by mapping each pixel
% (specified by its index in idx) to the centroid value
X_recovered = centroids(idx,:);
% Reshape the recovered image into proper dimensions
X_recovered = reshape(X_recovered, img_size(1), img_size(2), 3);
% Display the original image
subplot(1, 2, 1);
% imagesc(C) 将数组 C 中的数据显示为一个图像,该图像使用颜色图中的全部颜色。
imagesc(A);
title('Original');
% Display compressed image side by side
subplot(1, 2, 2);
imagesc(X_recovered)
title(sprintf('Compressed, with %d colors.', K));