K均值聚类算法程序的主体:
% Initialize centroids
% 中心点初始化
centroids = kMeansInitCentroids(X, K);
for iter = 1:iterations
% Cluster assignment step: Assign each data point to the
% closest centroid. idx(i) corresponds to cˆ(i), the index
% of the centroid assigned to example i
% 将各点归类到距离最近的中心点
idx = findClosestCentroids(X, centroids);
% Move centroid step: Compute means based on centroid
% assignments
%计算各类的新中心点
centroids = computeMeans(X, idx, K);
end
任务:完成findClosestCentroids.m
,实现将各点都归类到最近的中心点。
输入:
X
,元素为所有点的位置centroids
,元素为K
个中心点的位置输出:
idx
,元素为每个点对应的中心点索引号(1,2,…,K)遍历所有点,计算点X(i,:)
与所有中心点centroids
的距离,将距离最小值所对应的索引赋值j
给idx(i)
。
for i = 1:length(X)
L = sum( (X(i,:) - centroids ).^2, 2);
[~,j] = min(L);
idx(i) = j;
end
任务:完成computeCentroids.m
,实现每一类的新中心点的计算。
输入:
X
,元素为所有点的位置idx
,元素为每个点对应的中心点索引号(1,2,…,K)K
输出:
centroids
,元素为K
个中心点的位置计算每类i
所属点X(idx == i,:)
的中心点(即平均点)
for i = 1:K
centroids(i,:) = mean(X(idx == i,:));
end
完成以上两个子函数,再运行ex7.m
就可以看到K均值聚类迭代的可视化过程。
ex7.m
的中心点初始化是人为给定的,但在实际应用中,更多的是随机从数据点中选取K
个点作为中心点。
任务:完成kMeansInitCentroids.m
,实现随机初始化。
输入:
X
,元素为所有点的位置K
输出:
centroids
,元素为K
个中心点的位置作业里直接给了下面的代码。首先,用randperm
函数随机排列样本的索引。然后,从打乱的样本中选择前K
个作为中心点。
% Randomly reorder the indices of examples
randidx = randperm(size(X, 1));
% Take the first K examples as centroids
centroids = X(randidx(1:K), :);
本节应用K均值聚类进行图像压缩。在图像的直接24位彩色表示中,每个像素表示为三个8位无符号整数(范围从0到255),分别为红色、绿色和蓝色的强度值。这种编码也被称为RGB编码。
目的:原图像的上千种颜色,压缩为16种颜色。
将原图像所有像素点的RGB值作为数据样本,使用K均值聚类将三维的RGB空间内的点聚类为16种。
完成之前的任务,可以直接实现该目标。如下图所示,左边为原图像,右边为压缩后的图像(16色)。
主成分分析包含了两个计算步骤:
svd
函数进行奇异值分解,计算主成分(本征向量) U 1 , U 2 , . . . , U n U_1, U_2,..., U_n U1,U2,...,Un任务:完成pca.m
,实现数据集主要成分的计算。
输入:
X
输出:
U
S
Sigma = 1 / m * X' * X;
[U, S, V] = svd(Sigma);
得到主成分后,用它们对数据进行降维,将数据投影到更低维的空间。
在实际应用中,如果正在使用线性回归或神经网络算法,可以使用降维数据来替代原数据。这样能够使得模型训练得更快,因为输入值的维度更低。
任务:完成projectData.m
,实现数据的降维。
输入:
X
U
K
输出:
K
维的数据Z
U_reduce = U(:, 1:K);
Z = X * U_reduce;
任务:完成recoverData.m
,实现降维数据到原数据的近似还原。
输入:
K
维的数据Z
U
K
输出:
X_rec
U_reduce = U(:, 1:K);
X_rec = Z * U_reduce';
下图展示了原始数据是如何投影到低维超平面上的。蓝圈表示原始数据,红圈表示降维后的数据。投影只有效地保留 U 1 U_1 U1给定方向上的信息。
本节将对面部图像应用PCA来进行降维。
ex7faces.mat
包含了面部图像的数据集X
,32*32的灰度图。X
的每行对应着一张面部图像(长度为1024的行向量)。