吴恩达机器学习第八周学习笔记及编程作业答案

一、理论基础
聚类
1、无监督学习

在非监督学习中,我们需要将一系列无标签的训练数据,输入到一个算法中,然后我们告诉这个算法,快去为我们找找这个数据的内在结构给定数据。我们可能需要某种算法帮助我们寻找一种结构。
2、K-均值算法
K-均值是最普及的聚类算法,算法接受一个未标记的数据集,然后将数据聚类成不同的组。K-均值是一个迭代算法,假设我们想要将数据聚类成 n 个组,其方法为:
首先选择𝐾个随机的点,称为聚类中心(cluster centroids);
对于数据集中的每一个数据,按照距离𝐾个中心点的距离,将其与距离最近的中心点关联起来,与同一个中心点关联的所有点聚成一类。
计算每一个组的平均值,将该组所关联的中心点移动到平均值的位置。
重复步骤 2-4 直至中心点不再变化。
实例:
随机生成两个点,这两个点叫做聚类中心,选择两个点就可以将数据聚成两类,如果想要多个类就选择多个聚类中心
在这里插入图片描述
K-均值算法内循环的第一步:簇分配
根据图上数据集(绿点)与两个聚类中心点的距离进行分配,离哪个点近就分配给哪一个,如下所示:
在这里插入图片描述
K-均值算法内循环的第二步:移动聚类中心
将两个聚类中心分别移动到同色的点的均值处,即分别算出红色和蓝色点的均值,然后将两个聚类中心分别移动到两个均值点,如下所示:
在这里插入图片描述
之后便是重复以上两个步骤:
第二次簇分配:
在这里插入图片描述
第二次移动聚类中心:
在这里插入图片描述
最终结果:
在这里插入图片描述
在这里插入图片描述
x(i)是一个n维实数向量,这就是训练样本是n维向量而不是n+1维向量的原因
K-均值算法的伪代码如下:
在这里插入图片描述
算法分为两个步骤,第一个 for 循环是簇分配,即:对于每一个样例𝑖,计算其应该属于的类。第二个 for 循环是聚类中心的移动,即:对于每一个类𝐾,重新计算该类的质心。
3、优化目标
K-均值最小化问题,是要最小化所有的数据点与其所关联的聚类中心点之间的距离之和,因此 K-均值的代价函数(又称畸变函数 Distortion function)为:
在这里插入图片描述
其中𝜇𝑐(𝑖)代表与𝑥(𝑖)最近的聚类中心点。 我们的的优化目标便是找出使得代价函数最小的 𝑐(1),𝑐(2),…,𝑐(𝑚)和𝜇1,𝜇2,…,𝜇𝑘:
在这里插入图片描述
回顾K-均值迭代算法,第一个循环是用于减小𝑐(𝑖)引起的代价,而第二个循环则是用于减小𝜇𝑖引起的代价。迭代的过程一定会是每一次迭代都在减小代价函数,不然便是出现了错误。
4、随机初始化
在运行 K-均值算法的之前,我们首先要随机初始化所有的聚类中心点:
(1)我们应该选择𝐾 < 𝑚,即聚类中心点的个数要小于所有训练集实例的数量
(2)随机选择𝐾个训练实例,然后令𝐾个聚类中心分别与这𝐾个训练实例相等
K-均值的一个问题在于,它有可能会停留在一个局部最小值处,而这取决于初始化的情况。
在这里插入图片描述
上面是最好的情况,得到的是最优解,但是下面两个就不是很好,为了解决这个问题,我们通常需要多次运行 K-均值算法,每一次都重新进行随机初始化,最后再比较多次运行 K-均值的结果,选择代价函数最小的结果。这种方法在𝐾较小的时候(2–10)还是可行的,但是如果𝐾较大,这么做也可能不会有明显地改善。
5、选择聚类数
“肘部法则”:选择聚类数的方法
在这里插入图片描述
“肘部法则”,左边的图中它的畸变值会迅速下降,从 1 到 2,从 2 到 3 之后,你会在 3 的时候达到一个肘点。在此之后,畸变值就下降的非常慢,看起来就像使用 3 个聚类来进行聚类是正确的,这是因为那个点是曲线的肘点,畸变值下降得很快,𝐾 = 3之后就下降得很慢,那么我们就选𝐾 = 3。但是对于右边那个图,肘部法则就不是很适用。
**降维
1、数据压缩(降维的第一个应用)

