调用ANFIS库plotMF函数时出现“仅整数标量数组可转为标量索引”错误原因?
解决ANFIS plotMF函数调用的TypeError问题
我来帮你分析这个问题,你遇到的TypeError完全是因为调用plotMF时参数传错了,咱们一步步理清楚:
错误原因
先看你调用的代码:
anf.plotMF(mf, X)
而plotMF函数的定义是def plotMF(self, x, inputVar),两个参数的要求是:
x:要绘制隶属度函数的单个输入变量的取值序列(比如一个一维数组,代表该变量的取值范围)inputVar:要绘制的输入变量的索引(整数)(比如你用的iris数据集有4个输入特征,索引是0、1、2、3)
你把mf(隶属度函数定义)传给了x参数,把X(整个二维数据集)传给了inputVar参数,这就导致函数内部执行self.memFuncs[inputVar]时,inputVar是一个二维数组,不是整数索引,直接触发了only integer scalar arrays can be converted to a scalar index的错误。
正确的调用方式
举个例子,如果你想绘制第0个输入特征(iris数据集的花萼长度)的隶属度函数,你需要:
- 生成该特征的连续取值序列(覆盖数据中的最小值到最大值)
- 传入对应的特征索引
修正后的代码如下:
# 生成第0个输入特征的取值序列,从最小值到最大值取100个点 x_vals = numpy.linspace(X[:, 0].min(), X[:, 0].max(), 100) # 调用plotMF,传入取值序列和特征索引0 anf.plotMF(x_vals, 0)
如果要绘制其他特征的隶属度函数,只需要把索引换成1、2或3,同时更新x_vals对应的特征列即可,比如绘制第1个特征:
x_vals = numpy.linspace(X[:, 1].min(), X[:, 1].max(), 100) anf.plotMF(x_vals, 1)
补充说明
- 函数内部已经通过
self.memFuncs获取了训练好的隶属度函数参数,所以不需要你再传入mf这个定义了 x参数必须是一维数组,用来绘制隶属度函数的横轴取值,用linspace生成连续值会让曲线更平滑
内容的提问来源于stack exchange,提问作者Eli Hektor
相关产品推荐
相关产品推荐

