Я пытаюсь воспользоваться оптимизацией numpy, чтобы избежать вложенных циклов:
Ток, у меня есть это выражение:
pred = sum((estimator.predict(X) == classes).T * w1 + (estimator.predict(X) == classes).T * w2
for estimator, w1, w2 in zip(self.estimators_,
self.estimator_weights_pos,
self.estimator_weights_neg))
где estimator.predict (X) возвращает эту матрицу:
[[Истинно Истинно Истинно ... Истинно неверно Ложно]
[Ложно неверно Ложно ... Ложно Верно Истинно]]
и это приводит к другой матрице, которая суммирует все оценки умножения, например,
[[2.53358017 3.96826913] [2.53358017 3.96826913] [4.17461936 2.32722994] ... [4.60035727 1.90149203] [3.77621808 2.70163203] [4.60149227] ]
Однако я хочу разделить эту операцию. Всякий раз, когда в первой строке операции «estimator.predict (X)» есть элемент True, я хочу, чтобы только w1 использовался для умножения, а когда элемент из второй строки имеет значение True only w2 , который будет использоваться.
Чтобы привести пример,
self.estimator_weights_pos = [1, 2]
self.estimator_weights_neg = [0.1, 0.2]
self.estimators_[0].predict(X) = [[True, True, False][False, False, True]]
self.estimators_[1].predict(X) = [[True, False, False][False, True, True]]
Итак, первая итерация приводит к:
[[1 0] [ 1 0] [0 0,1]]
И вторая итерация приводит к:
[[3 0] [1 0,2] [0 0,3]]
Текущее выражение приведет к:
[[1.1 0] [1.1 0] [0 1.1]]
[[3.3 0] [1.1 2.2 ] [0 3.3]]
В качестве наивного подхода я сделал это:
pred_pos = sum((estimator.predict(X) == classes).T[:,0] * w1
for estimator, w1 in zip(self.estimators_,
self.estimator_weights_pos))
pred_neg = sum((estimator.predict(X) == classes).T[:,1] * w1
for estimator, w1 in zip(self.estimators_,
self.estimator_weights_neg))
pred = np.column_stack((pred_pos, pred_neg))