Многоклассовая классификация

Я делаю классификатор, есть 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 шт):

Автор решения: CrazyElf

Ну, такая первоначальная прикидка, не векторизованная, на чистом питоне, вообще без библиотек. Просто считаем что-то типа среднеквадратичного отклонения и берём от него корень, чтобы размерность сохранить.


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 получилось.

Обновил формулу, теперь результат не зависит от того, сколькими образцами представлен каждый класс. В предыдущей версии результат мог быть искажённым, если число образцов по классам различалось.

→ Ссылка