如何解决使用高级索引时形状不匹配
我正在开发一个自定义分类器,它的作用类似于集成,将次要分类器组合在一起,集成的输出实际上是多数投票。需要提及的一件重要事情是,每个分类器都有一个与每个样本相关联的“权重”。
这是 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 举报,一经查实,本站将立刻删除。