PCA – Principal Component Analysis

Phân tích thành phần chính (Principal Component Analysis – PCA) là một trong những phương pháp phân tích dữ liệu nhiều biến đơn giản nhất. Phần 1 của bài này sẽ nói về động lực và ý tưởng chính của  PCA, sau đó trình bày từng bước trong thuật  toán PCA. Như thường lệ, để hiểu thuật toán thì cài đặt là cách tốt nhất, do đó một đoạn mã MATLAB minh họa từng bước trong PCA cũng được trình bày. Phần cuối cùng là chi tiết các khai triển Toán học trong  PCA. Do mục tiêu ứng dụng nên các phương trình cụ thể được để dành đến phần này, người đọc nếu thật sự quan tâm nguyên lí của PCA, tại sao PCA lại sử dụng những công thức như thế v.v… thì có thể tham khảo phần này để biết thêm chi tiết.

1. Giới thiệu

Như đã nói trong bài trước, trong thống kê, thông thường cần phải “nghiên cứu” dữ liệu trước khi xây dựng các mô hình suy diễn dựa trên dữ liệu đó. Tuy nhiên đôi khi dữ liệu có số chiều lớn, không thể visualize (không biết dịch là gì) trong không gian 2 hay 3 chiều, do đó cần phải tìm cách đưa dữ liệu về không gian có số chiều nhỏ hơn.

PCA là một trong những phương pháp như thế, nhưng hơn thế, PCA còn giống như một Swiss knife với nhiều đặc tính tốt:

  • Giúp giảm số chiều của dữ liệu,
  • Thay vì giữ lại các trục tọa độ của không gian cũ, PCA xây dựng một không gian mới ít chiều hơn, nhưng lại có khả năng biểu diễn dữ liệu tốt tương đương không gian cũ, nghĩa là đảm bảo độ biến thiên  (variability) của dữ liệu trên mỗi chiều mới.
  • Các trục tọa độ trong không gian mới là tổ hợp tuyến tính của không gian cũ, do đó về mặt ngữ nghĩa, PCA xây dựng feature mới dựa trên các feature đã quan sát được. Điểm hay là những feature này vẫn biểu diễn tốt dữ liệu ban đầu.
  • Trong không gian mới, các liên kết tiềm ẩn của dữ liệu có thể được khám phá, mà nếu đặt trong không gian cũ thì khó phát hiện hơn, hoặc những liên kết như thế không thể hiện rõ.

Nói một cách ngắn gọn, mục tiêu của  PCA là tìm một không gian mới (với số chiều nhỏ hơn không gian cũ). Các trục tọa độ trong không gian mới được xây dựng sao cho trên mỗi trục, độ biến thiên của dữ liệu trên đó là lớn nhất có thể. Tiếng  Việt thì dài dòng, nhưng tiếng Anh thì mục tiêu này gọi là maximize the variability. Ba chữ này gói gọn ý tưởng chính của  PCA.

Minh họa PCA: phép chiếu lên các trục tọa độ khác nhau có thể cho cách nhìn rất khác nhau về cùng một dữ liệu.

Một ví dụ kinh điển là hình ảnh về con lạc đà. Cùng là một con lạc đà nhưng nếu nhìn từ bên hông thì ta có được đầy đủ thông tin nhất, trong khi nhìn từ phía trước thì thật khó để nói nó là lạc đà.

Một ví dụ thuyết phục hơn được minh họa trong hình sau

Minh họa PCA: tìm các trục tọa độ mới sao cho dữ liệu có độ biến thiên cao nhất

Giả sử tập dữ liệu ban đầu (tập điểm màu xanh) được quan sát trong không gian 3 chiều (trục màu đen) như hình bên trái. Rõ ràng 3 trục này không biểu diễn được tốt nhất mức độ biến thiên của dữ liệu. PCA do đó sẽ tìm hệ trục tọa độ mới (là hệ trục màu đỏ trong hình bên trái). Sau khi tìm được không gian mới, dữ liệu sẽ được chuyển sang không gian này để được biểu diễn như trong hình bên phải. Rõ ràng hình bên phải chỉ cần 2 trục tọa độ nhưng biểu diễn tốt hơn độ biến thiên của dữ liệu so với hệ trục 3 chiều ban đầu.

Một điểm rất đẹp nữa của  PCA là các trục tọa độ trong không gian mới luôn đảm bảo trực giao đôi một với nhau, mặc dù trong không gian ban đầu, các trục có thể không trực giao.

Dài dòng như vậy là đủ, ta sẽ trình bày từng bước thuật toán PCA trong phần tới. Chi tiết về ý tưởng và khai triển toán học được dành lại để trình bày ở cuối bài.

