用模糊逻辑设计人工胰腺控制器
这个例子展示了如何设计和优化一个模糊推理系统(FIS)树来控制人工胰腺。人工胰腺通过皮下注射胰岛素来调节1型糖尿病患者的血糖水平。
FIS树是具有多个FIS的单片FIS的分布式、分层表示,每个FIS具有更小的规则库。因此,与单一FIS相比,FIS树提供了更容易理解推理过程的方法,并允许使用更少的可调参数进行更快的性能优化。
1型糖尿病是一种广泛存在的健康问题,当胰腺不能产生足够的胰岛素来调节血糖水平时就会发生。不受控制的高血糖水平(高血糖)会对人体造成严重损害。因此,通过适当的皮下胰岛素输注,持续监测和调节血糖水平的人工胰腺系统是医疗器械开发的主要目标。
下图改编自[1],显示了人工胰腺系统的组成部分。
连续血糖监测(CGM)系统定期测量糖尿病患者的血糖水平,并将这一信息传递给控制器。控制器驱动胰岛素泵,向患者注射最佳剂量的胰岛素,从而调节血糖水平。控制器提供以下两种胰岛素剂量。
基础剂量-糖尿病患者空腹时长期服用少量胰岛素
丸剂剂量-短期大量胰岛素吸收的必要一餐
因此,控制者的任务是为以下情况生成校正胰岛素剂量。
高血糖-当血糖水平高时,控制器提供高剂量的胰岛素丸模式。一般来说,这个剂量在125到200毫克/分升之间,根据患者的禁食和用餐情况而变化。
低血糖——当血糖水平较低,一般低于50 - 70mg /dL时,控制者停止提供胰岛素。
正常状态-正常状态下,血糖水平一般在80 ~ 100mg /dL之间,控制器在基础模式下提供较低的胰岛素剂量。
人工胰腺模型
的artificialPancreasWithFISTreeControl
金宝appSimulink®模型实现了人工胰腺系统。
模型=“artificialPancreasWithFISTreeControl”;load_system(模型)
该模型包含以下子系统。
糖尿病患者-模拟胰岛素动力学及其对人体中1型糖尿病血糖的影响,如[2]和[3]所述。
膳食-从膳食中产生葡萄糖吸收。在这个例子中,用餐安排在一天的第1、5和12个小时。
葡萄糖监测系统-使用完美的传感器每5分钟提供无噪声血糖水平样本。
控制器-使用分级FIS树生成校正胰岛素剂量。
胰岛素泵-使用理想的泵模型,注射FIS控制器推荐的精确量的胰岛素。
为了观察糖尿病患者在没有校正胰岛素输注的情况下,人体吸收葡萄糖时血糖水平的变化,模拟恒定零控制动作的模型。为此,通过设置打开控制循环closeLoop
来0
.
closeLoop = 0;openLoopOutput = sim(模型);plotAbsorbedAndBloodGlucose (openLoopOutput)
如果没有正确的胰岛素输注,患者的血糖水平会升高并保持在高血糖状态。
关闭控制回路进行调优和模拟。
closeLoop = 1;
创建FIS树形控制器结构
控制器有以下输入,如[4]所述。
血糖水平(mg/dL)
血糖水平变化率(mg/dL/min)
血糖水平加速率(mg/dL/min/min)。
控制器的输出是将糖尿病患者的血糖水平维持在正常水平的最佳胰岛素输注剂量。
为了根据观察到的输入产生最佳胰岛素剂量,[4]中描述的模糊控制器使用专家知识构建了一个具有75条规则的单一FIS。然而,使用专家知识创建大型规则库是一个复杂的过程,因为需要为输入隶属函数(mf)的所有组合手工构建每个模糊规则。
或者,使用FIS树生成具有多个FIS的系统,每个FIS具有较小的规则库。FIS树的层次结构和较小的规则库允许更直观地理解推理过程。
本例使用增量设计方法,使用增量树结构中的两个Mamdani FIS对象组合控制器输入。有关模糊树结构的更多信息,请参见模糊树.
与加速度相比,血糖水平及其变化率对控制动作的贡献更大,而加速度通常很小,会在输出中产生噪声。因此,在FIS树的第一级,您可以预先计算胰岛素输注率Precalculated_Dose
结合血糖水平的影响BG_Level
和它的变化率BG_Rate
.加速度BG_Accel
包含在FIS树的第二层。
创建FIS (fis1
)为树形结构的第一层。的输入fis1
每个都使用三个均匀分布的三角形mf。的输出fis1
使用五种这样的mf,命名如下:
对于输入
BG_Level
,l
,米
,H
分别适用于低、中、高水平对于输入
BG_Rate
,N
,Z
,P
分别为负、零和正对于输出
Precalculated_Dose
,l
,米
,H
,再加上六世
对于非常低的和VH
对于非常高的剂量
指定最大剂量水平。maxDose = 2;为输入变量定义成员函数名。mfNames1 = [“L”,“M”,“H”];低,中,高mfNames2 = [“N”,“Z”,“P”];%负,零,正创建第一个FIS。Fis1 = mamfis(“名字”,“fis1”,“NumInputs”2,“NumOutputs”, 1...“NumInputMFs”3,“NumOutputMFs”5);配置输入和输出变量。fis1 = updateInput(fis1,1,“BG_Level”120年[80],mfNames1);fis1 = updateInput(fis1,2,“BG_Rate”(-0.5 - 0.5), mfNames2);fis1 = updateOutput(fis1,1,“Precalculated_Dose”[0 maxDose]);图plotfis (fis1)
创建FIS (fis2
)为树的第二层。使用fis2
,通过结合第一层预先计算的剂量和血糖加速率的影响,生成最终的胰岛素剂量。在这种情况下,输入和输出也分别使用三个和五个均匀分布的三角形mf。
创建第二个FIS。Fis2 = mamfis(“名字”,“fis2”,“NumInputs”2,“NumOutputs”, 1...“NumInputMFs”3,“NumOutputMFs”5);配置输入和输出变量。fis2 = updateInput(fis2,1,“Precalculated_Dose”[0 maxDose], mfNames1);fis2 = updateInput(fis2,2,“BG_Accel”(-0.005 - 0.005), mfNames2);fis2 = updateOutput(fis2,1,“Insulin_Dose”[0 maxDose]);图plotfis (fis2)
结合fis1
而且fis2
变成FIS树形结构。
Connection = [fis1.]名称+“/”+ fis1.Outputs (1) . name...fis2。Name +“/”+ fis2.Inputs (1) . name];fisTInit = firee ([fis1 fis2],连接);图plotfis (fisTInit)
初始模糊系统是由默认的模糊规则构造的,这些规则没有调整以产生最佳的胰岛素剂量。
调谐控制器规则
一旦有了FIS树结构,就可以通过调优组件FIS对象的规则和MF参数来优化控制器行为。要做到这一点,可以使用tunefis
函数。
一般来说,均匀分布mf为优化模糊系统提供了一个有意义的初始条件。因此,作为初始调优步骤,您可以学习FIS对象的规则,同时保持它们的默认MF参数。
为了学习规则,首先从模糊系统中得到可调的设置。
[in,out,rule] = gettablesettings (fisTInit);
接下来,更新规则设置,只优化规则结果。通过这样做,您保留了现有的规则先行项,其中已经包含了对应FIS输入的所有可能的输入MF组合。
为id = 1:numel(rule) rule(rId).先行词。自由=假;结束
为调优过程创建一个选项集。
options = tunefisOptions;
使用默认的遗传算法调优方法学习规则。将最大代数设置为3,并使用100的总体大小。
options.MethodOptions.MaxGenerations = 3;options.MethodOptions.PopulationSize = 100;
接下来,创建一个成本函数来评估每个候选规则库。在优化过程的最后,为模糊系统选择代价最小的规则库。
对于本例,代价函数(costFcn.m
)模拟artificialPancreasWithFISTreeControl
使用候选规则库建模。使用得到的模拟输出,成本函数使用以下步骤计算成本。
从名义葡萄糖水平计算观察到的葡萄糖水平的误差。
如果误差值为负值(葡萄糖低于标称水平),则将误差值设置为高值。
计算成本作为误差值的均方根。
利用这个代价函数,调优过程选择维持正常状态并避免高血糖水平的规则库。另外,第2步中使用的高误差值有助于丢弃产生低血糖水平的规则库。
指定名义血糖和最低血糖水平。refLevel = 90;minLevel = 80;%从标称值计算误差。err =葡萄糖- refLevel;为低于标称水平的葡萄糖水平指定高误差值。err(葡萄糖
调优是一个耗时的过程,因此对于本例,加载一个预调优的FIS树。要自行调优FIS树,请设置runtunefis
来真正的
.
Runtunefis = false;加载预调优的FIS树数据数据=负载(“fuzzyPancreasExampleData.mat”);minData = MinCostData;wsVars = [“拳头”“closeLoop”];minLevel = 80;refLevel = 90;如果runtunefis rng (“默认”fisTRuleTuned = tunefis(fisTInit,rule,...@ (fis) costFcn (fis、模型minLevel、refLevel wsVars, minData),选择);其他的fisTRuleTuned = data.fisTRuleTuned;minCost = costFcn(fisTRuleTuned,model,minLevel,refLevel,wsVars)结束
minCost = 26.3335
使用带有调优规则库的FIS树模拟模型。
拳头= fisTRuleTuned;ruleTunedOutput = sim(模型);
绘制出调节后的血糖水平和胰岛素输注速率。
plotGlucoseAndInsulin (ruleTunedOutput...“基于学习规则库的血糖和胰岛素剂量”)
在调整了规则库后,葡萄糖水平现在保持在160毫克/分升以下,在第三顿饭后稳定在接近90毫克/分升。该控制器在每次进餐时产生短期的高胰岛素剂量(bolus模式),在禁食期间产生长期的低胰岛素剂量(基础模式)。
分析和修改规则库
为了可视化调整规则库的行为,在FIS树中绘制每个模糊系统的控制面。
图(“位置”,[300 300 600 300]);subplot(1,2,1) gensurf(fistruletuning . fis (1)) title('控制面- fis1') subplot(1,2,2) gensurf(fistruletuning . fis (2)) title('控制面- fis2')
的对应规则库fis1
而且fis2
.
showRuleBase (fisTRuleTuned.FIS (1))
fis1规则库:BG_Rate: N BG_Rate: Z BG_Rate: P ______________________ _____________________ ______________________ BG_Level: L Precalculated_Dose: VH Precalculated_Dose: M Precalculated_Dose: M BG_Level: M Precalculated_Dose: VL Precalculated_Dose: M Precalculated_Dose: H BG_Level: H Precalculated_Dose: M Precalculated_Dose: VL
showRuleBase (fisTRuleTuned.FIS (2))
fis2规则库:BG_Accel: N BG_Accel: Z BG_Accel: P ________________ ________________ ________________ Precalculated_Dose: L Insulin_Dose: VH Insulin_Dose: VL Insulin_Dose: H Precalculated_Dose: M Insulin_Dose: VL Insulin_Dose: L Precalculated_Dose: H Insulin_Dose: L Insulin_Dose: VL Insulin_Dose: VH
这些表显示了一些控制操作是非直观的。例如:
对于负的血糖变化率,
fis1
胰岛素剂量不随血糖水平的增加而单调增加。对于高血糖水平和高正血糖变化率的患者,
fis1
将胰岛素剂量设置为中等剂量而不是很高。对于负血糖加速率,
fis2
不会随着预估胰岛素剂量的增加而单调增加胰岛素剂量。对于低预估剂量和负血糖加速率,
fis2
将胰岛素剂量设为很高而不是很低。对于高预估剂量和零血糖加速率,
fis2
将胰岛素剂量设为极低而不是中等剂量。
通过修改规则的结果值来更新规则。
更新fis1规则。fisTRuleUpdate = fisTRuleTuned;fisTRuleUpdate.FIS (1) .Rules(1)。描述=...BG_Level==L & BG_Rate==N => Precalculated_Dose=VL;.Rules fisTRuleUpdate.FIS(1)(2)。描述=...BG_Level==M & BG_Rate==N => Precalculated_Dose=M";fisTRuleUpdate.FIS (1) .Rules(3)。描述=...BG_Level==H & BG_Rate==N => Precalculated_Dose=H";fisTRuleUpdate.FIS (1) .Rules(9)。描述=...BG_Level==H & BG_Rate==P => Precalculated_Dose=VH";更新fis2规则。fisTRuleUpdate.FIS (2) .Rules(1)。描述=..."Precalculated_Dose==L & BG_Accel==N => Insulin_Dose=VL";fisTRuleUpdate.FIS (2) .Rules(3)。描述=..."Precalculated_Dose==H & BG_Accel==N => Insulin_Dose=M";fisTRuleUpdate.FIS (2) .Rules(6)。描述=..."Precalculated_Dose==H & BG_Accel==Z => Insulin_Dose=M";fisTRuleUpdate.FIS (2) .Rules(7)。描述=..."Precalculated_Dose==L & BG_Accel==P => Insulin_Dose=L";
查看修改后的规则库。
showRuleBase (fisTRuleUpdate.FIS (1))
fis1规则库:BG_Rate: N BG_Rate: Z BG_Rate: P ______________________ _____________________ ______________________ BG_Level: L Precalculated_Dose: VL Precalculated_Dose: M Precalculated_Dose: M BG_Level: M Precalculated_Dose: M Precalculated_Dose: H BG_Level: H Precalculated_Dose: H Precalculated_Dose: VH
showRuleBase (fisTRuleUpdate.FIS (2))
fis2规则库:BG_Accel: N BG_Accel: Z BG_Accel: P ________________ ________________ ________________ Precalculated_Dose: L Insulin_Dose: VL Insulin_Dose: L Precalculated_Dose: M Insulin_Dose: VL Insulin_Dose: L Precalculated_Dose: H Insulin_Dose: M Insulin_Dose: M Insulin_Dose: VH
可视化结果的FIS控制面。
图(“位置”,[300 300 600 300]);subplot(1,2,1) gensurf(fisTRuleUpdate.FIS(1)) title('控制面- fis1') subplot(1,2,2) gensurf(fisTRuleUpdate.FIS(2))'控制面- fis2')
控制面对应于更直观的控制器行为。
为了检查更新的规则是否改善了控制器的性能,可以模拟模型并绘制结果。将结果与调优MF参数的控制器的结果进行比较。
拳头= fisTRuleUpdate;ruleUpdatedOutput = sim(模型);plotGlucoseAndInsulin ([ruleTunedOutput ruleUpdatedOutput),...“血糖和胰岛素剂量与更新的规则库”,...{“学习规则”,“更新规则”})
与调整后的FIS树控制器相比,更新规则的控制器降低了血糖水平。
更新规则降低了代价函数的值。
minCost = costFcn(fisTRuleUpdate,model,minLevel,refLevel,wsVars)
minCost = 23.2702
优化成员函数参数
为了进一步提高控制器性能,可以调优FIS树的MF参数。
为此,可以使用局部优化方法,例如模式搜索。对于本例,将优化迭代的最大次数设置为10。
选项。方法=“patternsearch”;options.MethodOptions.MaxIterations = 10;
默认情况下,每个输入变量有三个均匀分布的三角形mf。例如,查看第一个输入的mffis1
.
图plotmf (fisTRuleUpdate.FIS (1),“输入”, 1)
为输入变量配置可调设置,使最左和最右的峰值在调优期间保持不变。
为i = (i). membershipfunctions(1).参数。Free = [0 0 1];(我).MembershipFunctions .Parameters(结束)。Free = [1 0 0];结束
类似地,为输出变量配置可调设置。每个输出变量有五个三角形隶属函数。
为i = 1:2 out(i). membershipfunctions(1).参数。Free = [0 0 1];(我).MembershipFunctions .Parameters(结束)。Free = [1 0 0];结束
使用更新的可调设置调优MF参数值。
如果runtunefis figure reset(minData) rng(“默认”) fisTRuleUpdate (fisTRuleUpdate,[in;out],...@ (fis) costFcn (fis、模型minLevel、refLevel wsVars, minData),选择);其他的fisTMFTuned = data.fisTMFTuned;minCost = costFcn(fisTMFTuned,model,minLevel,refLevel,wsVars)结束
minCost = 22.0627
MF调优过程进一步降低了成本函数的值。
使用调优MF参数的控制器模拟模型。
拳头=拳头;mfTunedOutput = sim(模型);
绘制出调节后的血糖水平和胰岛素输注速率。将结果与具有调优规则库的控制器的结果进行比较。
plotGlucoseAndInsulin ([ruleUpdatedOutput mfTunedOutput),...“调节mf的血糖和胰岛素剂量”,...{“更新规则”,“调MFs”})
调优后的MF参数提高了性能,降低了最小代价值。
为了进一步提高控制器性能,可以执行以下修改。
逐步向FIS树控制器添加额外的输入,如患者的体重和年龄,以提供个性化的胰岛素剂量。
使用不同数量的mf来平衡性能和推理的复杂性。
采用不同的优化方法和迭代次数对模糊系统参数进行优化。
利用真实世界的训练数据调优控制器参数。
%关闭模型。close_system(模型)
参考文献
[1]格兰特,保罗。糖尿病控制的新途径:模糊逻辑与胰岛素泵技术。医学工程与物理29日,没有。7(2007年9月):824-27。https://doi.org/10.1016/j.medengphy.2006.08.014.
[2] Wilinska, m.e., L.J. Chassin, H.C. Schaller, L. Schaupp, T.R. Pieber和R. Hovorka。1型糖尿病中的胰岛素动力学:快速作用胰岛素的连续和丸剂输送。IEEE生物医学工程汇刊52岁的没有。1(2005年1月):3-12。https://doi.org/10.1109/TBME.2004.839639.
[3] Hovorka, Roman, Valentina Canonico, Ludovic J Chassin, Ulrich Haueter, Massimo massii - benedetti, Marco Orsini Federici, Thomas R Pieber,等。“1型糖尿病受试者血糖浓度的非线性模型预测控制。”生理测量25岁,没有。4(2004年8月1日):905-20。https://doi.org/10.1088/0967-3334/25/4/010.
[4]摩瑟斯,理查德,王友青,埃亚尔·达索,罗伯特·基尔切尔,唐纳德·马西森,霍华德·齐瑟,露易丝·约瓦诺维奇,弗朗西斯·j·道尔。拟用个性化因子调节人工胰腺模糊控制器的临床应用。糖尿病科学与技术杂志4,没有。4(2010年7月):913-22。https://doi.org/10.1177/193229681000400422.
辅助函数
函数fis = updateInput(fis,id,name,range,mfNames)用指定的参数值更新FIS输入。fis.Inputs (id)。Name = Name;fis.Inputs (id)。Range = Range;为mfId = 1:length(mfNames) fis.Inputs(id). membershipfunctions (mfId)。Name = mfNames(mfId);Params = range(1) +...diff(范围)* fis.Inputs (id) .MembershipFunctions (mfId) .Parameters;fis.Inputs (id) .MembershipFunctions (mfId)。参数= params;结束结束函数fis = updateOutput(fis,id,name,range)用指定的参数值更新FIS输出。rangeDiff = diff(range);fis.Outputs (id)。Name = Name;% MF名称-非常低,低,中,高,非常高mfNames = [...“重要的”,“L”,“M”,“H”,“VH”];为mfId = 1:length(mfNames) fis.Outputs(id). membershipfunctions (mfId)。Name = mfNames(mfId);Params = range(1) +...rangeDiff * fis.Outputs (id) .MembershipFunctions (mfId) .Parameters;fis.Outputs (id) .MembershipFunctions (mfId)。参数= params;结束扩展输出范围值以适应输出mf。left = fis.Outputs(id).MembershipFunctions(1).Parameters(1);right = fis.Outputs(id).MembershipFunctions(end).Parameters(end);fis.Outputs (id)。Range =[左右];结束
另请参阅
tunefis
|getTunableSettings
|fistree