5.2 案例二:药品真伪鉴定


5.2 案例二:药品真伪鉴定

本节摘要:一批片剂要透过泡罩包装、不拆不毁、快速判真伪——拉曼是首选,但荧光背景会把相似度全面压低。全案记录 ALS 扣荧光前后的天壤之别:整备得当,同一阈值下判定从全部误判翻转为灵敏度特异性双满分;阈值本身从正品分数分布导出,不拍脑袋。

一、背景:不拆包装的鉴定需求

药品稽查场景有几个苛刻约束:样品是证据,拆封即破坏;现场查获量动辄上百盒,逐片送实验室不现实;假药的"假"法多样——活性成分减半、辅料替换、甚至掺入替代物质,外表可以做得毫无破绽。拉曼正好对症:激光透过透明泡罩直接照射片剂,包装聚合物与水都是弱拉曼散射体(1.2 节的选型逻辑),指纹区的峰位直接对应活性成分的分子骨架。

本案模拟数据集:二十片正品(活性成分正常、辅料一致)与十五片查获品(活性成分只有正品的四成半、掺替代成分、且荧光背景更强——造假工艺差的典型特征)。鉴定策略走谱库比对路线:与正品参考谱算相似度,低于阈值判假。

二、操作:扣荧光、比相似度、定阈值

拉曼谱的荧光背景是一条随波数缓升的曲线,叠在指纹峰下面,直接比对会把所有相似度都拖下水。整备链路两步:ALS 扣背景(2.4 节的主力工序),向量归一化统一幅度:

# 案例二:拉曼整备 + 谱库比对 import numpy as np from scipy import sparse from scipy.sparse.linalg import spsolve rng = np.random.default_rng(77) x = np.linspace(600, 1800, 500) # 拉曼位移轴 def drug_raman(api=1.0, exc=0.5, extra=None): s = (api*1.0*np.exp(-0.5*((x-1000)/12)**2) # 活性成分特征峰 + api*0.6*np.exp(-0.5*((x-1260)/15)**2) + exc*0.5*np.exp(-0.5*((x-880)/18)**2) # 辅料宽带 + exc*0.3*np.exp(-0.5*((x-1450)/22)**2)) if extra: # 假药特有的替代成分峰 s += extra*0.7*np.exp(-0.5*((x-1580)/10)**2) return s def als(y, lam=1e6, p=0.01, niter=15): # 2.4 节的 ALS 实现 L = len(y) D = sparse.diags([1, -2, 1], [0, -1, -2], shape=(L, L-2)) DTD = lam*(D @ D.T); w = np.ones(L) for _ in range(niter): W = sparse.diags(w) z = spsolve((W + DTD).tocsc(), w*y) w = p*(y > z) + (1-p)*(y < z) return z S, labels = [], [] # 0 正品 1 假药 for _ in range(20): # 正品:荧光中等 y = drug_raman() + (0.5+0.3*rng.uniform())*np.exp(x/900) S.append(y + rng.normal(0, 0.02, 500)); labels.append(0) for _ in range(15): # 假药:API 减半+替代成分+荧光强 y = drug_raman(0.45, 0.6, extra=1.0) + (0.8+0.5*rng.uniform())*np.exp(x/900) S.append(y + rng.normal(0, 0.02, 500)); labels.append(1) S, labels = np.array(S), np.array(labels) S_c = np.array([s - als(s) for s in S]) # 扣荧光 S_n = S_c/np.linalg.norm(S_c, axis=1, keepdims=True) # 单位向量 ref = drug_raman(); ref = ref/np.linalg.norm(ref) # 正品参考谱 sim = S_n @ ref # 夹角余弦

阈值不拍脑袋,从正品分数分布导出——正品均值减三倍标准差,含义是"正品几乎不可能掉到这条线以下":

