【Coursera】Machine Learning K-means Clustering and Principal Component Analysis 第七次编程作业

一、概述

K-means聚类算法和主成分分析的应用。

终于从监督学习转向非监督学习了。可惜只讲了聚类分析,然后就去讲PCA了。

本次作业有Find Closet Centroids,Compute Centroid Means,PCA,Project Data,Recover Data五个函数。

二、分析

1、K-means聚类分析

K-means聚类分析的具体步骤如下:

①、选择k个初始点;

②、训练集X中有m个样本,对每个样本,分别计算其与k个初始点的距离,选择距离最小的初始点,该样本标记为属于该初始点;

③、对每个初始点所包括的样本,计算其平均值,作为新的初始点,将k个初始点都更新一遍;

④、重复②、③,直到更新后的初始点与更新前没有变化,即收敛。这时,样本分类完成。

原理还是很容易理解的。

其中,Find Closet Centroids函数用于实现②。代码如下:

for i=1:length(idx)
    nowNode=X(i,:);
    nowDis=100000000;
    nowNum=0;
    for j=1:K
        nowCen=centroids(j,:);
        tempDis=sum((nowCen-nowNode).^2);
        if tempDis<nowDis
            nowDis=tempDis;
            nowNum=j;
        end
    end
    idx(i,:)=nowNum;
end

两个循环即可。很简单。

Compute Centroid Means用于实现③中的计算平均值,代码如下:

for i=1:K
    centroids(i,:)=mean(X(find(idx==i),:));
end

然后迭代即可。迭代使用runkMeans函数,这个函数作业自带,才是核心函数,不用写这个真是遗憾。

另外,选择初始点也是一个技术活,初始点选择不同,对最后的聚类结果差距会很大。因此,一般选择多次随机选取初始点的方法来进行聚类。

2、主成分分析(PCA)

主成分分析一般用于降维和数据可视化。降维,直观来说就是降低数据的维度,三维拍扁了变成二维,二维搓一搓变成一维。这样计算起来就方便一些,少用一些时间。另外,对于四维及以上的数据,不可能以视觉形式呈现出来,如果想将其可视化,那就需要将高维降到三维或者二维。

然而,降维并不是随意降,它需要满足两个特性:最大可分性,最近重构性。前者指的是,对于高维空间中距离较远的样本,降维后它们的距离也应较远;反之,对于高维空间中较近的样本,降维后它们的距离应较近。也就是说,应保留样本间的区别。

对于后者,我们首先将降维这一操作换一种方式解释:降维即是选择一个超平面,对所有高维空间的样本进行表达。那么,这个超平面应该距离所有样本尽可能近,离得太远会导致所有样本均有了一个偏置,这将影响其性质。

对于降维后效果的评价,选择利用如下公式进行量化:

以二维降一维为例,xi表示二维平面上第i个样本原来的坐标,xapproxi表示投影到直线上后第i个样本的坐标,它们的距离的平方就可以用来表示信息的损失。注意,所有的xapprox都处于一条直线上,因此可以认为是降维了。

一般令上述公式的结果小于0.01,0.05,0.1等。

接下来对PCA的步骤进行说明。

①、数据预处理,即对所有数据减去其平均值。令数据的平均值均为0。例如,样本的某一特性的值为2 3 4 5,预处理之后的值为-1.5 -0.5 0.5 1.5;

②、计算协方差矩阵;

③、利用奇异值分解svd,对协方差矩阵M分解得到矩阵U、S、V。SVD可以理解为:将一个比较复杂的矩阵用更小更简单的3个子矩阵的相乘来表示,这3个小矩阵描述了大矩阵重要的特性。其中,矩阵U和矩阵V为两个正交基矩阵,矩阵S为奇异值矩阵。它们的含义是:矩阵M乘一个向量,就是将M从以V为基的空间映射到了以U为基的空间,并在S的方向上进行了大小变化。该段引自这里

④、利用③中得到的U矩阵,选取前k列,得到一个新的矩阵Ureduce,这个矩阵的转置乘以原矩阵,就将原矩阵降维到了k维;

⑤、对于k的选取,要遵循让上述公式的值最小化的原则,但是用上面那个公式太麻烦了,经过化简,可以得到下文中的公式:

,该公式指的是信息的保留度,也就是说,该公式与上文公式之和应为1。而该公式中的Sii就是指的svd中得到的矩阵S的对角线上的元素值。由此可以简单的得出信息保留度。

PCA与svd的关系很复杂,本文在此不做说明。

在代码方面,函数pca一手包办了第②步和第③步。代码如下:

sigma=X'*X/m;
[U,S,V]=svd(sigma);

简单的要死,matlab给出了svd的计算函数,真是谢天谢地。

函数project data负责对X进行降维,其代码如下:

Ureduce=U(:,1:K);
for i=1:size(X,1)
    Z(i,:)=X(i,:)*Ureduce;
end

函数recover data负责对已降维的Z进行重建,得到的就是Xapprox。代码如下:

for i=1:size(Z,1)
    X_rec(i,:)=Z(i,:)*U(:,1:K)';
end

要注意一点,我们在二维降一维的时候,会感觉PCA和线性回归很像,实际上它们本质并不同。线性回归要求的代价函数是y1-y的和最小,其中y1是样本x在直线上的取值,y是样本的实际取值,(x,y1)与(x,y)的连线和y轴平行;PCA要求的代价函数是样本到直线的距离和最小,(x,y1)与(x,y)的连线和PCA所得的直线垂直。

同时注意,不要用PCA去减少过拟合现象,这是正则化来做的。

三、总结

本次作业简单的应用了聚类分析和PCA,对于其原理进行了浅尝辄止的描述,关键的代码还是现成的,很简单。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值