机器学习吴恩达编程作业题7-K-均值聚类和主成分分析

1、K-均值聚类

1.1实施方法

K-means算法是一种将相似数据自动聚类到一起的方法。算法的内环重复执行两个步骤:(i)将每个训练样本x(i)分配到其最近的质心,(ii)使用分配给它的点重新计算每个质心的平均值。

K-means算法总是收敛到质心的某个最终均值集。注意,收敛解可能并不总是理想的,并且取决于质心的初始设置。因此,在实际应用中,K-means算法通常会以不同的随机初始化运行几次。在不同随机初始化的不同解决方案之间进行选择的一种方法是选择成本函数值(失真)最低的一个。

1.1.1找到最近的质心

在K-means算法的“聚类分配”阶段,该算法在给定质心当前位置的情况下,将每个训练样本x(i)分配到其最近的质心。
在这里插入图片描述
c(i)是最接近x(i)的质心的索引,µj是第j个质心的位置(值)。注意,c(i)对应于starter代码中的idx(i)

首先将ex7data2.mat文件复制到D:\Machine Learning\ex7目录下,将该数据集下面的点分别划分到不同的聚类中,在这里要用到findClosestCentroids函数,在当前目录下建立findClosestCentroids.m文件:

function idx = findClosestCentroids(X, centroids)
%返回每一个坐标点对应的聚类的编号
%第一个参数是坐标点矩阵,第二个参数3个不同的聚类中心
K = size(centroids, 1);
%k=3
idx = zeros(size(X,1), 1);  
%300*1
m = size(X, 1);
for i = 1: m,
    min = 10000000000;
    for j = 1: K,
        anw = sum((X(i, :) - centroids(j, :)) .^ 2);
        %用了两个点之间的距离公式
        if anw < min,
            min = anw;
            flag = j;
        end;
    end;
    idx(i) = flag;
    %保存自己所属的聚类中心
end;
end

1.1.2计算质心平均值

在当前目录下建立computeCentroids.m文件,该函数就是中心计算质心坐标:
在这里插入图片描述

function centroids = computeCentroids(X, idx, K)
%返回值是新的三个质心,第三个参数就是质心的个数
[m n] = size(X);
centroids = zeros(K, n);
%形成3*2矩阵
centroids_num = zeros(1, K);
for i = 1: m,
    centroids(idx(i), :) += X(i, :);
    %将每一个聚类中的坐标累加起来
    centroids_num(idx(i)) += 1;
    %每个聚类中坐标点的个数
end;
for i = 1: K,
   centroids(i, :) = centroids(i, :) ./ centroids_num(i);
   %将每个聚类中心坐标累加值除以坐标点个数得到新的三个聚类中心
end;
end

1.2K-means算法可视化

在当前目录下建立runkMeans.m文件,在该文件中实现K-means算法可视化。

function [centroids, idx] = runkMeans(X, initial_centroids, ...
                                      max_iters, plot_progress)
%返回值是最终的三个聚类中心,以及每个个例对应的聚类中心索引
%第二个参数是初始化的聚类中心,第三个参数是迭代次数,第四个参数TRUE
if ~exist('plot_progress', 'var') || isempty(plot_progress)
    plot_progress = false;
end
if plot_progress
    figure;
    hold on;
end
[m n] = size(X);
K = size(initial_centroids, 1);
centroids = initial_centroids;
previous_centroids = centroids;
idx = zeros(m, 1);
%初始化相关参数
for i=1:max_iters
    fprintf('K-Means iteration %d/%d...\n', i, max_iters);
    if exist('OCTAVE_VERSION')
        fflush(stdout);
    end
    idx = findClosestCentroids(X, centroids);
    %算法第一步,找到相应索引
    if plot_progress
        plotProgresskMeans(X, centroids, previous_centroids, idx, K, i);
        %画出K-means算法执行过程
        previous_centroids = centroids;
        %保存现有的聚类中心
        fprintf('Press enter to continue.\n');
        pause;
    end
    centroids = computeCentroids(X, idx, K);
    %计算新的聚类中心,供下次使用
