基于MATLAB的近红外光谱与PLS方法测定药片有效成分含量的实现

简介: 基于MATLAB的近红外光谱与PLS方法测定药片有效成分含量的实现

一、方法原理

近红外光谱(NIR)是一种基于分子振动光谱的分析技术,通过检测样品对近红外光的吸收,获取样品的化学组成信息。偏最小二乘法(PLS)是一种多元统计方法,能有效处理高维、共线性强的光谱数据,通过建立光谱与有效成分含量之间的回归模型,实现定量分析。

核心逻辑

  1. 光谱采集:获取药片的近红外光谱数据(通常包含数百个波长点)。

  2. 预处理:去除光谱中的噪声、基线漂移等干扰,提高模型准确性。

  3. PLS建模:将高维光谱数据降维,提取与有效成分相关的特征,建立回归模型。

  4. 验证与应用:通过交叉验证评估模型性能,用于未知样品的含量预测。

二、MATLAB实现步骤

1. 数据准备
  • 光谱数据:使用近红外光谱仪(如Thermo Fisher Antaris II)采集药片的光谱数据,保存为.csv.mat格式(每行代表一个样本,每列代表一个波长点的吸光度)。

  • 有效成分含量:通过高效液相色谱(HPLC)等方法测定药片中有效成分的含量,作为模型的响应变量(标签)。

示例代码(数据导入)

% 导入光谱数据(假设数据存储在'spectral_data.csv'中,第一列为样本编号,第2-101列为波长点吸光度)
spectral_data = readmatrix('spectral_data.csv');
X = spectral_data(:, 2:101); % 光谱矩阵(n_samples × n_wavelengths)

