(六)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分解在干什么,有什么用。后面还有个可视化的降为例子,这里就不展示了。
相关文章推荐
- Programming Exercise 7:K-means Clustering and Principal Component Analysis (第二部分PCA)
- Machine Learning 第七波编程作业——K-means Clustering and Principal Component Analysis
- Machine Learning week 8 programming exercise K-means Clustering and Principal Component Analysis
- Stanford ex7: K-means Clustering and Principal Component Analysis
- Programming Exercise 7:K-means Clustering and Principal Component Analysis 第一部分
- Andrew NG 机器学习 练习7-K-means Clustering and Principal Component Analysis
- Stanford 机器学习 Week8 作业:K-means Clustering and Principal Component Analysis
- Programming Exercise 7: K-means Clustering and Principal Component Analysis Machine Learning
- MachineLearning Exercise 7 : K-means Clustering and Principle Component Analysis
- Coursera Machine Learning 第八周 quiz Programming Exercise 7 K-means Clustering and Principal Component
- Principal Component Analysis 主元分析
- 主成分分析PCA(Principal Component Analysis)介绍
- 主成分分析(Principal Component Analysis)
- PCA降维——主成分分析(principal component analysis,PCA)与LDA(线性判别分析)
- 主成分分析(Principal Component Analysis)
- Principal Component Analysis(PCA)主成分分析
- Principal components analysis(PCA):主元分析
- PCA(Principal Component Analysis)主成分分析
- Principal components analysis(PCA):主元分析
- 主成分分析PCA(Principal Component Analysis)介绍