end
if plot_progress
    hold off;
end
end

在上述函数中调用了plotProgresskMeans函数来画出K-means算法执行过程,在当前目录下建立plotProgresskMeans.m文件:

function plotProgresskMeans(X, centroids, previous, idx, K, i)
plotDataPoints(X, idx, K);
%调用该函数画出坐标点
plot(centroids(:,1), centroids(:,2), 'x', ...
     'MarkerEdgeColor','k', ...
     'MarkerSize', 10, 'LineWidth', 3);
     %画出聚类中心
for j=1:size(centroids,1)
    drawLine(centroids(j, :), previous(j, :));
    %画出聚类中心之间的连线
end
title(sprintf('Iteration number %d', i))
end

在上述函数中调用了plotDataPoints画出不同类别的坐标点并进行区分,以及调用drawLine函数画出聚类中心之间的连线:

function plotDataPoints(X, idx, K)
% 创造调色板
palette = hsv(K + 1);
%返回包含四种颜色的颜色图
colors = palette(idx, :);
%每一类所有个例对应一种颜色
scatter(X(:,1), X(:,2), 15, colors);
%绘制一个圆
end
function drawLine(p1, p2, varargin)
plot([p1(1) p2(1)], [p1(2) p2(2)], varargin{
     :});
%绘制缺省的直线
end

Octave中:
在这里插入图片描述黑窗口运行有点问题,可以选择界面命令窗口:
机器学习吴恩达编程作业题7-K-均值聚类和主成分分析_第1张图片
机器学习吴恩达编程作业题7-K-均值聚类和主成分分析_第2张图片

1.3随机初始化

示例数据集的初始质心分配是为了让您看到上述的图。在实际应用中,一个好的质心初始化策略是从训练集中随机选取样本。
在当前目录下建立kmeansinitcentroid.m文件:

function centroids = kMeansInitCentroids(X, K)
centroids = zeros(K, size(X, 2));
randidx = randperm(size(X, 1));
%随机选择3个聚类中心
centroids = X(randidx(1:K), :);
end

1.4图像压缩-均值K

将把24种颜色数减少到16种颜色。这里求两个点之间最近的距离并不在平面上,而是在空间内。然后聚类中心也是空间点。
首先将bird_small.png图片复制到当前目录下,然后将图片加载进去,这将创建一个三维矩阵a,其前两个索引标识像素位置,最后一个索引表示红色、绿色或蓝色。例如,A(50,33,3)给出第50行和第33列处像素的蓝色强度。
在这里插入图片描述
然后将图片的每个像素的强度值控制在0~1之间。在获得图片长和宽的像素后,将该图片的像素的强度矩阵调整为像素数*3。每一行包含每个像素的红色、绿色或蓝色强度。
然后找出16种颜色对应的聚类中心点像素的红绿蓝强度。
机器学习吴恩达编程作业题7-K-均值聚类和主成分分析_第3张图片
运行K-means算法,找到相应的16个聚类中心和每个像素属于那个聚类中心的索引。
机器学习吴恩达编程作业题7-K-均值聚类和主成分分析_第4张图片
在这里没有绘制出相应的图像,第四个参数采用默认的。

请注意,您已经显著减少了描述图像所需的位数。原始图像需要每个128×128像素位置的24位,因此总大小为128×128×24=393216位。新的表示需要一些开销存储,以16种颜色的字典的形式,每种颜色都需要24位,但是图像本身每像素位置只需要4位。因此,最终使用的位数是16×24+128×128×4=65920位,相当于将原始图像压缩约6倍。

1.5图像重建

最后,您可以通过仅基于质心指定重建图像来查看压缩效果。具体来说,可以用指定给它的质心的平均值来替换每个像素位置。图3显示了我们获得的重建。即使生成的图像保留了原始图像的大部分特征,我们也可以看到一些压缩伪影。