2. Thuật toán PCA

Cho ma trận \mathbf{X} =\{x_{ij}\} \in \mathcal{R}^{n\times p}. Các bước của PCA lần lượt như sau:

1. Tiền xử lí

Dữ liệu ban đầu có thể có giá trị thay đổi bất thường. Ví dụ trên feature 1 (cột 1 của  \mathbf{X}) giá trị thay đổi trong khoảng (0, 1), trên feature 2 lại biến thiên trong đoạn (-100, 100). Rõ ràng cần phải có một bước tiền xử lí để chuẩn hóa giá trị trên các cột của ma trận X. Có 2 cách tiền xử lí thường được dùng cho PCA là Centered PCA và  Normed PCA.

Centered PCA mang tất cả các feature (các cột của X) về cùng một gốc tọa độ:

\displaystyle \hat{\mathbf{X}}=\{\hat{x}_{ij}\},

\displaystyle \hat{x}_{ij}=\frac{x_{ij}-g_j}{\sqrt{n}},             (1a)

\displaystyle g_j = \frac{\sum_{i=1}^n{x_{ij}}}{n}.

Trong đó n là số dòng của  X, g_j là mean của cột thứ j của  X, được tính như trên.

Normed PCA mang tất cả các feature về cùng một gốc tọa độ, đồng thời chuẩn hóa về cùng một quãng standard-deviation bằng 1:

\displaystyle \hat{\mathbf{X}}=\{\hat{x}_{ij}\},

\displaystyle \hat{x}_{ij}=\frac{x_{ij}-g_j}{\sqrt{n}\sigma_j}.             (1b)

Trong đó \sigma_jđộ lệch chuẩn  (standard deviation) của cột thứ j trong X.

Thông thường Normed PCA hay được dùng. Sau bước tiền xử lí, ma trận \hat{\mathbf{X}} sẽ là đầu vào cho bước tiếp theo.

2. Xây dựng không gian mới

Tính ma trận hiệp phương sai (covariance) của các feature trong \hat{\mathbf{X}}:

\displaystyle \mathbf{V} = \hat{\mathbf{X}}^\mathrm{T}\hat{\mathbf{X}}               (2)

Do là tích của ma trận \hat{\mathbf{X}} với chuyển vị của nó nên \mathbf{V}\in\mathcal{R}^{p\times p} là ma trận positive semidefinite kích thước p\times p. Hơn nữa \mathbf{V}p trị riêng \lambda_i \geq 0, i=1..p.

Tiếp theo, PCA tìm trị riêng và vector riêng tương ứng của \mathbf{V}, sắp xếp theo thứ tự giảm dần của trị riêng. Giả sử p trị riêng của V

\lambda_1 \geq \lambda_2 \geq \cdots \lambda_p,              (3)

p vector riêng tương ứng là

\mathbf{u}_1, \mathbf{u}_2,\cdots ,\mathbf{u}_p.               (4)

Khi đó các trục của không gian mới chính là các vector riêng \mathbf{u}_i ở trên, đương nhiên các vector riêng hoàn toàn độc lập tuyến tính (nghĩa là trực giao đôi một).

Có thể nói trong PCA, trị riêng và vector riêng có vị trí rất đẹp, thỏa mãn tất cả các yêu cầu của PCA. Bản thân tôi khi đọc đến phần này cũng thấy bất ngờ vì lời giải cho PCA không gì khác lại hoàn toàn trọn vẹn trong trị riêng và vector riêng. Tuy nhiên tại thời điềm này, ta sẽ chấp nhận như vậy.  Phần cơ sở Toán học ở cuối bài sẽ giải thích tại sao trị riêng và vector riêng lại xuất hiện (có phần bất ngờ) trong  PCA như vậy.

3. Chuyển dữ liệu từ không gian ban đầu vào không gian mới

Thông thường không gian mới không được xây dựng bằng tất cả p vector riêng trong (4), mà thông thường chỉ từ k vector riêng đầu tiên, với k < p. Tại sao là các vector đầu tiên, và chọn k bao nhiêu thì tốt, ta sẽ bàn trong phần cuối.

Như vậy gọi

\mathbf{U} = \left[\begin{array}{c|c|c|c}\mathbf{u}_1 & \mathbf{u}_2 & \cdots & \mathbf{u}_k\end{array}\right] \in \mathcal{R}^{p\times k}.

Khi đó tọa độ các điểm trong hệ tọa độ mới là

\mathbf{F} = \hat{\mathbf{X}}\mathbf{U}             (5)

Xong. Ta đã kết thúc giải thuật PCA, không thể đơn giản hơn.

Trong phần này ta chỉ thực hiện phân tích các sample trong không gian tạo bởi các feature. Ta còn có thể thực hiện khảo sát các feature trong không gian tạo bởi các sample. Đương nhiên có thể chuyển vị ma trận  X rồi thực hiện tương tự, nhưng đó là cách võ biền, cày bừa. Thực sự không cần phải như vậy, mà nhờ vào những đặc tínhđẹp của trị riêng và vector riêng, ta có thể tính ngay không gian mới của các sample (để biểu diễn các feature) từ các vector riêng trong (4). Trị riêng còn đẹp đến nỗi được dùng trong các tiêu chuẩn để chọn k. Ta sẽ trở lại với 2 vấn đề này trong phần cuối của bài.

Ngoài ra để đánh giá chất lượng của không gian mới tạo bởi PCA, ta dùng 2 độ đo là contributionsquared cosine. Ta cũng dành 2 phần này cho phần cuối bài.

3. Mã nguồn MATLAB

Sau đây là đoạn mã MATLAB minh họa các bước của thuật toán PCA, thực hiện phân tích các observation trong không gian các feature, sau cùng tính các độ đo contribution và squared cosine. Download here.

function [ output_args ] = mypca( X )
  m = mean(X);
  st = std(X, 1);

  sz = size(X);
  % sz(1): number of observations
  % sz(2): number of features

  % normed PCA
  Xhat = zeros(sz);
  for i=1:sz(2)
    Xhat(:,i) = (X(:, i) - m(i))/(sqrt(sz(1))*st(i));
  end
  display('Normed data:');
  display(Xhat);

  % correlation matrix
  V = Xhat' * Xhat;
  display('Correlation between features (columns) of normed data:');
  display(V);

  %eigenvalues
  [eivec, eival] = eig(V);

  % display the eigenvalues accumulation and %
  % sz(2) == number of eigenvalues of V
  eigenInfo = zeros(sz(2), 3);
  sum_eival = sum(diag(eival));
  acc_eival = 0;
  for i=sz(2):-1:1
    acc_eival = acc_eival + eival(i, i);

    % eigenvalues, accumulate, %
    eigenInfo(sz(2)-i+1, : ) = [eival(i, i), acc_eival, acc_eival/sum_eival];
  end
  display('Eigenvalues  Accumulate  Acc ');
  display(eigenInfo);

  %eigenvectors
  eivec2 = zeros(size(eivec));
  for i=1:size(eivec, 2)
    eivec2(:, i) = eivec(:, size(eivec, 2) - i + 1);
  end
  eivec = eivec2;
  display('Full eigenvectors:');
  display(eivec);

  % Ask for number of new coordinates
  respone = input('Number of new coordinates: ');
  dim = respone(1);

  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

  %The new observations
  F = Xhat*eivec(:, 1:dim);
  display('Transformed data (New coordinates of observations):');
  display(F);

  % Contribution of observations
  C = F.^2;
  for i=1:size(C, 2)
    C(:, i) = C(:, i)/eival(sz(2) - i + 1, sz(2) - i + 1);
  end
  display('Contribution of observations:');
  display(C);

  % Squared cosine of observations
  SC = F.^2;
  for i=1:size(SC, 1)
    SC(i, : ) = SC(i, : )/sum(SC(i,: ), 2);
  end
  display('Squared cosine of observations:');
  display(SC);
end

4. Cơ sở Toán học của  PCA

Xem tại đây.

5. Kết luận

Một số hạn chế của PCA:

  • Chỉ làm việc với dữ liệu numeric,
  • Nhạy cảm với các điểm outlier/extreme,
  • Không phù hợp với các mô hình phi tuyến, do PCA hoàn toàn dựa trên các biến đổi tuyến tính.
Advertisements

