利用模糊逻辑设计人工胰腺控制器
这个例子展示了如何设计和优化一个模糊推理系统(FIS)树来控制人工胰腺。人工胰腺通过皮下注射胰岛素来调节1型糖尿病患者的血糖水平。
FIS树是具有多个FIS的整体FIS的分布式、分层表示,每个FIS具有较小的规则库。因此,与整体FIS相比,FIS树更容易理解推理过程,并允许使用更少的可调参数进行更快的性能优化。
视频介绍
要获得示例的可视化演练,请观看视频。
背景
1型糖尿病是一种广泛存在的健康问题,当胰腺无法产生足够的胰岛素来调节血糖水平时,就会发生这种疾病。不受控制的高血糖水平(高血糖)会对人体造成重大损害。因此,通过适当的皮下胰岛素输注来持续监测和调节血糖水平的人工胰腺系统是医疗保健设备开发的主要目标。
下图改编自[1],展示了人工胰腺系统的组成部分。
连续葡萄糖监测(CGM)系统定期测量糖尿病患者的血糖水平,并将此信息传递给控制器。控制器驱动胰岛素泵,胰岛素泵向患者注射最佳剂量的胰岛素,从而调节血糖水平。控制器提供以下两种胰岛素剂量。
基础剂量-糖尿病患者禁食期间长期服用少量胰岛素
大剂量-摄取一顿主食所需的短期大量胰岛素
因此,控制器的任务是为以下情况生成校正胰岛素剂量。
高血糖-当血糖水平高时,控制器以丸剂模式提供高胰岛素剂量。一般来说,该剂量在125至200毫克/分升之间,根据患者的禁食和用餐情况而有所不同。
低血糖——当血糖水平较低,一般低于50-70 mg/dL时,控制器停止提供胰岛素。
正常情况下-正常情况下,血糖水平一般在80 ~ 100mg /dL范围内,控制器在基础模式下提供低胰岛素剂量。
人工胰腺模型
的artificialPancreasWithFISTreeControl
万博1manbetxSimulink®模型实现了人工胰腺系统。
模型=“artificialPancreasWithFISTreeControl”;load_system(模型)
该模型包含以下子系统。
糖尿病患者-在[2]和[3]中描述的1型糖尿病患者体内胰岛素动力学模型及其对葡萄糖的影响。
膳食-从膳食中产生葡萄糖吸收。在这个例子中,进餐安排在一天的第1、5和12个小时。
血糖监测系统-每5分钟使用一个完美的传感器提供无噪声的血糖水平样本。
控制器-使用分级FIS树生成正确的胰岛素剂量。
胰岛素泵-使用理想的泵模型注入FIS控制器推荐的确切数量的胰岛素。
为了观察糖尿病患者在没有校正胰岛素输注的情况下,身体吸收葡萄糖时血糖水平的变化情况,模拟恒定零控制动作的模型。为此,通过设置打开控制循环closeLoop
来0
.
closeLoop = 0;openLoopOutput = sim(model);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 = fistree([fis1 fis2],连接);图plotfis (fisTInit)
初始模糊系统是用默认模糊规则构建的,这些规则没有被调整以产生最佳胰岛素剂量。
调优控制器规则
一旦有了FIS树结构,就可以通过调优组件FIS对象的规则和MF参数来优化控制器行为。为此,您可以使用tunefis
函数。
一般来说,均匀分布的mf为模糊系统的优化提供了一个有意义的初始条件。因此,作为初始调优步骤,您可以学习FIS对象的规则,同时保留它们的默认MF参数。
为了学习规则,首先从模糊系统中获得可调的设置。
[in,out,rule] = gettunthesettings (fisTInit);
接下来,更新规则设置,只优化规则结果。通过这样做,您可以保留现有的规则前项,其中已经包含了对应FIS输入的所有可能的输入MF组合。
为rId = 1:数值(规则)规则(rId).先行项。Free = false;结束
为调优过程创建一个选项集。
options = tunefisOptions;
使用默认的遗传算法调优方法进行规则学习。将最大代数设置为3,并使用100的种群大小。
options.MethodOptions.MaxGenerations = 3;options.MethodOptions.PopulationSize = 100;
接下来,创建一个代价函数来评估每个候选规则库。在优化过程的最后,为FIS树中的模糊系统选择代价最小的规则库。
对于本例,代价函数(costFcn.m
)模拟artificialPancreasWithFISTreeControl
使用候选规则库建模。使用产生的模拟输出,成本函数使用以下步骤计算成本。
从标称葡萄糖水平计算观察到的葡萄糖水平的误差。
如果误差值为负(葡萄糖低于标称水平),则将误差值设置为高值。
计算成本为误差值的均方根。
使用这个代价函数,调优过程选择能够保持正常状态并避免高葡萄糖水平的规则库。此外,第2步中使用的高错误值有助于丢弃产生低血糖水平的规则库。
指定标称和最低血糖水平。refLevel = 90;minLevel = 80;从标称值计算误差。err = glucose - 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(model);
绘制结果调节血糖水平和胰岛素输注速率。
plotGlucoseAndInsulin (ruleTunedOutput...“血糖和胰岛素剂量与学习规则基础”)
根据调整后的规则,葡萄糖水平现在保持在160 mg/dL以下,在第三餐后接近90 mg/dL。控制器在每餐时间产生短期高胰岛素剂量(丸剂模式),在禁食期间产生长期低胰岛素剂量(基础模式)。
分析和修改规则库
为了可视化调优规则库的行为,在FIS树中绘制每个模糊系统的控制面。
图(“位置”,[300 300 600 300]);subplot(1,2,1) gensurf(fistruletune . fis (1))控制面- fis1) subplot(1,2,2) gensurf(fistruletune . fis (2))控制面- 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: H 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 =>预计算_dose =M";fisTRuleUpdate.FIS (1) .Rules(3)。描述=..."BG_Level==H & BG_Rate==N =>预计算_dose =H";fisTRuleUpdate.FIS (1) .Rules(9)。描述=..."BG_Level==H & BG_Rate==P => Precalculated_Dose=VH";更新fis2规则。fisTRuleUpdate.FIS (2) .Rules(1)。描述=..."预计算剂量==L & BG_Accel==N =>胰岛素剂量=VL";fisTRuleUpdate.FIS (2) .Rules(3)。描述=..."预计算剂量==H & BG_Accel==N =>胰岛素剂量=M";fisTRuleUpdate.FIS (2) .Rules(6)。描述=..."预计算剂量==H & BG_Accel==Z =>胰岛素剂量=M";fisTRuleUpdate.FIS (2) .Rules(7)。描述=..."预计算剂量==L & BG_Accel==P =>胰岛素剂量=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: 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: VL Insulin_Dose: L Precalculated_Dose: H Insulin_Dose: M Insulin_Dose: M Insulin_Dose: M Insulin_Dose: VH
可视化产生的FIS控制面。
图(“位置”,[300 300 600 300]);subplot(1,2,1) gensurf(fisTRuleUpdate.FIS(1))控制面- fis1gensurf(fisTRuleUpdate.FIS(2))控制面- fis2)
控制面对应于更直观的控制器行为。
为了检查更新后的规则是否提高了控制器的性能,可以模拟模型并绘制结果。将结果与调优MF参数控制器的结果进行比较。
拳头= fisTRuleUpdate;ruleUpdatedOutput = sim(model);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 = 1:4 in(i). membershipfunctions(1).参数。免费= [0 0 1];(我).MembershipFunctions .Parameters(结束)。免费= [1 0 0];结束
类似地,为输出变量配置可调设置。每个输出变量有五个三角隶属函数。
为i = 1:2 out(i). membershipfunctions(1).参数。免费= [0 0 1];(我).MembershipFunctions .Parameters(结束)。免费= [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(fismftuned,model,minLevel,refLevel,wsVars)结束
minCost = 22.0627
MF调优过程进一步降低了代价函数的值。
使用调优MF参数的控制器对模型进行仿真。
拳头=拳头;mfTunedOutput = sim(model);
绘制结果调节血糖水平和胰岛素输注速率。将结果与具有调优规则基的控制器的结果进行比较。
plotGlucoseAndInsulin ([ruleUpdatedOutput mfTunedOutput),...“调节mf的血糖和胰岛素剂量”,...{“更新规则”,“调MFs”})
调优后的MF参数提高了性能,降低了最小成本值。
为了进一步提高控制器性能,您可以执行以下修改。
逐步向FIS树控制器添加额外的输入,如患者的体重和年龄,以提供个性化的胰岛素剂量。
使用不同数量的mf来平衡性能和推理复杂性。
采用不同的优化方法和迭代次数对模糊系统参数进行优化。
使用真实世界的训练数据来调整控制器参数。
关闭模型。close_system(模型)
参考文献
格兰特,保罗。糖尿病控制的新方法:模糊逻辑与胰岛素泵技术医学工程与物理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.
毛思、理查德、王友庆、埃亚尔·达索、罗伯特·基尔彻、唐纳德·马西森、霍华德·齐瑟、露易丝·约万诺维奇和弗朗西斯·j·道尔。利用个性化因子调节人工胰腺模糊控制器的临床应用糖尿病科学与技术杂志4,没有。4 (July 2010): 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);参数=范围(1)+...diff(范围)* fis.Inputs (id) .MembershipFunctions (mfId) .Parameters;fis.Inputs (id) .MembershipFunctions (mfId)。参数=参数;结束结束函数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);参数=范围(1)+...rangeDiff * fis.Outputs (id) .MembershipFunctions (mfId) .Parameters;fis.Outputs (id) .MembershipFunctions (mfId)。参数=参数;结束扩展输出范围值以适应输出mf。left = fis.Outputs(id).MembershipFunctions(1).Parameters(1);right = fis.Outputs(id).MembershipFunctions(end).Parameters(end);fis.Outputs (id)。范围=[左右];结束
另请参阅
tunefis
|getTunableSettings
|fistree