1. 程式人生 > >吳恩達機器學習總結:第十一 降維(PCA)(大綱摘要及課後作業)

吳恩達機器學習總結:第十一 降維(PCA)(大綱摘要及課後作業)

為了更好的學習,充分複習自己學習的知識,總結課內重要知識點,每次完成作業後都會更博。

總結

1.動機I:資料壓縮

(1)壓縮

    a.加速演算法

    b.減小資料空間

    c.2維降為1維例子


    d.3維降為2維例子



   

    e.在實際中,我們正常會將1000維將為100維

2.動機II:視覺化

(1)很難視覺化高維資料

    a.將為將會以易處理的方式來顯示資訊,以此提供給人進行處理

(2)我們關心降維的原因

    a.幫助理解資料,有助於開發演算法

    b.降溫幫助我們看到有用資料

    c.如果能在資料中展示,那麼便可以很好地解釋給別人

3.主成分分析(PCA):問題表述

(1)從N維到K維

    a.找到k個向量(u

(1)u(2), ... u(k)),使得投影誤差最小

    b.可以使用k個向量定義平面上一個點

(2)PCA與線性迴歸對比

    a.PCA不是線性迴歸,儘管相似

    b.對於線性迴歸,擬合一條直線以最小化點與方形線之間的直線(點之間垂直距離)

    c.PCA是求正交化距離最短的

    d.線性迴歸需要預測y

4.PCA演算法

(1)在進行資料壓縮之前,需要對資料進行歸一化處理(特徵縮放和均值標準化)

(2)需要計算的兩件事

    a.計算向量u

    b.計算向量z


(3)演算法描述(從N維到K維)

    a.計算協方差矩陣(n x n)



    b.計算協方差矩陣的特徵向量

        [U,S,V] = svd(sigma)

          

    c.取出u矩陣的前k列並堆積成列,我們記作Ureduce

    d.計算z,z = (Ureduce)T * x

(4)步驟

    a.壓縮

    b.計算sigma

    c.用svd計算特徵向量

    d.從U中去k個向量

    e.計算z(z = (Ureduce)T * x

5.壓縮表示法重建

6.選擇主要元件的數量

(1)k是主要元件數量

(2)如何選擇k

    a.最小化投影平方誤差


    b.資料的總體變化可以定義為資料的平均值,表明來源的訓練樣本有多遠


(3)可以這樣


7.應用PCA的建議

(1)PCA將一個向量對映到較低維度向量

(2)通常,您可以將資料維度降低5-10倍,而不會對演算法產生重大影響

8.PCA應用

(1)壓縮

(2)視覺化(選擇k=2或者3)

(3)關於PCA,有不當使用

    a.使用PCA來防止過度擬合,這是不恰當的

    b.PCA丟失一些資料,但是不知道丟失的值是什麼

(4)PCA第二個神話誤區

    a.用來壓縮資料和視覺化很好

    b.最好在確定PCA會幫助你之後再新增PCA

作業

1.載入例程資料集

load ('ex7data1.mat');
plot(X(:, 1), X(:, 2), 'bo');
axis([0.5 6.5 2 8]); axis square;

2.主成分分析

[X_norm, mu, sigma] = featureNormalize(X);
[U, S] = pca(X_norm);
hold on;
drawLine(mu, mu + 1.5 * S(1,1) * U(:,1)', '-k', 'LineWidth', 2);
drawLine(mu, mu + 1.5 * S(2,2) * U(:,2)', '-k', 'LineWidth', 2);
hold off;

%featureNormalize函式
mu = mean(X);
X_norm = bsxfun(@minus, X, mu);
sigma = std(X_norm);
X_norm = bsxfun(@rdivide, X_norm, sigma);
end

%pca函式
[m, n] = size(X);
U = zeros(n);
S = zeros(n);
Sigma = 1/m * X'* X;
[U, S, V] = svd(Sigma);
end

3.降維

plot(X_norm(:, 1), X_norm(:, 2), 'bo');
axis([-4 3 -4 3]); axis square
K = 1;
Z = projectData(X_norm, U, K);
X_rec  = recoverData(Z, U, K);
hold on;
plot(X_rec(:, 1), X_rec(:, 2), 'ro');
for i = 1:size(X_norm, 1)
    drawLine(X_norm(i,:), X_rec(i,:), '--k', 'LineWidth', 1);
end
hold off

%projectData函式Z = zeros(size(X, 1), K);
U_reduce = U(:, 1:K);
Z =X * U_reduce;
end

%recoverdata函式
X_rec = zeros(size(Z, 1), size(U, 1));      
U_reduce = U(:, 1:K);
X_rec = Z * U_reduce';end

4.載入視覺化人臉資料

load ('ex7faces.mat')
displayData(X(1:100, :));

5.PCA法應用人臉資料

[X_norm, mu, sigma] = featureNormalize(X);
[U, S] = pca(X_norm);
displayData(U(:, 1:36)');

6.人臉資料降維

K = 100;
Z = projectData(X_norm, U, K);

7.降維之後視覺化人臉

K = 100;
X_rec  = recoverData(Z, U, K);
subplot(1, 2, 1);
displayData(X_norm(1:100,:));
title('Original faces');
axis square;
subplot(1, 2, 2);
displayData(X_rec(1:100,:));
title('Recovered faces');
axis square;

8.進階練習

A = double(imread('bird_small.png'));
A = A / 255;
img_size = size(A);
X = reshape(A, img_size(1) * img_size(2), 3);
K = 16; 
max_iters = 10;
initial_centroids = kMeansInitCentroids(X, K);
[centroids, idx] = runkMeans(X, initial_centroids, max_iters);
sel = floor(rand(1000, 1) * size(X, 1)) + 1;
palette = hsv(K);
colors = palette(idx(sel), :);
figure;
scatter3(X(sel, 1), X(sel, 2), X(sel, 3), 10, colors);
title('Pixel dataset plotted in 3D. Color shows centroid memberships');

[X_norm, mu, sigma] = featureNormalize(X);
[U, S] = pca(X_norm);
Z = projectData(X_norm, U, 2);
figure;
plotDataPoints(Z(sel, :), idx(sel), K);
title('Pixel dataset plotted in 2D, using PCA for dimensionality reduction');
fprintf('Program paused. Press enter to continue.\n');
pause;