72 comments

  1. Hi Khoa,
    Trong trường hợp rời rạc và áp dụng lên sample của biến ngẫu nhiên, thì PCA và Kerhunen-Loeve Transforms là một.

  2. Thanks for your reply

    Theo em hiểu thì Karhunen là ma trận A dùng để biến Rx (covariance của X) thành Ry (là ma trận chéo, có các phần tử trên đường chéo là các giá trị riêng của Rx)
    Nhưng khi áp dụng PCA, em thấy từ Rx là mình có thể suy ra giá trị riêng, vector riêng luôn rồi ?
    Tại sao lại cần ma trận chéo ?

  3. Hi em,
    Em tham khảo pp KLT ở đâu thế? Theo anh đọc thì trong trường hợp rời rạc, KLT cũng chỉ dùng ma trận tạo bởi các vector riêng để thực hiện biến đổi các vector ban đầu, giống hệt như PCA.

  4. Em đọc trong bài giảng của thầy L.Q.Ngọc
    Vậy mình có thể hiểu PCA là ý tưởng cơ sở, còn Karhunen Loeve là cài đặt cụ thể của biến đổi vector không anh ?
    Khi dùng PCA để chuyển X thành Y, thì các tài liệu thường chứng minh covariance matrix của Y là ma trận chéo, có các giá trị trên đường chéo là các giá trị riêng của covariance matrix của X. Anh có thể nói rõ hơn chỗ này được ko ?

    Em cảm ơn.

  5. 1. Anh không nghĩ thế. Anh thấy Karhunen Loeve tổng quát hơn PCA.
    2. Anh không thấy lí do tại sao covariance của Y lại phải là ma trận đường chéo. Em có thể nói rõ nội dung chứng minh thế nào ko?

  6. Thank vì bài viết 😉

    ps: “visualize” có thể dịch là “quan sát (một cách) trực quan” (?), tức là quan sát bằng mắt thường.

  7. chao anh

    Hien nay e dang lam de tai ve xu ly anh nhan dang mat nguoi su dung thuat toan pca

    nhung e co mot van de ko hieu ve khai niem truc giao – va truc giao de lam gi

    e cam on anh nhieu

    Rat hy vong nhan duoc su hoi am cua anh

  8. Chao anh

    Em hien dang lam de tai lien quan den xu ly anh nhan dang mat nguoi ( face recognition)

    Qua tim hieu em co gap mot van de ma khong giai thich duoc

    Do la truc giao – Vay truc giao la gi- y nghia cua no de lam gi

    Em cam on anh nhieu

    Chuc anh suc khoe va that nhieu niem vui

    PS: neu co tai lieu lien quan den PCA anh gui qua mail giup e nhe

    vie.hanguyen89@gmail.com

    1. Hi Hà,
      “Trực giao” hiểu nôm na nghĩa là “vuông góc”. Trong đại số tuyến tính, ta nói 2 vector n chiều là trực giao khi và chỉ khi tích vô hướng của chúng bằng 0.

      Thân

  9. Anh Vu ah em co mot thac mac mong anh giup do nhe
    Theo mot tai lieu em doc duoc ve thuat toan PCA gom co 5 buoc co ban:
    1 – lay du lieu
    2 – Tru di tri trung binh ( mean) cua moi chieu ( dimension)
    3- Tinh toan ma tran hiep psai
    4 – Thiet lap vecto dac trung ( feature vector)
    5 – chuyen du lieu ban dau ve khong gian moi

    Buoc thu 2 em ko hieu lam
    Em nghi no la buoc tien xu ly du lieu phai khong ah
    mong anh giup em giai thich nhe

    em cam on anh nhieu!

    1. Hi Ha,
      Đúng vậy, trong bước đó người ta muốn chuẩn hóa dữ liệu sao cho giá trị trung bình (mean) của nó bằng 0.
      Ví dụ X là ma trận sau:
      X = \left(\begin{matrix}2 & 1 \\ 5 & 11 \\ 5 & 6\end{matrix}\right)

      tức là ta có 3 mẫu dữ liệu trong không gian 2 chiều. Nếu thực hiện centered PCA (là cách em mô tả ở trên), thì với mỗi cột, ta trừ đi giá trị trung bình của cột đó. Cụ thể trong ma trận trên thì giá trị trung bình của cột 1 là \left(2 + 5 + 5\right)/3 = 4, và của cột 2 là \left(1 + 11 + 6\right)/3 = 6. Như vậy sau khi biến đổi thì ma trận mới là:
      X = \left(\begin{matrix}2-4 & 1 - 6 \\ 5-4 & 11 - 6 \\ 5-4 & 6 - 6\end{matrix}\right) = \left(\begin{matrix}-2 & -5 \\ 1 & 5 \\ 1 & 0\end{matrix}\right)
      Như vậy sau khi chuyển đổi, ta thấy giá trị trung bình của mỗi cột trong ma trận mới đều bằng 0, đây chính là ý nghĩa của centered PCA.

      Nếu ta chia thêm cho phương sai của mỗi cột, thì các cột trong ma trận cuối cùng sẽ có phương sai bằng 1, và cách làm đó gọi là Normed PCA.

      Thực ra đây không phải là 1 bước bắt buộc của PCA, tuy nhiên vì PCA hoạt động dựa trên trị riêng của ma trận covariance, mà ma trận covariance khá nhạy với “variance” của các biến, nên thực tế cho thấy normed và centered PCA cho kết quả tốt hơn PCA trên ma trận gốc ban đầu.

  10. PS: Em thuc su muon giai quyet bai toan nhan dang mat nguoi theo huong xay dung di tu: Hinh dung van de cot loi (hieu duoc muc tieu cuoi cung) – Xay dung tren co so toan hoc ( tai sao lai su dung nhung cong thuc va ham toan hoc nhu vay) va cai dat thuat toan tren matlab

    Neu A co tai lieu lien quan thi gui giup em nhe anh ( neu duoc thi em mong nhan duoc tai lieu thong qua gmail) hoac neu anh ban ^^ thi co the giup e ten cac tai lieu day du ve no cung duoc )
    Em cam on anh!
    PS: Chuc anh ngay le vui ve !
    And: Em van phai lam viec de hoan thanh final project theo dun tien do

    ( Em rat an tuong voi cach giai quyet bai toan cua anh – Dieu ma it giao vien hien nay tiep can va huong dan students xay dung phuong huong giai quyet van de)
    And: Dac biet la hinh con lac da

    1. Nhận dạng mặt người cũng có khá nhiều phương pháp, không biết em đang làm theo phương pháp nào?

  11. Em cam on anh nhieu! (^-^) ( Em ko nghi la duoc reply nhanh nhu vay)
    Hien em dang lam final Project su dung phuong phap PCA
    Thuc su la em chua qua hieu mo hinh toan hoc cua PP nen Em muon tim hieu no that ky truoc khi xay dung thuat toan cung nhu can xay dung nhung chu y (uu va nhuoc diem cua no) de khac phuc

    neu con thoi gian em se ket hop voi mot so pp khac de cai thien do chinh xac cua chuong trinh anh ah

    Hien gio e su dung matlab de viet chuong trinh ( GUI cho Thiet lap Camera va GUi cho giao tiep phan cung em da hoan thanh)
    mot so code mau tu tren matlab nguoi ta thuc hien cung cuc ky tuyet voi nhung em van muon tu minh viet code duoi goc do am hieu thuat toan anh ah

    ^^ PS: Nhan duoc hoi am cua anh Em rat vui ( quen het met moi lun) ^0^

  12. Chào anh Vũ,
    Trong học máy, ví dụ dùng SVM để luyện, cho tập training set.
    Mục tiêu của mình là dùng PCA để giảm số chiều của các quan sát (giảm số các feature) từ không gian trạng thái ban đầu thành không gian mới. Lấy ví dụ, tập các samples, mỗi sample có 10.000 feature (hiểu nôm na là 10.000 chiều).
    1. Trong trường hợp này cần tìm trị riêng của X^TX, XX^T.
    2. Ở bước phân loại, làm sao biến đổi tập dữ liệu cần phân loại trong không gian cũ sang không gian đã được xây dựng bởi CPA ở trên.
    Xin cảm ơn anh!

    1. Hi em,
      1. Anh không hiểu câu này. Thông thường em có thể chạy PCA bằng các cài đặt có sẵn (OpenCV hay MATLAB) để tìm ma trận U. Sau đó thì chiếu toàn bộ dữ liệu ban đầu lên không gian của U. Việc này hình như cũng được làm sẵn luôn rồi.
      2. Trong trường hợp PCA là input cho SVM (tổng quát là các thuật toán supervised), thì em nên làm như sau:
      – Chạy PCA trên training set để tìm ma trận U của các vector riêng. Lưu lại ma trận U này.
      – Chiếu training set vào không gian mới: X’ = X*U. Dùng X’ để huấn luyện SVM.
      – Trong quá trình test, vì các vector trong tập test ở trong không gian ban đầu nên cần phải chiếu vào không gian của U, tức là tính Y’ = Y*U, trong đó Y là tập test ban đầu, Y’ là tập test trong không gian PCA.
      – Dùng Y’ để test mô hình đã huấn luyện.

      Thân.

    1. Hy dduuyy,
      Cách làm của 2DPCA khá đơn giản. Giả sử cho tập ảnh huấn luyện A_1, A_2, \ldots , A_n thì 2DPCA tìm ma trận sau:
      \displaystyle G = \sum_{i=1}^n\left(A_i - \bar{A}\right)^\top\left(A_i - \bar{A}\right)

      trong đó \bar{A} = \frac{1}{n}\sum_{i=1}^n A_i là trung bình cộng của tất cả các ảnh.

      Sau đó 2DPCA tìm trị riêng và vector riêng của ma trận G, các vector riêng ứng với các trị riêng lớn nhất sẽ là cơ sở cho không gian mới. Trong PCA thì ta dùng ma trận covariance, còn 2DPCA thì dùng ma trận G. Còn lại hoàn toàn tương tự.
      Không hiểu bạn không rõ chỗ nào.

  13. Cam on ban tra loi minh!
    Cai minh khong hieu la giua pca va 2dpca, thi cai nao tot hon!
    va muon xin ban thuat toan cua 2dpca.
    Minh lap trinh hoai ma khong duoc, chac tai thuat toan minh bi sai

    1. Theo mình hiểu thì 2DPCA có chi phí thấp hơn PCA truyền thống vì ma trận dùng để tính trị riêng của 2DPCA nhỏ hơn nhiều so với ma trận trong PCA. Về hiệu quả thì hình như là tương đương, mình không chắc lắm, bạn có thể xem thêm trong paper của 2DPCA.
      Bạn có thể download toolbox này, trong đó có chứa các hàm liên quan đến 2DPCA:
      http://www.mathworks.com/matlabcentral/fileexchange/12333-statistical-learning-toolbox

  14. Một số hạn chế của PCA:

    Chỉ làm việc với dữ liệu numeric,
    Nhạy cảm với các điểm outlier/extreme,
    Không phù hợp với các mô hình phi tuyến, do PCA hoàn toàn dựa trên các biến đổi tuyến tính.

    Nhờ anh Vu giải thích dùm em 3 ý trên với , em còn mơ hồ quá . Cảm ơn anh

    1. Hi Minh,
      1/ Chỉ làm việc với dữ liệu numeric: PCA không thể sử dụng được cho dữ liệu categorical. Ý là dữ liệu trong ma trận X phải là số thực (liên tục), chứ không phải là các categorical variable.

      2/ Nhạy cảm với các điểm outlier/extreme: nếu có vài điểm outlier (ngoại lệ) trong dữ liệu ban đầu thì “chất lượng” của PCA có thể sẽ không cao. Chất lượng không cao theo nghĩa là dữ liệu sau khi biến đổi PCA sẽ có thể không giữ được variance cao như ban đầu.

      3/ Không phù hợp với các mô hình phi tuyến, do PCA hoàn toàn dựa trên các biến đổi tuyến tính: bản chất PCA là thực hiện một biến đổi tuyến tính từ không gian ban đầu sang không gian mới. Theo nghĩa đó thì PCA không “mạnh” bằng các phép biến đổi phi tuyến như RBF v.v…

  15. anh Vu ơi cho em hỏi chỗ này tí :
    khi em test bên cửa sổ command matlab Xhat’ thì xuất ra được ma trận nghịch đảo nhưng khi vào code trong hàm thì báo lỗi ngay dòng này V= Xhat’ * Xhat em dọc đủ kiểu mà cũng ko tìm được ma trận nghịc đảo
    Chi tiết lỗi :
    ??? Error using ==> ctranspose
    Transpose on ND array is not defined.

    Error in ==> mypca at 18
    V = Xhat’ * Xhat;

    Cảm ơn anh đã đọc

    1. Hi em,
      Anh vừa thử lại nhưng không thấy có lỗi gì cả. Có thể ma trận input X của em có nhiều hơn 2 chiều nên mới có lỗi trên. Trước khi gọi mypca(), em thử gọi size(X) xem kết quả là gì nhé.
      Em có thể download file mypca.m ở đây: https://www.box.com/s/l7jgipl8eyqdwzlxnr2o
      Matlab đã cài đặt sẵn PCA trong hàm princomp (http://www.mathworks.fr/fr/help/stats/princomp.html). Nếu em dùng PCA trong chương trình của em thì nên dùng hàm của Matlab. Cài đặt của anh chỉ để minh họa cho thuật toán thôi.

  16. anh Vu có code nào trong matlab để nhận dạng khuôn mặt bằng thuật toán PCA có sử dụng Yale Face Database hok. Thuật toán PCA thì em đọc của anh đã nắm rõ . Nhưng khi áp dụng bộ dữ liệu Yale Face Database thì em chưa bít . Nếu anh có thì gửi mail cho em với (minhchi_a4@yahoo.com) . Cảm ơn Anh Vu nhiều

  17. anh Vu ơi giải thích kỹ dùm em vài câu hỏi mà em còn thắc mắc với nha :
    câu 1 : Tại sao PCA lại dùng vector riêng và trị riêng ? Dùng nó có ích lợi gì ?
    câu 2 : cách tìm K trị riêng tương ứng với vector riêng của anh viết ở trên và cái link anh chia sẽ cho em ở trên nó tìm k = cách lấy những trị riêng tương ứng với vector riêng > 1 thì cách chọn k nào tốt hơn anh Vu … em test thử cách theo cái link này thì có hình trả về đúng , có hình trả về kết quả sai http://www.mathworks.fr/matlabcentral/fileexchange/17032-pca-based-face-recognition-system

    câu 3: PCA dùng để nén dữ liệu thì mình lưu lại cái gì để mình có thể giải nén chính xác như ban đầu ?

    Thanks anh đã đọc

  18. Hi mọi người, e đang làm đề tài về nhận dạng một số thao tác cơ bản của tay người, trước mắt e định làm trên các ảnh tĩnh, sau đó nếu ngon nghẻ thì sẽ làm trên webcome. Hiên e mới biết ngâm cứu thuật toán PCA, bác nào có quyển face recognition using eigenfaces and neural network không, share cho e với.
    Mail của e là: tieudoan208@gmail.com Thanks mọi người rất nhiều

  19. Hi anh, anh có thể giải thích em thắc mắc này không ạ.
    Em có một tập dataset có 58 samples, mỗi samples có 166200 features. Em dùng PCA trong matlab đề giảm số lượng features xuống . Sau khi giảm thì số features cao nhất mà em có thể đạt được là 57. Em không hiểu tại sao lại như vậy.

      1. Hi anh,
        Cảm ơn anh đã trả lời câu hỏi của em. Em dùng hàm pca ở trong thư viện cua prtools anh ạ.

  20. Minh Khởi
    Chào bạn!
    – kết quả của output_args là gì sao trong code không thấy bạn trả về giá trị cho nó?
    – Nếu mình cho pca cho 1 ảnh thì kết quả mình được gì? lợi ít gì? có cón nhìn thấy ảnh với hàm imshow được không?

  21. Chào a Vũ
    PCA có thể áp dụng để nhận dạng ra người và không phải người dựa vào silhouette đươc không a?…
    Anh có thể hướng dẫn em cách áp dụng đươc không ạ?..
    Anh có code C trong opencv về vấn đề này không a, em đang rất muốn tham khảo để hiểu về nó.
    Cảm ơn a.

  22. a Vũ ơi, em thấy trong opencv đã định nghĩa sẵn lớp PCA rồi, vậy không biết nó có khác gì so với những nội dung anh đề cập đến ở đây không anh? nếu em muốn sử dụng PCA trong opencv thì có cần định nghĩa lại không anh?…

  23. Chào anh. Bài viết rất bổ ích mà em đang cần..
    Em đang làm 1 project nhận dạng ra những đối tượng đã lưu sẵn trong Tranning Set.

    Em định nhận dạng đối tượng đó luôn bằng cách đo khoảng các Eclid và tìm MIN nó trong trong tập
    Tranning Set đa được chuẩn hóa theo PCA.

    Theo anh thì nó có khả thi và hiệu quả cao không ạ. ?

    Thanks !

    1. Hi em,
      Tùy vào dữ liệu của em như thế nào. Nói chung dùng PCA thì feature thu được có vẻ hơi “low-level”, nên độ chính xác có thể không cao. Em có thể xem xét dùng Histogram of Gradients (HoG) để rút đặc trưng (thay vì PCA), và dùng SVM để phân lớp (thay vì khoảng cách Euclide, tương ứng kNN với k=1).

      Tuy nhiên còn tùy vào dữ liệu của e nữa.

  24. Nếu sử dụng Normed PCA mà độ lệch chuẩn sigma(i)=0 thì giải quyết thế nào hả anh? Liệu có còn sử dụng phương pháp này được nữa ko?

    1. Trong trường hợp đó anh thấy người ta hay dùng smoothing bằng cách cộng 0.01 vào variance:

      \sigma = \sqrt{var(X) + 0.01}

      trong đó var(X) là hàm tính variance của các cột trong ma trận X (giống hàm var() trong matlab).

      Cách này sẽ đảm bảo \sigma > 0 và em có thể chia bình thường. Nhớ là nếu dùng smoothing thì em phải cộng 0.01 vào variance của tất cả các cột, chứ không phải chỉ cộng vào những cột có \sigma_i = 0.

      Đương nhiên em có thể dùng giá trị khác thay vì 0.01, nhưng không nên chọn giá trị nhỏ quá hoặc lớn quá.

      1. Em cảm ơn anh rất nhiều vì vừa có cách giải quyết thỏa đáng lại vừa nhanh, đây là vấn đề em đang gặp thực tế ạ.

  25. chào anh. bài viet cua a thuc su rat bo ich.
    em muốn hỏi anh 1 vấn đề ạ: em dùng thuật toán PCA để phát hiện khuôn mặt thì cái ngưỡng thường dùng để quyêt định xem đó có phải là khuôn mặt hay không thường được chọn như thế nào ạ?? e ko hiểu chỗ đó.mong a giải đáp

    1. s<α thì H là bức ảnh khuôn mặt ( do H đủ gần với không gian mặt). cai nguong a o day lấy giá trị như thế nào là hợp lí ??

      1. Hi em,
        Câu hỏi của em thuần tuý phụ thuộc vào mô hình máy học em đang dùng. Cụ thể anh không biết “s” được tính thế nào nên không thể trả lời chính xác được.

        Tuy nhiên anh đoán là em sử dụng thuật toán nearest neighborhood (s là khoảng cách Euclid hoặc đại loại vậy). Trong trường hợp đó thì em cần chọn \alpha sao cho tỉ lệ nhận dạng trên tập validation set là cao nhất.

        Tuy nhiên em nên sử dụng các thuật toán mạnh hơn, chẳng hạn SVM.

  26. Em chào a ạ.
    Em nghe cô giáo em nói thì PCA làm giảm số chiều theo kiểu % chính xác. vậy em muốn kiểu như pca(X, %) thì em phải cài như thế nào ạ. em cảm ơn a ạ

  27. Chào anh.
    Em đang tìm hiểu về PCA. Anh cho em hỏi từ trị riêng và vector riêng có mối liên hệ nào với input (X) không? và nhận biết được thành phần nào quan trọng trong X?

  28. Chào Anh!
    Em cũng đang nghiên cứu về PCA, em có ví dụ cụ thể: các nhân tố: GPD, dân số, giới, tỷ lệ hộ nghèo, số trạm y tế, cơ sở hạ tầng,… trong các nhân tố đó Em có thể dùng phương pháp PCA để xác định nhân tố nào bị ảnh hưởng nhiều khi lũ về không Anh?
    Em rất vui khi nhận được hồi âm của Anh ^^. Chúc Anh thành công!

  29. %eigenvectors
    eivec2 = zeros(size(eivec));
    for i=1:size(eivec, 2)
    eivec2(:, i) = eivec(:, size(eivec, 2) – i + 1);
    end
    eivec = eivec2;
    display(‘Full eigenvectors:’);
    display(eivec);

    anh cho em hỏi dòng lệnh trên có phải là sắp xếp eivec2 tăng dần không ạ? em đọc mà không hiểu lắm, nếu vậy em có thể thay bằng dòng eivec2 = sort(eivec,2); không anh?

  30. Gửi anh Vũ,

    Em là sinh viên năm cuối và đang làm đồ án về tìm hiểu phương pháp PCA để nhận biết nguồn gốc dầu. Từ hôm nhận đồ án em đã tìm kiếm tài liệu về PCA mà không tìm được đúng. Đến khi đọc được bài viết này của anh, em thực sự có động lực để làm tiếp đồ án cũng như em đã có cái nhìn tổng quát PCA là gì. Anh Vũ có thể cho em xin thêm tài liệu về PCA được không ạ? Em muốn tìm hiểu thêm về các bước giải quyết bài toán bằng PCA, từ tập hợp số liệu cho đến khi đưa vào không gian có số chiều ít hơn (làm thế nào để chuyển đổi số liệu từ không gian nhiều chiều đưa vào không gian có số chiều ít hơn) và đánh giá kết quả.

    Em rất mong nhận được hồi âm của anh!

    Chân thành cảm ơn anh!

      1. vâng ạ, a giải thích giúp em vòng lặp for ở dòng 30 được ko, em bối rối quá

  31. Anh cho em hỏi trong bước 2 xây dựng không gian mới, ma trận hiệp phương sai cov(X,Y) sẽ được theo cách khác chứ không phải theo công thức (2), vì (2) thực chất là ma trận tự tương quan của các đặc trưng.
    – Trong phần code của anh, có đoạn
    % correlation matrix
    V = Xhat’ * Xhat;
    fprintf(1, ‘Correlation between features (columns) of normed data:’);
    V
    như vậy tên bước với tính toán có vẻ không thống nhất a..
    Rất mong anh giải đáp thắc mắc của em. Thank anh!

    1. Ah tại vì đối với các biến ngẫu nhiên đã chuẩn hoá (phương sai bằng 1) thì ma trận correlation chính là covariance.
      Trong bước 1 ta chuẩn hoá các đặc trưng bằng phương sai, nên correlation hay covariance cũng như nhau.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s