← 回課程入口
Raman 指紋比對 · Python / R / Orange

同一套流程,三種工具都跑一遍

用 CuPc(銅酞菁 / PB15)與亮藍 FCF(三芳基甲烷)兩種藍色料的拉曼光譜當教材,把「基線 → 找峰 → 比對 → 分類」這條分析鏈,分別用 Python、R、Orange Data Mining 走一次——讓學生看到同一個概念在三種介面下的樣子。

01 先看要比對的東西

兩種藍色料的參考指紋

關鍵差異一眼可見:CuPc 有 pyrrole/isoindole 四峰組(748 / 1337 / 1450 / 1526),FCF 沒有,改以芳香環伸縮叢集(1534 / 1587 / 1619)為主。這張圖由下方 Python 腳本的峰位表合成。

CuPc 與 FCF 的拉曼參考光譜並排比較
上:CuPc(銅酞菁)· 下:FCF(亮藍/三芳基甲烷)。峰位:CuPc 文獻+實測錨定;FCF 為 Erioglaucine SERS 文獻峰位,強度示意。
02 共同流程

五個步驟,三種工具一致

01

載入

讀 CSV:波數 + 強度

02

基線校正

ModPoly 去螢光背景

03

找峰

區域極大 + 門檻

04

比對

與參考庫算相關係數

05

分類

PCA + kNN / 類心

03 三種寫法

程式碼對照

下面三個分頁是同一條流程的三種實作。完整可執行檔在最後的檔案清單,這裡只列核心。

# 1. 載入 + 3. 找峰 + 4. 比對(核心)
import numpy as np

def modpoly(x, y, order=5, it=24):        # 2. ModPoly 基線
    yw = y.copy()
    for _ in range(it):
        c = np.polyfit(x, yw, order)
        yw = np.minimum(yw, np.polyval(c, x))
    return np.polyval(np.polyfit(x, yw, order), x)

def pick_peaks(x, y, min_h=0.05, min_dist=9):  # 3. 找峰
    idx = np.where((y[1:-1]>=y[:-2]) & (y[1:-1]>y[2:])
                   & (y[1:-1]>=min_h))[0]+1
    idx = idx[np.argsort(-y[idx])]; keep=[]
    for i in idx:
        if all(abs(x[i]-x[j])>=min_dist for j in keep): keep.append(i)
    return sorted(keep)

# 4. 與參考光譜比對(皮爾森相關)
corr = {name: np.corrcoef(sample, r)[0,1] for name,r in refs.items()}
verdict = max(corr, key=corr.get)          # -> 'CuPc'

# 5. 監督式分類(PCA + kNN,交叉驗證)
from sklearn.pipeline import make_pipeline
from sklearn.decomposition import PCA
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import cross_val_score
clf = make_pipeline(PCA(5), KNeighborsClassifier(3))
acc = cross_val_score(clf, X, y, cv=5).mean()   # -> 1.00
實際輸出(範例未知樣品):相關係數 CuPc = 0.984,FCF = 0.014 → 判定 CuPc;PCA(5)+kNN 5-fold 正確率 = 1.00。
04 檔案

教材檔案清單

raman_compare.pyPython 完整腳本:合成兩種光譜、畫比較圖、匯出資料、跑分析。執行即產生下面的圖與 CSV。
raman_compare.Rbase R 版,逐行對照 Python;讀 CSV、基線、找峰、比對、PCA 分類。
raman_reference_spectra.csv參考光譜(共同波數軸):欄 = wavenumber, CuPc, FCF。給 R / 檢視用。
raman_spectral_library.csv含標籤光譜庫,60 條(各 30 條加雜訊/位移),列=光譜、欄=波數、末欄 class。給 Orange / 機器學習。
raman_cupc_vs_fcf.png上方那張並排比較圖。
05 教學設計

對應三層教學

Layer 1 · 直覺

並排比較圖

先讓學生「看」出四峰組有/無的差別,建立指紋概念,不碰程式。

Layer 2 · 演算法

Python / R

把基線、找峰、相關比對拆成看得懂的函式,理解每步在做什麼。

Layer 3 · 動手

Orange

用拉元件的方式跑同一條流程,專注在方法選擇與結果判讀,不寫程式。

資料誠實性:本教材的光譜由峰位表合成,方便控制與重現。CuPc 峰位取自多篇文獻並以實測孔雀藍樣品錨定相對強度;FCF 峰位取自 Erioglaucine 的 SERS 文獻,強度為示意值。實際課堂可換上學生自己量測的光譜,流程完全相同。
延伸:把 FCF 換成其他食用色素(如靛藍 Indigo carmine / E132),或加入混合物樣品,讓學生練習「主成分是強散射者、次成分被遮蔽」的判讀。