这里X矩阵需要还原为16色的三维矩阵。
机器学习吴恩达编程作业题7-K-均值聚类和主成分分析_第5张图片
最后就是画出相应的图片
这里画出了原始图片和重建后的图片:
subplot(1, 2, 1);将图像划分为1*2的格子,自己用第一个格子。
机器学习吴恩达编程作业题7-K-均值聚类和主成分分析_第6张图片
机器学习吴恩达编程作业题7-K-均值聚类和主成分分析_第7张图片

2、主成分分析(PCA)

2.1示例数据集

将ex7data1.mat文件复制到当前目录下,然后加载和显示数据集:
在这里插入图片描述
机器学习吴恩达编程作业题7-K-均值聚类和主成分分析_第8张图片
机器学习吴恩达编程作业题7-K-均值聚类和主成分分析_第9张图片
首先得特征规范化,在当前目录下建立featureNormalize.m文件,具体实现前面有。
然后运行下面两步的PCA算法,在当前目录下建立pca.m文件:

function [U, S] = pca(X)
[m, n] = size(X);
U = zeros(n);
S = zeros(n);
sigma = X' * X ./ m;
[U, S, V] = svd(sigma);
end

完成pca.m之后,将对示例数据集运行pca,并绘制找到的相应主成分。
机器学习吴恩达编程作业题7-K-均值聚类和主成分分析_第10张图片
机器学习吴恩达编程作业题7-K-均值聚类和主成分分析_第11张图片

2.2PCA降维

主要将前面的2维降到1维,计算完主成分后,可以使用它们来降低数据集的特征维数,方法是将每个示例投影到低维空间x(i)→z(i)(例如,将数据从2D投影到1D)。在这部分练习中,您将使用PCA返回的特征向量,并将示例数据集投影到一维空间中。
在当前目录下建立projectData.m文件。具体地说,您将获得一个数据集X、主成分U以及要缩减为K的所需维度数。
在这里插入图片描述

function Z = projectData(X, U, K)
Z = zeros(size(X, 1), K);
Z = X * U(:, 1:K);
end

将数据投影到低维空间后,可以通过将数据投影回原始高维空间来近似恢复数据。在当前目录下建立recoverData.m,将Z中的每个示例投影回原始空间,并在X_rec中返回恢复的近似值。
在这里插入图片描述

function X_rec = recoverData(Z, U, K)
X_rec = zeros(size(Z, 1), size(U, 1));
X_rec = (U(:, 1:K) * Z')';
end

机器学习吴恩达编程作业题7-K-均值聚类和主成分分析_第12张图片
比较之前的X坐标和恢复后的坐标的距离:
机器学习吴恩达编程作业题7-K-均值聚类和主成分分析_第13张图片

2.3人脸识别

首先加载数据集ex7faces.mat,该数据集有5000个人脸,每个人脸有1024个特征。然后调用displayData函数可视化数据集。
在当前目录下建立displayData.m文件,该函数在之前就实现过。
在这里插入图片描述
打印 前一百个个例的数据
机器学习吴恩达编程作业题7-K-均值聚类和主成分分析_第14张图片
运用PCA算法进行降维:
显示了描述最大变化的前36个主成分
在这里插入图片描述
机器学习吴恩达编程作业题7-K-均值聚类和主成分分析_第15张图片
将10254个特征降维成100个特征,得到出相应的X矩阵,根据降维后的X矩阵绘制出的人脸和最初1024维X数据形成的人脸进行对比:
机器学习吴恩达编程作业题7-K-均值聚类和主成分分析_第16张图片
机器学习吴恩达编程作业题7-K-均值聚类和主成分分析_第17张图片

你可能感兴趣的:(机器学习吴恩达(基础),聚类,算法,深度学习,Octave,机器学习)