Многоклассовая классификация
Я делаю классификатор, есть 50+ классов, у них есть 100 + массивов по 100+ элементов
Подробнее: Существует dataset массивов c номерами классами к которым они относятся
dataset = {
"Класс 1": [[16, 18, 11, 18], [14, 11, 14, 16], [13, 10, 11, 17]],
"Класс 2": [[38, 38, 34, 37], [30, 38, 39, 34], [30, 32, 38, 38]],
"Класс 3": [[57, 50, 51, 51], [58, 50, 50, 56], [50, 58, 56, 58]]
}
Мы подаем 1 массив на вход
input_data = [[21, 11, 25, 16]]
На выходе я хочу получить процент совпадения моего входного массива с каждым классом, например:
Совпадения Input_data:
с классом 1 на - 85%
с классом 2 на - 50%
с классом 3 на - 10%
Существует условие, что массивы из dataset похожи друг на друга, например i[0][0] + - похож на i[1][0] и на i[2][0]
Логика, как я понимаю, должна быть такая, я делаю стандартное отклонение, но вот что дальше не знаю
for key, values in dataset.items():
x1 = values[0][0], values[1][0], values[2][0]
x2 = values[0][1], values[1][1], values[2][1]
x3 = values[0][2], values[1][2], values[2][2]
x4 = values[0][3], values[1][3], values[2][3]
print(np.std(x1, axis=0))
print(np.std(x2, axis=0))
print(np.std(x3, axis=0))
print(np.std(x4, axis=0))
Я попробовал байесовский классификатор, но это не очень помогает
Ответы (1 шт):
Ну, такая первоначальная прикидка, не векторизованная, на чистом питоне, вообще без библиотек. Просто считаем что-то типа среднеквадратичного отклонения и берём от него корень, чтобы размерность сохранить.
dataset = {
"Класс 1": [[16, 18, 11, 18], [14, 11, 14, 16], [13, 10, 11, 17]],
"Класс 2": [[38, 38, 34, 37], [30, 38, 39, 34], [30, 32, 38, 38]],
"Класс 3": [[57, 50, 51, 51], [58, 50, 50, 56], [50, 58, 56, 58]]
}
input_data = [[21, 11, 25, 16]]
for i in input_data:
print(i)
for k in dataset:
print(k, sum(sum((a-b)**2 for a,b in zip(row,i))/len(dataset[k]) for row in dataset[k])**0.5)
Вывод:
[21, 11, 25, 16]
Класс 1 15.340577998671801
Класс 2 36.71965867669978
Класс 3 72.1295131459146
Наименьшее отклонение тут от Класс 1 получилось.
Обновил формулу, теперь результат не зависит от того, сколькими образцами представлен каждый класс. В предыдущей версии результат мог быть искажённым, если число образцов по классам различалось.