第二种类型的无监督学习问题,称为降维
在这里插入图片描述
将数据从三维降至二维: 这个例子中我们要将一个三维的特征向量降至一个二维的特征向量。过程是与上面类似的,我们将三维向量投射到一个二维的平面上,强迫使得所有的数据都在同一个平面上,降至二维的特征向量。
2、数据可视化(降维的第二个应用)
在这里插入图片描述
假使我们有有关于许多不同国家的数据,每一个特征向量都有 50 个特征(如 GDP,人均 GDP,平均寿命等)。如果要将这个 50 维的数据可视化是不可能的。使用降维的方法将其降至 2 维,我们便可以将其可视化了。
在这里插入图片描述
在这里插入图片描述
这样做的问题在于,降维的算法只负责减少维数,新产生的特征的意义就必须由我们自 己去发现了。
3、主成分分析问题
主成分分析(PCA)是最常见的降维算法。
在 PCA 中,我们要做的是找到一个方向向量(Vector direction),当我们把所有的数据都投射到该向量上时,我们希望投射平均均方误差能尽可能地小。方向向量是一个经过原点的向量,而投射误差是从特征向量向该方向向量作垂线的长度。
在这里插入图片描述
主成分分析与线性回顾的比较:
主成分分析与线性回归是两种不同的算法。主成分分析最小化的是投射误差(Projected Error),而线性回归尝试的是最小化预测误差。线性回归的目的是预测结果,而主成分分析不作任何预测。
在这里插入图片描述
上图中,左边的是线性回归的误差(垂直于横轴投影),右边则是主要成分分析的误差(垂直于红线投影)。
**PCA 技术的一大好处是对数据进行降维的处理。**我们可以对新求出的“主元”向量的重要性进行排序,根据需要取前面最重要的部分,将后面的维数省去,可以达到降维从而简化模型或是对数据进行压缩的效果。同时最大程度的保持了原有数据的信息。
**PCA 技术的一个很大的优点是,它是完全无参数限制的。**在 PCA 的计算过程中完全不需要人为的设定参数或是根据任何经验模型对计算进行干预,最后的结果只与数据相关,与用户是独立的。 但是,这一点同时也可以看作是缺点。如果用户对观测对象有一定的先验知识,掌握了数据的一些特征,却无法通过参数化等方法对处理过程进行干预,可能会得不到预期的效果,效率也不高。
4、主成分分析算法
PCA 减少𝑛维到𝑘维:
第一步是均值归一化。我们需要计算出所有特征的均值,然后令 𝑥𝑗 = 𝑥𝑗 − 𝜇𝑗。如果特征是在不同的数量级上,我们还需要将其除以标准差 𝜎2。
第二步是计算协方差矩阵(covariance matrix)𝛴:
在这里插入图片描述
第三步是计算协方差矩阵𝛴的特征向量(eigenvectors):在 Octave 里我们可以利用奇异值分解(singular value decomposition)来求解,[U, S, V]= svd(sigma)。
在这里插入图片描述
对于一个 𝑛 × 𝑛维度的矩阵,上式中的𝑈是一个具有与数据之间最小投射误差的方向向量构成的矩阵。如果我们希望将数据从𝑛维降至𝑘维,我们只需要从𝑈中选取前𝑘个向量,获得一个𝑛 × 𝑘维度的矩阵,我们用𝑈𝑟𝑒𝑑𝑢𝑐𝑒表示,然后通过如下计算获得要求的新特征向量𝑧(𝑖):
𝑧(𝑖) = 𝑈𝑟𝑒𝑑𝑢𝑐𝑒 𝑇 ∗ 𝑥(𝑖) ,其中𝑥是𝑛 × 1维的,因此结果为𝑘 × 1维度。注,我们不对方差特征进行处理。
5、选择主成分的数量
主要成分分析是减少投射的平均均方误差:
训练集的方差为:
在这里插入图片描述
我们希望在平均均方误差与训练集方差的比例尽可能小的情况下选择尽可能小的𝑘值。
在这里插入图片描述
还有一些更好的方式来选择𝑘,当我们在 Octave 中调用“svd”函数的时候,我们获得三个参数:[U, S, V] = svd(sigma)。
在这里插入图片描述
其中的𝑆是一个𝑛 × 𝑛的矩阵,只有对角线上有值,而其它单元都是 0,我们可以使用这个矩阵来计算平均均方误差与训练集方差的比例:
在这里插入图片描述
也就是:
在这里插入图片描述
在压缩过数据后,我们可以采用如下方法来近似地获得原有的特征:
在这里插入图片描述
6、压缩重现
在这里插入图片描述
PCA 算法,我们可能有一个这样的样本。如图中样本𝑥(1),𝑥(2)。我们做的是,我们把这些样本投射到图中这个一维平面。然后现在我们需要只使用一个实数,比如𝑧(1),指定这些点的位置后他们被投射到这一个三维曲面。给定一个点𝑧(1),我们怎么能回去这个原始的二维空间呢?𝑥为2维,z为1维
在这里插入图片描述
对应反过来的方程为:
在这里插入图片描述
上面的右图中就是从低维表示𝑧回到未压缩的表示。
假使我们正在针对一张 100×100 像素的图片进行某个计算机视觉的机器学习,即总共有 10000 个特征。

  1. 第一步是运用主要成分分析将数据压缩至 1000 个特征
  2. 然后对训练集运行学习算法。
  3. 在预测时,采用之前学习而来的𝑈𝑟𝑒𝑑𝑢𝑐𝑒将输入的特征𝑥转换成特征向量𝑧,然后再进行预测
    注:如果我们有交叉验证集合测试集,也采用对训练集学习而来的𝑈𝑟𝑒𝑑𝑢𝑐𝑒
    错误的主要成分分析情况:
    一个常见错误使用主要成分分析的情况是,将其用于减少过拟合(减少了特征的数量)。这样做非常不好,不如尝试正则化处理。原因在于主要成分分析只是近似地丢弃掉一些特征,它并不考虑任何与结果变量有关的信息,因此可能会丢失非常重要的特征。然而当我们进行正则化处理时,会考虑到结果变量,不会丢掉重要的数据。
    另一个常见的错误是,默认地将主要成分分析作为学习过程中的一部分,这虽然很多时候有效果,最好还是从所有原始特征开始,只在有必要的时候(算法运行太慢或者占用太多内存)才考虑采用主要成分分析。
    二、编程作业
    1.findClosestCentroids.m(Find closest centroids (used in K-means)):编写函数findClosestCentroids,计算每个样本与centroid的距离,返回距离最近的点的index
    The K-means algorithm is a method to automatically cluster similar data examples together
    The K-means algorithm is as follows:
    在这里插入图片描述
    解释:算法的内环反复执行两个步骤:(1)将每个训练示例x(i)分配给其最近的质心,(2)使用分配给它的点重新计算每个质心的平均值。

