MATLAB中genfis1生成未训练FIS输出全0的原因及训练差异问询
问题分析与解答
核心问题
测试MATLAB中genfis1生成的FIS时,发现未训练的FIS输出全为0,但训练后拟合效果良好。疑惑是代码问题还是MATLAB特性,同时想了解FIS训练前后的差异。
代码问题定位
你提供的代码里存在变量大小写不一致的关键错误:
- 生成数据时用的是
Data,但后续调用genfis1、提取输入输出时用的是data(MATLAB区分大小写),这会导致data未定义,MATLAB会默认使用异常值,最终引发输出全0的问题。 - 括号冗余不影响运行,但变量名错误是核心诱因。
修正后的代码:
% 生成训练数据 Data = [rand(100, 1) 10 * rand(100, 1) - 5 rand(100, 1)]; % 设置隶属函数数量与类型 numMFs = [3 5]; mfType = 'gbellmf'; % 生成模糊推理系统(统一变量名) fismat = genfis1(Data, numMFs, mfType); % 提取输入数据与实际输出(统一变量名) inputs = Data(:, 1:2); actualOutput = Data(:, 3); % 计算模糊输出 fisOutput = evalfis(inputs, fismat); % 绘制模糊输出与实际输出对比图 scatter3(inputs(:, 1), inputs(:, 2), actualOutput, 'filled', 'MarkerFaceColor', 'b'); hold on; scatter3(inputs(:, 1), inputs(:, 2), fisOutput, 'filled', 'MarkerFaceColor', 'r'); xlabel('Input 1'); ylabel('Input 2'); zlabel('Output'); legend('Actual Output', 'Fuzzy System Output');
训练前后FIS的差异
未训练的FIS(genfis1生成)
genfis1会根据输入数据分布自动生成隶属函数的初始参数,但输出层的初始规则结论参数默认设为0,这是MATLAB的设计特性——初始状态下未学习到输入输出的映射关系,所以输出会偏向0。但代码正确时,不会全为0,而是基于初始隶属函数的模糊推理结果,只是拟合精度极低。- 结构上:已具备完整的模糊规则框架(输入隶属函数、规则数量、输出结构),但所有参数未经过优化。
训练后的FIS(ANFIS训练)
- ANFIS通过反向传播+最小二乘法的混合算法,优化两类核心参数:
- 输入隶属函数的形状参数(如钟形函数的中心、宽度等),让隶属函数更贴合数据分布;
- 输出层的规则结论参数,建立输入到输出的精准映射关系。
- 最终输出会紧密贴合训练数据的实际值,拟合精度大幅提升。
总结
你遇到的输出全0是代码变量名错误导致的,而非MATLAB特性。修正变量名后,未训练的FIS会输出基于初始隶属函数的推理结果(不会全0),只是精度远低于训练后的FIS。
内容的提问来源于stack exchange,提问作者Lixiang
相关产品推荐
相关产品推荐

