python - 使用高级索引时形状不匹配
问题描述
我正在开发一个像集成一样的自定义分类器,将次要分类器组合在一起,集成的输出实际上是多数投票。值得一提的是,每个分类器都有一个与每个样本相关联的“权重”。
这是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 个分类器试图预测k
3 类问题的样本。分类器权重是[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, col, pred-1] = G
,但我不知道是什么导致了这个问题。
涉及的矩阵形状
G
: n_samples x n_classifierspred (M,N)
: n_samples x n_classifiersP
: n_samples x n_classes- 函数返回(最后一行):n_samples x 1
解决方案
如果没有看到完全可重现的代码,就很难判断G = self._compute_g(X)
它在做什么。但是,返回的值G
似乎有 shape (150, 6)
,不像(150, 3)
预期的那样。因此,您会得到形状不匹配错误。
我建议您仔细检查一下,G
以确认self._compute_g(X)
是否符合您的预期。
作为旁注,明智地使用assert
来确认各种数组的形状可以帮助捕获许多此类错误。IEassert G.shape == (M, N)
推荐阅读
- java - 要映射的动态字符串列表
- c++ - 哪个更快,Union 还是 std::variant<>?
- javascript - Discord JS - 等待消息 - 多个问题
- python - 在 Django 中创建另一个对象时创建对象
- mysql - 如何使用从自定义 MySQL Docker 映像创建容器的 GenericContainer 配置 spring 数据源
- vba - 为导出添加水印
- excel - 如何计算并导出outlook中类别的数量和名称到excel
- batch-file - 如何使用 /pflag "i" 开关仅用 jrepl 替换文本文件中的第一个匹配项?
- spring-kafka - 如何在消息聊天室中管理 kafka 主题
- php - omnipay 中的 curl 命令