用眼睛看,四種都是白色細粉,長得一模一樣。但只要量一段光譜,形狀騙不了人。
今天的任務: 用 W10 全班量測的純化合物光譜,建立一個小型光譜庫(spectral library), 再鑑別 TA 準備的盲樣與市售代糖——最後互相比對誰的比對分數最有說服力。
前處理工具:本堂課用 SpectraView (GitHub) ↗(操作文件 ↗)操作 SG 平滑、基線、SNV/MSC、導數、尋峰與 .speclib 光譜庫比對;入門也可以用 Orange 流程 OR11 ↗:File → Preprocess Spectra(ALS 扣基線 → 向量正規化)→ Distances(Pearson) → Distance Matrix + Hierarchical Clustering,只做「找出最像哪一個」的定性鑑別——混合物的 NNLS 定量仍要用 Colab NB09。
每一個波長/波數只是「一欄」,強度值只是「一格數字」——本堂課的示意光譜共 71 個資料點(每 20 cm⁻¹ 一點),一條光譜=71 個數字排成一列。前處理(尖峰移除、基線、SNV…)其實就是「對每一列做同一套運算」。
| Raman shift (cm⁻¹) | 400 | 420 | 440 | 460 | 480 |
|---|---|---|---|---|---|
| 強度 (a.u.) | 0.431 | 0.448 | 0.457 | 1.355 | 0.466 |
Excel 裡:一列(row)=一條光譜,71 欄=71 個波數;在 Excel 對一整列套用同一個公式(例如 SNV),就是「前處理」;71 個樣品 × 71 欄,就是 W12 起要用到的資料表 X。
先用「中值濾波(median filter)」估計每個點附近應該長怎樣,再看每個點偏離這個估計多遠——偏離用「穩健的標準差」MAD(median absolute deviation)來算,換成「修改式 Z-score」;偏離超過 6 個 robust SD 就判定是尖峰,用中值濾波的值取代它。
| 位置 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
|---|---|---|---|---|---|---|---|
| 原始值 | 0.30 | 0.31 | 0.29 | 2.10 | 0.32 | 0.30 | 0.29 |
| 7 點中值濾波 | 0.30 | 0.30 | 0.30 | 0.30 | 0.30 | 0.29 | 0.29 |
| 修改式 Z-score | 0.0 | 0.7 | -0.7 | 121.4 | 1.3 | 0.7 | 0.0 |
| 修正後 | 0.30 | 0.31 | 0.29 | 0.30 | 0.32 | 0.30 | 0.29 |
第 4 點 2.10,z ≈ 121(遠超過 6)→ 判定為宇宙射線尖峰 → 用中值濾波估計值 0.30 取代。窗口(window)太寛,可能連真實的窄波峰都被判定成尖峰而誤刪;太窄則可能漏抓尖峰——NB09/OR11 都用 7 點窗口、z>6。
NB09/Orange OR11 的預設都是 λ=10⁶、p=0.01——本課的共同標準。Orange 操作路徑:Preprocess Spectra → ALS。
公式:y′=(y−ȳ)/s,ȳ=這條光譜自己的平均值,s=這條光譜自己的標準差(population SD,除以 n 不是 n−1)。
| 點1 | 點2 | 點3 | 點4 | 點5 | |
|---|---|---|---|---|---|
| y | 0.2 | 0.4 | 0.9 | 0.5 | 0.3 |
| y′ (SNV後) | -1.08 | -0.25 | 1.82 | 0.17 | -0.66 |
ȳ=0.46,s=0.242(population SD)。把每個 y 換成「離平均幾個標準差」,就是 y′。刻意把 y 換成 2y+0.1(強度放大兩倍再平移)算一次 SNV,結果完全一樣——這就是 SNV 對平移與縮放都不敏感的原因。
Excel:=(B2-AVERAGE($B2:$F2))/STDEV.P($B2:$F2)(注意用 STDEV.P 不是 STDEV.S)。MSC 概念相同,差別在拿一條參考光譜(通常是平均光譜)做迴歸 y=a+b·y_ref,再用 (y−a)/b 校正。
強度差異也可用向量正規化(除以向量長度)或面積正規化(除以光譜下面積)處理——下一節會用到。
1st 導數=相鄰兩點的差值;2nd 導數=差值的差值。
| 光譜 y | 1st 導數(差分) | 2nd 導數(再差分) |
|---|---|---|
| [1, 2, 4, 7] | [1, 2, 3] | [1, 1] |
把整條光譜都加上一個常數(等於基線整體平移,如 [6, 7, 9, 12]),1st 導數完全不變——因為差分會把常數消掉;線性的斜率(整條光譜同一個方向慢慢升高)在 2nd 導數也會被消掉。代價是:雜訊(逐點隨機跳動)本身變化快,差分會把它一起放大,所以導數常常要搭配平滑(如 SG)一起用。
| 指標 | 公式 | 對「強度大小」敏感嗎 |
|---|---|---|
| Pearson r | 兩條光譜「形狀」的相關程度(W04 ↗已教過) | 不敏感(平移、縮放都不影響) |
| cosine | 把光譜當向量,算 cosθ=(x·y)/(‖x‖‖y‖) | 縮放不敏感,但平移敏感 |
| SAM (光譜角) | SAM = arccos(cosine) × 180/π(換算成「度」) | 同 cosine——角度越小越像 |
| Euclidean | ‖x−y‖,直接算數值差異 | 非常敏感——比對前一定要先正規化 |
待測 U=[0.10,0.35,0.90,0.40,0.15],候選 C=[0.12,0.32,0.95,0.38,0.22](形狀跟 U 略有不同,但絕對數值很接近 U)。
| 指標 | U vs C |
|---|---|
| cosine | 0.9968 |
| SAM | 4.59° |
| Pearson r | 0.9911 |
| Euclidean(原始,未正規化) | 0.095 |
| Euclidean(向量正規化後) | 0.080 |
跟「真正正確」的候選比:原始 Euclidean d(U,真正正確)=0.510,比上面這個 C 的 0.095 還大——原始距離會誤判 C 比較像!但正規化後,d(U,真正正確)=0.048,比 C 的 0.080 小,才判斷正確。Pearson r、cosine、SAM 因為本來就對強度不敏感,一開始就沒有判斷錯。(真正正確的候選是誰?留給後面的計算闖關 ⑥ 讓你自己算出來。)
| 候選化合物 ⇅ | Pearson r ⇅ | cosine ⇅ | SAM (°) ⇅ | 排名 ⇅ |
|---|
File 讀入光譜庫+未知樣品 → Preprocess Spectra:ALS 扣基線(λ=10⁶、p=0.01) → 向量正規化 —— 光譜庫與未知樣品用完全相同的設定Distances:選 Pearson,Orange 會把相關係數換算成距離 = (1−r)/2——r 越接近 1(越像),距離越接近 0Distance Matrix:找未知樣品那一列,數字最小的那一格對應的光譜庫樣品,就是最相似的答案Hierarchical Clustering:同一批光譜的樹狀圖(dendrogram)——兩個樣品之間合併的分支越短,代表它們越相似| 時間 | 內容 |
|---|---|
| 0:00–0:50 | 講解:三個「不能直接比較」的問題、尖峰移除、ALS 基線、SNV/MSC/SG、四種相似度指標 |
| 0:50–1:40 | SpectraView 前處理練習:同一條光譜試不同參數(λ、p、SG 視窗/階數),記錄選擇理由 |
| 1:40–2:35 | 用 W10 純化合物光譜建立班級光譜庫(或用 Orange OR11),比對 TA 準備的盲樣 |
| 2:35–3:30 | 市售代糖量測(Raman 785nm + 各組 NIR)與光譜庫比對 |
| 3:30–4:00 | 各組報告 top-3 結果與相似度分數 |
Colab NB09:在 Colab 開啟 NB09 ↗ ・入門(不用寫程式):Orange 流程 OR11 ↗。報告需附:光譜庫比對表(top-3)、疊圖、一個假陽性/模糊比對的討論、前處理參數選擇理由。
點一下打勾。