Учитывая три класса (5,6,7) двух массивов:
y_true = np.array([5,6,7,5])
y_pred = np.array([5,7,7,5])
Поскольку второй элемент имеет значение false, как вернуть массив с горячим кодированием ложноположительного массива, подобный этому?
y_falsep_class5: [0,0,0,0]
y_falsep_class6: [0,0,0,0]
y_falsep_class7: [0,1,0,0]
Таким образом, возвращаемый массив будет иметь размерность (3,4), где 3 — это количество классов, а 4 — длина вектора.
@jared Всего три класса, их имена 5,6,7. Нет, я не имею в виду определение y_falsep_classN
, он должен возвращать двоичный массив с размером (num of classes, vector length)
Я вижу списки Python, а не массивы
@hpaulj извини, отредактировано
Использование IMPLY Gate
import numpy as np
num_classes = 3
min_class = 5
y_true = np.array([5,6,7,5]) - min_class
y_pred = np.array([5,7,7,5]) - min_class
# Convert to one-hot encoding
y_true = np.identity(num_classes)[y_true].T
y_pred = np.identity(num_classes)[y_pred].T
display(y_true)
display(y_pred)
display(imply(y_true,y_pred).astype(float))
Где:
def imply(a,b):
return np.logical_and(np.logical_not(a),b)
Возвращение:
array([[1., 0., 0., 1.],
[0., 1., 0., 0.],
[0., 0., 1., 0.]])
array([[1., 0., 0., 1.],
[0., 0., 0., 0.],
[0., 1., 1., 0.]])
array([[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 1., 0., 0.]])
IIUC, используйте np.unique, чтобы получить классы, а затем простую трансляцию, чтобы определить значения y_pred
, которые отличаются от y_true
:
# identify unique classes (sorted)
u = np.unique(y_true)[:, None]
# array([[5],
# [6],
# [7]])
# set as True/1 the y_pred values that match the class
# and are different from y_true
out = ((u == y_pred) & (u != y_true)).astype(int)
Выход:
array([[0, 0, 0, 0], # 5
[0, 0, 0, 0], # 6
[0, 1, 0, 0]]) # 7
Примечание: если вы хотите, чтобы на выходе был словарь: d = dict(zip(u[:, 0], out))
-> {5: array([0, 0, 0, 0]), 6: array([0, 0, 0, 0]), 7: array([0, 1, 0, 0])}
Сколько занятий у вас будет? Если у вас 100 классов, вы не хотите создавать 100
y_falsep_classN
переменных.