Если заявления в понимании относительно операций с массивами - PullRequest
1 голос
/ 06 марта 2020

Я пытаюсь воспользоваться оптимизацией 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))

1 Ответ

0 голосов
/ 06 марта 2020

По-прежнему возникают некоторые проблемы с логикой c, но я думаю, что это, по крайней мере, близко к тому, что вы ищете:

pred = sum((estimator.predict(X) == classes).T * (w1 if estimator_[0].predict(x) else 0) + (estimator.predict(X) == classes).T * (w2 if estimator_[1].predict(x) else 0)
               for estimator, w1, w2 in zip(self.estimators_,
                                            self.estimator_weights_pos,
                                            self.estimator_weights_neg))

ИЛИ это может сработать в зависимости от вашего значения, если проблема:

pred = sum((estimator.predict(X) == classes).T * w1 * estimator_[0].predict(x) + (estimator.predict(X) == classes).T * w2 * estimator_[1].predict(x)
                   for estimator, w1, w2 in zip(self.estimators_,
                                                self.estimator_weights_pos,
                                                self.estimator_weights_neg))
...