K-means算法总是收敛于质心的最终均值集。注意,收敛解可能并不总是理想的,并且取决于质心的初始设置。因此,在实践中,K-means算法通常在不同的随机初始化下运行几次。从不同的随机初始化中选择不同的解决方案的一种方法是选择成本函数值最低的解决方案。
(1)Finding closest centroids
In the “cluster assignment”
phase of the K-means algorithm, the algorithm assigns every training example x(i) to its closest centroid, given the current positions of centroids. Specifically, for every example i we set
在这里插入图片描述
where c(i) is the index of the centroid that is closest to x(i), and µj is the position (value) of the j’th centroid. Note that c(i) corresponds to idx(i) in the starter code.
代码:

function idx = findClosestCentroids(X, centroids)     
% Set K      
K = size(centroids, 1);           
% You need to return the following variables correctly.       
idx = zeros(size(X,1), 1);         
for i = 1 : size(X,1)%获取训练集数量       
    minError = sum((X(i,:) - centroids(1,:)).^2);%公式   
    minIdx = 1;  
    for c = 2 : K %遍历所有点,除去第一个  
        error = sum((X(i,:) - centroids(c,:)).^2) ;%公式  
        if error < minError %如果得出新的点比原有点小,则取新的  
            minError = error;  
            minIdx = c;  
        end    
    idx(i) = minIdx;  
    end   
