您的位置:首页 > 其它

(六)K-means Clustering and Principal Component Analysis[K-means聚类&主元分析]

2015-03-29 23:11 483 查看

K-means

之前的都是有监督的,这次是无监督,也就是聚类问题,在没有正确答案的情况下,把samples们进行分类。

大体思路如下:

初始化K个centroids

while(终止条件迭代次数or精度){

计算sample与K个centroids的距离,并分类;

根据新分类重新计算K个centroids;

}

初始化一般随机选择K个samples作为centroids,接下来看看上面的code形式:

for i=1:max_iters

% For each example in X, assign it to the closest centroid
idx = findClosestCentroids(X, centroids);

% Given the memberships, compute new centroids
centroids = computeCentroids(X, idx, K);
end


其中
findClosestCentroids
是分类,idx存放对应sample属于哪个类;
computeCentroids
用来计算新的centroids。

先看
findClosestCentroids
:

K = size(centroids, 1);
idx = zeros(size(X,1), 1);

for i = 1:size(X,1)
curSample = [];
for j = 1:K
tmp = X(i,:) - centroids(j,:);
curSample = [curSample; tmp];
end
g = sum(curSample .^ 2, 2);
[C, idx(i)] = min(g);
end


上面就是计算(x−centroids(i))2,i⊂[1,2,...,K](x-centroids^{(i)})^2, i\subset {[1, 2, ..., K]},再看看那个小(离得近)就归在哪一类。

接下来看看
computeCentroids


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


就是说把在i类中的samples取平均,得到新的centroids(i)centroids^{(i)}。

以图像压缩为例,训练完之后,也就是找到了新的K个centroid,我们怎么把图像复原呢?如下:

idx = findClosestCentroids(X, centroids);
X_recovered = centroids(idx,:);


至此,K-means就介绍完了,比较简单~

Principal component Analysis

有时候会有很多的feature,你也不清楚到底哪个才更有用,哪个是冗余的,PCA的就是专门对数据的特征进行降维的。下面以多个人脸图像为例,聊聊PCA。

第一步,feature normalize,这个对于PCA很重要,因为要让这些数据在同一个量级。

mu = mean(X);
X_norm = bsxfun(@minus, X, mu);

sigma = std(X_norm);
X_norm = bsxfun(@rdivide, X_norm, sigma);


第二步,从n维降到k维,关键步骤SVD分解。

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


这里还是贴上图更好理解



SVD简单来讲就是会计算出三个矩阵,其中输入sigma⊂Rn×n\subset R^{n \times n},那么U, S, V⊂Rn×n\subset R^{n \times n} ,这里n是原来的feature数。S是对角阵,可以理解为重要系数,且递减排列,对应于U中的每一列。如果想从n维降低到k维,我们只要取U的前K列(其中这前K列到底包含了多少的信息,可以S中用前K个值的和与sum(S)相除得到),然后将X与U的前K列相乘就可以了(这里X为m×nm\times n矩阵,m是sample总数,n是feature个数)。

我们取前36个本征脸U(:, 1:36),也就是权重从高到低排列的脸的特征,如下:



这只是U的信息,对于每个不同的脸(sample),映射的code如下:

Z = X * U(:,1:K);


映射完后得到的信息是一坨,看不出来是什么,这里就不贴了。

那么如何从Z映射回X呢?因为训练的时候降维可以带来更好的效果,但是我们想直观地看看到底损失了多少的信息。code也很简单,如下:

X_rec = Z * U(:, 1:K)';


左下时原图,右下是降维后又映射回X得到的结果,可以看出来有些许差别。这里可是从1024维降到了100维!



这就是PCA,关键要知道SVD分解在干什么,有什么用。后面还有个可视化的降为例子,这里就不展示了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: