微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用高级索引时形状不匹配

如何解决使用高级索引时形状不匹配

我正在开发一个自定义分类器,它的作用类似于集成,将次要分类器组合在一起,集成的输出实际上是多数投票。需要提及的一件重要事情是,每个分类器都有一个与每个样本相关联的“权重”。

这是 predict 方法

def predict(self,X):        
    
    G = self._compute_g(X) # G comes from a softmax distribution
    pred = np.zeros( (len(self._estimators),X.shape[0]),dtype=int ) 
    
    for i,estimator in enumerate(self._estimators): #loop each minor classifier
        y_est = estimator.predict(X)    
        pred[i] = y_est

    pred = pred.T # Prediction matrix (samples x classifiers)
    C = len(self._classes) # number of classes of the dataset
    M,N = pred.shape

    row,col = np.indices((M,N))
    P3d = np.zeros(shape=(M,N,C))
    P3d[row,col,pred-1] = G
    P = P3d.sum(axis=1)
    return np.argmax(P,axis=1)

对于多数投票,我创建了一个 P 矩阵(样本 x n_classes),它对给定类别中投票的分类器权重求和。例如:假设我们有 3 个分类器试图预测 3 类问题的样本 k分类器权重为 [0.3,0.4,0.6],预测为 [1,1,2]。矩阵 k 的第 P 行将为 [0.7,0.6,0],集成分类器的输出将为 1

问题是我正在尝试使用高级索引来构建矩阵 P3d(用于构建矩阵 P),并且在尝试预测 Iris 数据集时出现以下错误

ValueError: shape mismatch: value array of shape (150,6) Could not be broadcast to indexing result of shape (150,3)

这个错误来自这一行:P3d[row,pred-1] = G,但我不知道是什么导致了这个问题。

涉及的矩阵形状

  • G:n_samples x n_classifiers
  • pred (M,N):n_samples x n_classifiers
  • P:n_samples x n_classes
  • 函数返回(最后一行):n_samples x 1

解决方法

如果没有看到完全可重现的代码,就很难判断 G = self._compute_g(X) 在做什么。但是,返回的值 G 似乎具有形状 (150,6),而不是预期的 (150,3)。因此,您会得到形状不匹配错误。

我建议对 G 进行一些仔细检查,以确认 self._compute_g(X) 正在执行您期望的操作。

作为旁注,明智地使用 assert 来确认各种数组的形状可以帮助捕获许多此类错误。即assert G.shape == (M,N)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。