end   
end  

2. computeCentroids.m(Compute centroid means (used in K-means))
(2)Computing centroid means for every centroid k we set:
在这里插入图片描述
where Ck is the set of examples that are assigned to centroid k. Concretely, if two examples say x(3) and x(5) are assigned to centroid k = 2, then you should update µ2 = 1/2(x(3) + x(5)).
代码:

function centroids = computeCentroids(X, idx, K)              
% Useful variables       
[m n] = size(X);             
% You need to return the following variables correctly.     
centroids = zeros(K, n);         
for i = 1 : K   
    all_K = 0;    %用于存储x的和   
    count = sum(idx == i);    %用于存储分配到centroids(i, :)中元素的个数  
    temp = find(idx == i);    %找出分配到centroids(i, :)中所有元素的行索引  
    for j = 1 : numel(temp)   %numel()函数:返回数组中元素的个数  
        all_K = all_K + X(temp(j), :);  
    end   
    centroids(i, :) = all_K / count;  %公式   
end   
end  

3. kMeansInitCentroids.m(Initialization for K-means centroids)
代码已在ex7文件中给出

function centroids = kMeansInitCentroids(X, K)             
% You should return this values correctly      
centroids = zeros(K, size(X, 2));         
%Randomly reorder the indices of examples      
randidx = randperm(size(X,1));       
%Take the first K exampes as centroids       
centroids = X(randidx(1:K),:);     
end  

4. pca.m(Perform principal component analysis)
PCA consists of two computational steps: (1)compute the covariance matrix of the data.(2)you use Octave/MATLAB’s SVD function to compute the eigenvectors U1,U2,…,Un. These will correspond to the principal components of variation in the data.
Before using PCA, it is important to first normalize the data
by subtracting the mean value of each feature from the dataset, and scaling each dimension so that they are in the same range.
(1)you should compute the covariance matrix of the
data, which is given by:
在这里插入图片描述
where X is the data matrix with examples in rows, and m is the number of examples. Note that Σ is a n×n matrix and not the summation operator.
(2)you can run SVD with the following command: [U, S, V] =
svd(Sigma), where U will contain the principal components and S will contain a diagonal matrix.
代码:

function [U, S] = pca(X)            
% Useful values     
[m, n] = size(X);         
% You need to return the following variables correctly.       
U = zeros(n);        
S = zeros(n);         
% 协方差矩阵   
Sigma = 1 / m * X' * X;  
 % svd   
[U,S,V] = svd(Sigma);     
end  

5. projectData.m(Projects a data set into a lower dimensional space)
Note that the top K components in U are given by the first K columns of U, that is U reduce = U(:, 1:K).
代码:

function Z = projectData(X, U, K)      
     
% You need to return the following variables correctly.        
Z = zeros(size(X, 1), K);           
%               For the i-th example X(i,:), the projection on to the k-th   
%               eigenvector is given as follows:      
%                    x = X(i, :)';      
%                    projection_k = x' * U(:, k);     
U_reduce = U(:, 1:K);   
Z = X * U_reduce;      
end  

6. recoverData.m(Recovers the original data from the projection)
代码:

function X_rec = recoverData(Z, U, K)             
% You need to return the following variables correctly.       
X_rec = zeros(size(Z, 1), size(U, 1));         
%               For the i-th example Z(i,:), the (approximate)      
%               recovered data for dimension j is given as follows:    
%                    v = Z(i, :)';  
%                    recovered_j = v' * U(j, 1:K)';  
%  
%               Notice that U(j, 1:K) is a row vector.                
 U_reduce = U(:, 1:K);   
X_rec = Z * U_reduce';     
end  
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值