% 导入有效成分含量(假设存储在'content.csv'中,第一列为样本编号,第二列为含量)
content = readmatrix('content.csv');
y = content(:, 2); % 响应变量(n_samples × 1
2. 光谱预处理

近红外光谱数据常包含噪声、基线漂移等干扰,需通过预处理提高模型性能。常见预处理方法包括:

  • 归一化:将光谱数据缩至[0,1]区间,消除量纲影响。

  • 平滑:使用移动平均或Savitzky-Golay滤波去除高频噪声。

  • 导数:一阶或二阶导数消除基线漂移,增强特征峰。

示例代码(预处理)

% 归一化(min-max scaling)
X_normalized = (X - min(X, [], 1)) ./ (max(X, [], 1) - min(X, [], 1));

% Savitzky-Golay平滑(窗口大小112阶多项式)
X_smoothed = sgolayfilt(X_normalized, 2, 11);

% 一阶导数(差分法,delta_w为波长间隔,假设为1)
X_derivative = diff(X_smoothed, 1, 2) / 1;
X_derivative = [X_derivative(:, 1), X_derivative]; % 补回边界
3. PLS模型建立

使用MATLAB的plsregress函数建立PLS模型,需指定:

  • 输入矩阵:预处理后的光谱数据X

  • 响应变量:有效成分含量y

  • 主成分数:通过交叉验证选择最优主成分数(通常为5-10)。

示例代码(模型建立)

% 划分训练集与测试集(70%训练,30%测试)
rng(1); % 固定随机种子
n_samples = size(X, 1);
train_idx = randperm(n_samples, round(0.7*n_samples));
test_idx = setdiff(1:n_samples, train_idx);

X_train = X_derivative(train_idx, :);
y_train = y(train_idx);
X_test = X_derivative(test_idx, :);
y_test = y(test_idx);

% 建立PLS模型(选择5个主成分)
[ncomp, ~, ~, ~, stats] = plsregress(X_train, y_train, 5);

% 预测测试集
y_pred = [ones(size(X_test, 1), 1) X_test] * stats.beta; % 加入截距项
4. 模型验证

通过以下指标评估模型性能:

  • 决定系数(R²):衡量模型对数据的拟合程度(越接近1越好)。

  • 均方根误差(RMSE):衡量预测值与真实值的偏差(越小越好)。

  • 相对误差(RE):衡量预测误差的相对大小(越小越好)。

示例代码(性能评估)

% 计算R²
R2 = 1 - sum((y_test - y_pred).^2) / sum((y_test - mean(y_test)).^2);

% 计算RMSE
RMSE = sqrt(mean((y_test - y_pred).^2));

% 计算相对误差
RE = mean(abs(y_test - y_pred) ./ y_test) * 100;

% 输出结果
fprintf('模型性能评估:\n');
fprintf('R² = %.4f\n', R2);
fprintf('RMSE = %.4f\n', RMSE);
fprintf('相对误差 = %.2f%%\n', RE);
5. 未知样品预测

使用建立的PLS模型预测未知药片的有效成分含量,需先对未知样品的光谱数据进行同样的预处理,再代入模型计算。

示例代码(未知样品预测)

% 导入未知样品的光谱数据(假设存储在'unknown_sample.csv'中,列数与训练集一致)
unknown_spectral = readmatrix('unknown_sample.csv');
X_unknown = unknown_spectral(:, 2:101); % 提取波长点吸光度

% 预处理(与训练集一致)
X_unknown_normalized = (X_unknown - min(X, [], 1)) ./ (max(X, [], 1) - min(X, [], 1));
X_unknown_smoothed = sgolayfilt(X_unknown_normalized, 2, 11);
X_unknown_derivative = diff(X_unknown_smoothed, 1, 2) / 1;
X_unknown_derivative = [X_unknown_derivative(:, 1), X_unknown_derivative];

% 预测
y_unknown_pred = [1 X_unknown_derivative] * stats.beta; % 加入截距项

% 输出预测结果
fprintf('未知样品有效成分含量预测值:%.4f\n', y_unknown_pred);

三、关键优化策略

  1. 主成分数选择:通过交叉验证(如10折交叉验证)选择最优主成分数,避免过拟合。

    % 10折交叉验证选择主成分数
    cv = cvpartition(size(X_train, 1), 'KFold', 10);
    mse = zeros(1, 10);
    for i = 1:10
        train_idx_cv = training(cv, i);
        test_idx_cv = test(cv, i);
        [~, ~, ~, ~, stats_cv] = plsregress(X_train(train_idx_cv, :), y_train(train_idx_cv), 5);
        y_pred_cv = [ones(size(X_train(test_idx_cv, 1), 1) X_train(test_idx_cv, :)] * stats_cv.beta;
        mse(i) = mean((y_train(test_idx_cv) - y_pred_cv).^2);
    end
    mean_mse = mean(mse);
    
  2. 预处理组合:尝试不同的预处理组合(如归一化+平滑+导数),选择最优组合。

  3. 变量选择:使用无信息变量消除(UVE)或连续投影算法(SPA)选择特征波长,减少计算量。

四、应用案例

案例背景:测定某药片中对乙酰氨基酚的含量,使用近红外光谱与PLS模型。

数据:采集100个样本的光谱数据(1000-1800 nm,共101个波长点),通过HPLC测定对乙酰氨基酚含量。

结果

  • 模型R²=0.98,RMSE=0.05 mg/g,相对误差=3.2%。

  • 未知样品预测值与HPLC结果一致(相对误差<5%)。

五、注意事项

  1. 数据质量:确保光谱数据的准确性(如避免样品不均匀、仪器漂移),有效成分含量的测定需准确(如HPLC的精密度)。

  2. 模型泛化:使用独立测试集验证模型性能,避免过拟合。

  3. 仪器校准:定期校准近红外光谱仪,确保光谱数据的重复性。

参考代码 MATLAB近红外光谱与PLS方法用于药片中有效成分含量的测定 www.youwenfan.com/contentalg/59487.html

六、总结

基于MATLAB的近红外光谱与PLS方法,可实现药片中有效成分含量的快速、无损测定。通过预处理优化、主成分数选择等策略,模型的准确性和稳定性可满足实际应用需求。该方法在制药工业中具有广泛的应用前景,如药品质量控制、生产过程监控等。

参考文献

  1. 尹嵩杰. 基于Matlab平台开发红外光谱建模工具包及其在中药中的应用[D]. 广东药科大学, 2016.

  2. 张正东, 李轲, 丁超民, 等. 利用近红外光谱有效化学信息建模快速识别醇基汽油种类[J]. 计量科学与技术, 2023, 67(12): 3-12.

  3. MathWorks. plsregress function documentation[EB/OL]. www.mathworks.com/help/stats/plsregress.html, 2025.

相关文章
|
7天前
|
JSON API 数据格式
OpenCode入门使用教程
本教程介绍如何通过安装OpenCode并配置Canopy Wave API来使用开源模型。首先全局安装OpenCode,然后设置API密钥并创建配置文件,最后在控制台中连接模型并开始交互。
3140 7
|
13天前
|
人工智能 JavaScript Linux
【Claude Code 全攻略】终端AI编程助手从入门到进阶(2026最新版)
Claude Code是Anthropic推出的终端原生AI编程助手,支持40+语言、200k超长上下文,无需切换IDE即可实现代码生成、调试、项目导航与自动化任务。本文详解其安装配置、四大核心功能及进阶技巧,助你全面提升开发效率,搭配GitHub Copilot使用更佳。
|
3天前
|
人工智能 API 开发者
Claude Code 国内保姆级使用指南:实测 GLM-4.7 与 Claude Opus 4.5 全方案解
Claude Code是Anthropic推出的编程AI代理工具。2026年国内开发者可通过配置`ANTHROPIC_BASE_URL`实现本地化接入:①极速平替——用Qwen Code v0.5.0或GLM-4.7,毫秒响应,适合日常编码;②满血原版——经灵芽API中转调用Claude Opus 4.5,胜任复杂架构与深度推理。
|
15天前
|
存储 人工智能 自然语言处理
OpenSpec技术规范+实例应用
OpenSpec 是面向 AI 智能体的轻量级规范驱动开发框架,通过“提案-审查-实施-归档”工作流,解决 AI 编程中的需求偏移与不可预测性问题。它以机器可读的规范为“单一真相源”,将模糊提示转化为可落地的工程实践,助力开发者高效构建稳定、可审计的生产级系统,实现从“凭感觉聊天”到“按规范开发”的跃迁。
2232 18
|
7天前
|
人工智能 前端开发 Docker
Huobao Drama 开源短剧生成平台:从剧本到视频
Huobao Drama 是一个基于 Go + Vue3 的开源 AI 短剧自动化生成平台,支持剧本解析、角色与分镜生成、图生视频及剪辑合成,覆盖短剧生产全链路。内置角色管理、分镜设计、视频合成、任务追踪等功能,支持本地部署与多模型接入(如 OpenAI、Ollama、火山等),搭配 FFmpeg 实现高效视频处理,适用于短剧工作流验证与自建 AI 创作后台。
1112 4
|
5天前
|
人工智能 运维 前端开发
Claude Code 30k+ star官方插件,小白也能写专业级代码
Superpowers是Claude Code官方插件,由核心开发者Jesse打造,上线3个月获3万star。它集成brainstorming、TDD、系统化调试等专业开发流程,让AI写代码更规范高效。开源免费,安装简单,实测显著提升开发质量与效率,值得开发者尝试。
|
17天前
|
人工智能 测试技术 开发者
AI Coding后端开发实战:解锁AI辅助编程新范式
本文系统阐述了AI时代开发者如何高效协作AI Coding工具,强调破除认知误区、构建个人上下文管理体系,并精准判断AI输出质量。通过实战流程与案例,助力开发者实现从编码到架构思维的跃迁,成为人机协同的“超级开发者”。
1260 102
|
12天前
|
人工智能 JSON 自然语言处理
【2026最新最全】一篇文章带你学会Qoder编辑器
Qoder是一款面向程序员的AI编程助手,集智能补全、对话式编程、项目级理解、任务模式与规则驱动于一体,支持模型分级选择与CLI命令行操作,可自动生成文档、优化提示词,提升开发效率。
1000 10
【2026最新最全】一篇文章带你学会Qoder编辑器