# 阈值从正品分布导出,然后出混淆矩阵 thr = sim[labels == 0].mean() - 3*sim[labels == 0].std() print(f"threshold = {thr:.4f}") pred = (sim < thr).astype(int) tp = int(((pred==1)&(labels==1)).sum()); fp = int(((pred==1)&(labels==0)).sum()) fn = int(((pred==0)&(labels==1)).sum()); tn = int(((pred==0)&(labels==0)).sum()) print(f"genuine sim range=[{sim[labels==0].min():.4f},{sim[labels==0].max():.4f}]") print(f"fake sim range=[{sim[labels==1].min():.4f},{sim[labels==1].max():.4f}]") print(f"TP={tp} FP={fp} FN={fn} TN={tn}") print(f"sensitivity={tp/(tp+fn):.3f} specificity={tn/(tn+fp):.3f}") # 对照组:不扣荧光直接比 S_raw = S/np.linalg.norm(S, axis=1, keepdims=True) sim_raw = S_raw @ ref pred_raw = (sim_raw < thr).astype(int) tp2 = int(((pred_raw==1)&(labels==1)).sum()); fp2 = int(((pred_raw==1)&(labels==0)).sum()) tn2 = int(((pred_raw==0)&(labels==0)).sum()) print(f"不扣荧光 genuine=[{sim_raw[labels==0].min():.3f},{sim_raw[labels==0].max():.3f}]" f" fake=[{sim_raw[labels==1].min():.3f},{sim_raw[labels==1].max():.3f}]") print(f"同一阈值下 TP={tp2} FP={fp2} TN={tn2}")

输出:

threshold = 0.8861 genuine sim range=[0.9010,0.9471] fake sim range=[0.4881,0.5925] TP=15 FP=0 FN=0 TN=20 sensitivity=1.000 specificity=1.000 不扣荧光 genuine=[0.335,0.355] fake=[0.302,0.309] 同一阈值下 TP=15 FP=20 TN=0

三、结果与解读

两组数字摆在一起,是整备工序价值最赤裸的展示。扣荧光之后:正品分数区间 0.901 到 0.947,假药 0.488 到 0.593——两区间中间隔着一条 0.3 宽的无人区,阈值 0.8861 落在无人区上缘,三十五个样本全部判对,灵敏度特异性双满分。不扣荧光:所有分数被荧光背景拖进 0.30 到 0.36 的窄缝里,正品与假药的间隔只剩 0.026——同一个阈值下,二十片正品全部被误判为假药(FP 等于 20)。

解读的分寸感在两处。其一,假药分数低(0.49 对正品 0.92)主要来自活性成分减半带来的峰高结构变化,替代成分的 1580 峰只是补充证据——如果假药只换辅料不动活性成分,相似度落差会小得多,那时要靠 4.1 节的解卷积去拆辅料带。其二,灵敏度与特异性满分的可信度要打个现实折扣:模拟数据的变异维度有限,真实查获品还有批间、产地、储藏变性的干扰,上线前要用留出的独立查获批次复核——这正是 3.4 节"RMSEP 一锤定音"的用武之地。

阈值方法论值得多看一眼。0.8861 不是经验数,是"正品均值减三倍标准差"——正态假设下正品掉到线以下的概率约千分点三。阈值的本质是把错误率定价:线画高,假药漏网多(灵敏度降);线画低,正品被冤枉多(特异性降)。药品稽查里冤枉正品的代价(企业损失、执法公信)与放走假药的代价(公众健康)如何权衡,是委托方要签字的决策,鉴定所的职责是把两条曲线摊开给他看。

四、变式:换场景的三种走法

换剂型:胶囊的彩色囊壳会带强荧光与色素峰,先对空壳单独采谱做差谱,或换长波激发(785 纳米换 1064 纳米,荧光大幅减弱但拉曼信号也降,要重新算信噪比账)。换鉴定对象:原料药的真伪(不是制剂)峰更干净,通常不需要 ALS 这么重的工序,SNV 加相似度就够。模型升级:查获品类型多起来后,相似度阈值法升级为分类模型(PLS-DA 或随机森林),让它同时学习多种造假模式——但训练集要持续收录新造假类型,假药的"分布"是活的,模型半年不更新就开始过时。

💡 关键直觉:谱库比对鉴定里,阈值两侧的错误各有名字——放走假药叫漏检,冤枉正品叫误控。数字上对称,代价上从来不对称;先问委托方哪种错更痛,再画阈值线。

本节要点回顾

  • 拉曼透过包装直接测的前提是水与聚合物都是弱散射体,选型逻辑回到 1.2 节;
  • 荧光是拉曼第一敌人:不扣背景时真假分数挤在 0.03 的窄缝里,同一阈值全部误判;
  • ALS 扣荧光后无人区宽 0.3,阈值落在线缘,双满分——整备决定成败;
  • 阈值从正品分布导出(均值减三倍标准差),本质是给错误率定价;
  • 假药的分布是活的,分类模型要随查获批次持续更新。

第三个案例把视野从"一条谱"扩到"一叠图像":四十亩麦田的病虫害分布图,光谱分析升维到光谱成像。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U