吳恩達機器學習總結:第十一 降維(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
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;