我想评估特征选择技术粒子群优化与神经网络。但我一直有这样的错误: “布尔索引与维度1上的索引数组不匹配;维数为1,对应的布尔维数为19。 这是我的代码:
model = Sequential()
model.add(Dense(16, input_dim=19, activation= 'relu'))
model.add(Dense(12, activation= 'relu'))
model.add(Dense(2, activation= 'softmax'))
model.add(Flatten())
model.compile(loss='sparse_categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
def f_per_particle(m, alpha):
total_features = 19
if np.count_nonzero(m) == 0:
X_subset = x_train
else:
X_subset = x_train[:,m==1]
P=model.fit(X_subset, y_train, batch_size=64, epochs=100)
j = (alpha * (1.0 - P)+ (1.0 - alpha) * (1 - (X_subset.shape[1] / total_features)))
return j
def f(x, alpha=0.9):
n_particles = x.shape[0]
j = [f_per_particle(x[i], alpha) for i in range(n_particles)]
return np.array(j)
options = {'c1': 0.5, 'c2': 0.5, 'w':0.9, 'k': 30, 'p':2}
dimensions = 19
optimizer = ps.discrete.BinaryPSO(n_particles=100, dimensions=dimensions, options=options)
cost, pos = optimizer.optimize(f, iters=100)
问题来源StackOverflow 地址:/questions/59386403/how-to-match-boolean-index-array-along-with-dimension
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
这个错误信息表明你在尝试使用布尔索引从x_train
中选择特征时,遇到了维度不匹配的问题。具体来说,你的布尔索引(m==1
)的形状与你想要应用它的数据x_train
的对应维度不一致。
在你的代码中,问题可能出在这里:
X_subset = x_train[:,m==1]
这里你试图用一个布尔数组m==1
来选择x_train
中的列,但错误提示显示你的布尔索引维数与x_train
的列数不匹配。这通常意味着m
的形状或逻辑操作后得到的布尔数组与x_train
的列数(维度1)不一致。
解决这个问题的一个方法是确保你的布尔索引m
是一个一维布尔数组,其长度与x_train
的列数相等。如果你的m
已经是正确的形状(即长度为19的一维布尔数组),那么问题可能在于生成或处理m
的方式。如果m
不是预期的形状,请确保它正确地反映了对每个特征的选择(1表示选择该特征,0表示不选择)。
此外,注意在你的函数f_per_particle
中,计算损失部分的表达式似乎有误,因为直接使用了未定义的变量P
进行运算,并且运算符之间没有明确的操作。假设你是想获取模型训练后的准确率或者损失值,应该访问训练结果的历史记录,例如通过P.history['accuracy'][-1]
或P.history['loss'][-1]
来获取最后一步的准确率或损失值。
修正后的代码片段可能如下所示(以获取准确率为例):
def f_per_particle(m, alpha):
total_features = 19
if np.count_nonzero(m) == 0:
X_subset = x_train
else:
X_subset = x_train[:, m]
# 确保m是正确的形状和类型
assert m.shape == (total_features,), "Boolean mask shape does not match the number of features."
history = model.fit(X_subset, y_train, batch_size=64, epochs=100, verbose=0)
# 假设我们关心的是准确率,根据需要也可以改为'loss'
j = (alpha * (1.0 - history.history['accuracy'][-1]) + (1.0 - alpha) * (1 - (np.count_nonzero(m) / total_features)))
return j
请检查并调整你的m
生成逻辑,以及如何使用模型训练返回的结果,以确保所有操作都符合预期。