开发者社区 问答 正文

如何匹配布尔索引数组与维度?

我想评估特征选择技术粒子群优化与神经网络。但我一直有这样的错误: “布尔索引与维度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

展开
收起
kun坤 2019-12-25 21:57:49 451 分享 版权
阿里云 AI 助理回答

这个错误信息表明你在尝试使用布尔索引从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生成逻辑,以及如何使用模型训练返回的结果,以确保所有操作都符合预期。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答