iPAS 備考專區 登入

iPAS AI 應用規劃師 中級 科目三 機器學習技術與應用・114 年第二次・L23・第 46 題

PCA 降噪失效,哪一段程式碼需要修改?

原題

在郵遞區號自動辨識的研究中,研究人員收集了一份手寫數字影像資料集(UCI sklearn digits, 8×8 灰階),共 1797 筆。研究人員把含有雜訊的手寫數字影像存放在變數 noisy 中,部分資料經視覺化後外觀如附圖所示。他們嘗試使用 PCA 進行降噪,並希望能保留影像的主要特徵,同時去除影像中的雜訊。 程式碼如下: 程式碼 A: import numpy as np; noisy = np.random.normal(digits.data, 4) 程式碼 B: from sklearn.decomposition import PCA; pca = PCA() 程式碼 C: pca.fit(noisy) 程式碼 D: components = pca.transform(noisy) 程式碼 E: filtered = pca.inverse_transform(components) 當程式執行後,觀察到影像仍然含有明顯的雜訊。研究人員懷疑是程式中某步驟的設定不正確,導致 PCA 沒有發揮降噪的作用,需要修改程式碼才能讓降噪有效。請問哪一段程式碼需要修改,才能讓 PCA 對 noisy 影像有效去噪?

白話

郵遞區號辨識專案的研究人員對手寫數字影像加了雜訊,然後試著用 PCA 來降噪。整個流程分為五段程式碼:A 加雜訊、B 建立 PCA 物件、C 訓練 PCA、D 轉換到 PCA 空間、E 轉換回原始空間。執行後,降噪效果完全沒有,影像雜訊依然明顯。

問你:五段程式碼中,哪一段有問題,導致 PCA 降噪完全無效?

一句話總結

PCA 降噪失效的原因是程式碼 B:PCA() 沒有指定 n_components 參數,等於保留所有主成分,這樣 transform + inverse_transform 就是把資料原封不動轉一圈回來,雜訊完全沒有被去除。

情境

先感受問題:PCA 為什麼能降噪,又為什麼失效?

郵遞區號辨識專案的研究人員拿到了 1,797 張 8×8 手寫數字影像,每張有 64 個像素特徵。他們人工加入標準差為 4 的高斯雜訊,想用 PCA 降噪:先把 64 維特徵壓縮到「最重要的前 K 個主成分」,再還原回來,還原時,次要主成分(包含雜訊的部分)就被丟掉了,影像變乾淨。

這個邏輯完全正確,但有一個關鍵前提:必須指定「保留幾個主成分(K)」。如果 PCA() 沒有指定 n_components,sklearn 預設保留所有 64 個主成分,等於沒有降維,transform 後再 inverse_transform 就是完整的資料還原,什麼雜訊都沒有去掉。

舊方法

PCA 降噪為什麼沒有效?五段程式碼逐一診斷

  1. 程式碼 A(加雜訊)正確:np.random.normal(digits.data, 4) 為每個像素值加入均值為 0、標準差為 4 的高斯雜訊,這是標準的雜訊模擬做法,沒有問題。
  2. 程式碼 B(建立 PCA 物件)有問題:PCA() 不指定 n_components,等於 n_components=None,sklearn 預設保留 min(樣本數, 特徵數) = min(1797, 64) = 64 個主成分,等於保留全部,沒有任何降維或降噪效果。
  3. 程式碼 C(訓練 PCA)正確:pca.fit(noisy) 對加了雜訊的資料學習主成分方向,這步沒有問題。
  4. 程式碼 D(轉換)正確:pca.transform(noisy) 把資料投影到主成分空間,邏輯正確。
  5. 程式碼 E(還原)正確:pca.inverse_transform(components) 從主成分空間還原到原始空間,邏輯正確。但因為 B 沒降維,D 和 E 就等於無意義的往返,雜訊沒有去除。

新方法

修改 PCA(n_components=K),只保留前 K 個主成分

正確的修改方式是把程式碼 B 改成 pca = PCA(n_components=0.95) 或 pca = PCA(n_components=32):

  • n_components=0.95:保留能解釋 95% 變異量的最少主成分數,sklearn 自動決定 K 的值(digits 資料集約需 20-30 個主成分)
  • n_components=32:明確保留前 32 個主成分,丟棄後 32 個(通常包含高頻雜訊)

保留主要主成分後,次要主成分(方差小、通常對應雜訊)在 inverse_transform 時不再還原,達到降噪效果。對 digits 資料集,保留約 20-30 個主成分通常就能有效去噪,同時保留數字的基本形狀。

這就是選項 B 講的:程式碼 B 需要修改,加上 n_components 參數。

錯選項

為什麼其他選項是錯的

A程式碼 A

字面在說什麼

加雜訊的方式有問題,需要修改。

為什麼不對

np.random.normal(digits.data, 4) 是標準的高斯雜訊模擬:第一個參數是均值(用原始資料值),第二個參數是標準差(4),為每個像素獨立採樣雜訊。這是正確且常見的做法,對 PCA 降噪的後續步驟沒有影響。問題不在這裡。

誰會選錯

不熟悉 np.random.normal 的參數順序,以為「標準差 4 太大」或「參數填錯了」,懷疑雜訊本身加得有問題。

C程式碼 C

字面在說什麼

pca.fit(noisy) 用含雜訊的資料訓練 PCA 是錯誤的,應該用乾淨資料。

為什麼不對

用 noisy 資料訓練 PCA 是正確做法。降噪 PCA 的邏輯是:從含雜訊的資料中學習主要變異方向,訊號(數字形狀)的變異量遠大於隨機雜訊的變異量,所以前幾個主成分仍然主要捕捉訊號,後面的主成分才是雜訊。用乾淨資料訓練雖然理論上更好,但實務中通常沒有乾淨資料,用 noisy 資料是標準做法。

誰會選錯

直覺上覺得「訓練資料有雜訊,PCA 學到的主成分也會有雜訊污染」,但實際上訊號的方差仍遠大於雜訊,PCA 仍能找到正確方向。

D程式碼 D

字面在說什麼

pca.transform(noisy) 的用法有問題。

為什麼不對

pca.transform(noisy) 把含雜訊的影像投影到主成分空間,是標準的降噪流程。問題不在這裡,而在 B 沒有限制主成分數,所以 transform 保留了所有維度,後面的 inverse_transform 才能完整還原雜訊。D 的操作本身沒有錯。

誰會選錯

看到「把含雜訊的資料做 transform」就覺得哪裡怪怪的,其實這正是降噪的必要步驟,問題不在 D。

變形題

同個考點下次怎麼變形

延伸

想再往下看,這 5 個

答案、題目或解析有問題?回報這題

出處:iPAS 經濟部產業人才能力鑑定 ・ 114 年第二梯次 iPAS AI 應用規劃師 中級 科目三 機器學習技術與應用 第 46 題

看官方原文 PDF

原題 © 經濟部產業發展署,AITerms.tw 僅作教學解析使用,本站解析以 CC BY-NC-SA 4.0 授權。