Який алгоритм застосувати для вибору потрібної точки


9

На малюнку нижче показано 7 пунктів навколо початку. Один з них був обраний людиною на основі правил та досвіду і пофарбований у червоний колір (той у нижньому лівому квадранті).

введіть тут опис зображення

Зараз у нас є понад 1000 цих наборів точок, і для кожного набору людина вибрала одну точку. Ці умови стосуються всіх наборів:

  • Кожен набір має приблизно 3 - 10 балів
  • Немає сторонніх людей
  • Бали можуть мати позитивні та негативні значення
  • Не було допущено помилок при виборі пункту

Моє запитання: чи існує алгоритм машинного навчання для навчання з цих наборів і вибраних людиною виборів, щоб він міг автоматично вирішувати, який пункт вибрати, коли буде надано новий набір балів? Цей новий набір, звичайно, задовольняє перші 3 умови.

2 заключні зауваження:

  • Наведений я приклад - це лише випадковий побудований мною приклад, який підтримує уявлення про точки в площині навколо джерела разом із вибраним. У реальному житті може бути більше структури, але я зараз цікавий і хотів би знати, що можливо для цього випадку.
  • Чи можливі варіанти? Скажіть, це приблизно 2 обраних пункту або у вас замість точок є кола із заданим радіусом.

2
Просто голосно подумавши, хитрість Кернела може допомогти? Вибрана точка, швидше за все, сидить дуже близько до інших точок, але, ймовірно, буде відокремлена в іншому просторі (наприклад, більш високий розмір), тоді ви робите класифікацію! Я б сказав, що варто подумати.
TwinPenguins

1
@MajidMortazavi Звучить добре. Якщо чесно, машинне навчання - це для мене нове поле. Єдине, що я знаю, - це можливо багато, але я не знаю, як і що. Спробуємо прочитати детальніше про вашу пропозицію щодо ядра.
Elmex80s

2
Якщо ви додасте функції до кожної точки, наприклад, відстань від інших точок, кількість інших точок тощо, ви, можливо, можете скористатися чимось простим, наприклад K-Найближчі сусіди, щоб визначити, на яку історичну точку, на якій ви тренувались, найбільше схожа ваш новий пункт (и) та використовуйте цю класифікацію. Дерева рішень або Нейронні сітки можуть бути краще підходять для такого роду нелінійних кордонів.
Ден Картер

1
Відкидати коментар від @ DanCarter, запитуючи, який алгоритм ML використовувати, - це неправильне питання. Подумайте про функції, які ви можете сконструювати, і дозвольте визначити, які методи використовувати (множина тут важлива; ніколи не слід просто спробувати один метод, якщо проблема не дуже зрозуміла). Деякі інші можливі функції, які можна спробувати: відстань від центроїда (як абсолютна, так і відносна середня відстань у точці-центроїді), відстань від початку, кут вектора від початку до точки робить із віссю.
Павло

1
Чи можуть дві або більше точок бути довільно близькими один до одного?
Імран

Відповіді:


6

Це захоплююча проблема! Дві речі роблять це особливо складним:

  • Як нам порівнювати два точкові множини? Класичні проблеми машинного навчання мають фіксовану кількість атрибутів, і ці атрибути не є взаємозамінними: Наприклад, у мене можуть бути дані про різних осіб з атрибутами ageта height(у сантиметрах). Кожен зразок має один запис для кожного, і, звичайно (age, height) = (22, 180), не такий, як (age, height) = (180, 22). Це не відповідає дійсності вашої проблеми. Набір точок має від 3 до 10 балів, і порядок, в який ми вводимо точки, не повинен змінювати при порівнянні двох наборів точок.
  • Як ми можемо зробити прогноз? Скажіть, що ми знайшли спосіб підібрати набір точок з нашого навчального набору, подібний до вашого набору вище. Ми стикаємося з проблемою, що наше передбачення має бути однією з 7 точок на вашій картині; але жодна з цих точок не може міститись у подібних наборах точок.

Дозвольте мені окреслити алгоритм, який вирішує обидва завдання. Точність прогнозування не дуже хороша; але, можливо, ви бачите спосіб, як це можна вдосконалити. І принаймні щось пророкує , правда?

1. Моделювання зразків

Щоб мати можливість перевірити алгоритм, я написав функції, які генерують зразки та мітки.

Генерування зразків: кожен зразок містить від 3 до 10 балів. Кількість балів випадкова, виведена з рівномірного розподілу. Кожна точка має форму (x_coordinate, y_coordinate). Координати знову випадкові, виведені з нормального розподілу.

import numpy as np
from random import randint

def create_samples(number_samples, min_points, max_points):

    def create_single_sample(min_points, max_points):
        n = randint(min_points, max_points)
        return np.array([np.random.normal(size=2) for _ in range(n)]) 

    return np.array([create_single_sample(min_points, max_points) for _ in range(number_samples)])

Генерування етикеток. Як приклад іграшки, припустимо, що правило вибору точки: Завжди вибирайте точку, яка є найближчою до того (0, 0), де «найближчі» слід розуміти з точки зору евклідової норми.

def decision_function_minnorm(sample):
    norms = np.apply_along_axis(np.linalg.norm, axis=1, arr=sample)
    return sample[norms.argmin()]

def create_labels(samples, decision_function):
    return np.array([decision_function(sample) for sample in samples])

Тепер ми можемо створити набір поїздів і тестів:

n_train, n_test = 1000, 100
dec_fun = decision_function_minnorm

X_train = create_samples(number_samples=n_train, min_points=3, max_points=10)
X_test = create_samples(number_samples=n_test, min_points=3, max_points=10)
y_train = create_labels(X_train, dec_fun)
y_test = create_labels(X_test, dec_fun)

2. Порівняння наборів точок через відстань Хаусдорфа

Давайте вирішимо першу проблему: як нам порівнювати різні набори точок? Кількість балів у наборах точок різна. Також пам’ятайте, що порядок, в який ми записуємо бали, не повинен мати значення: Порівняння з набором точок [(0,0), (1,1), (2,2)]повинно дати такий же результат, як і порівняння з набором точок [(2,2), (0,0), (1,1)]. Мій підхід полягає в порівнянні наборів точок через відстань Хаусдорфа :

def hausdorff(A, B):

    def dist_point_to_set(x, A):
        return min(np.linalg.norm(x - a) for a in A)

    def dist_set_to_set(A, B):
        return max(dist_point_set(a, B) for a in A)

    return max(dist_set_to_set(A, B), dist_set_to_set(B, A))

3. Прогнозування через k-найближчих сусідів та усереднення

Тепер у нас є поняття відстані між множинами точок. Це дає можливість використовувати k-класифікацію найближчих сусідів: Враховуючи набір тестових точок, kу нашому навчальному зразку ми знаходимо набори точок, які мають найменшу відстань Хаусдорфа відносно набору тестових точок, та отримуємо їх мітки. Тепер виникає друга проблема: як ми можемо перетворити ці kмітки в передбачення для встановленої точки тесту? Я взяв найпростіший підхід: середній рівень міток і прогнозування точки в наборі тестових точок, найбільш близької до середньої.

def predict(x, num_neighbors):
    # Find num_neighbors closest points in X_train.
    distances_to_train = np.array([hausdorff(x, x_train) for x_train in X_train])
    neighbors_idx = np.argpartition(distances_to_train, -num_neighbors)[-num_neighbors:]

    # Get labels of the neighbors and calculate the average.
    targets_neighbors = y_train[neighbors_idx]
    targets_mean = sum(targets_neighbors) / num_neighbors

    # Find point in x that is closest to targets_mean and use it as prediction.
    distances_to_mean = np.array([np.linalg.norm(p - targets_mean) for p in x])
    closest_point = x[distances_to_mean.argmin()]

    return closest_point

4. Тестування

Все на місці, щоб перевірити працездатність нашого алгоритму.

num_neighbors = 70
successes = 0
for i, x in enumerate(X_test):
    print('%d/%d' % (i+1, n_test))
    prediction = predict(x, num_neighbors)
    successes += np.array_equal(prediction, y_test[i])

Для даної функції рішення і num_neighbors = 70ми отримуємо точність прогнозування 84%. Це не дуже добре, і це, звичайно, специфічно для нашої функції прийняття рішень, яку здається передбачити досить просто.

Щоб побачити це, визначте іншу функцію рішення:

decision_function_maxaverage(sample):
    avgs = (sample[:, 0] + sample[:, 1]) / 2
    return sample[norms.argmin()]

Використання цієї функції за допомогою dec_fun = decision_function_maxaverageзнижує точність прогнозування до 45%. Це показує, як важливо продумати правила прийняття рішень, які генерують ваші мітки. Якщо у вас є ідея, чому люди обирають певні моменти, це допоможе вам знайти найкращий алгоритм.

Деякі способи вдосконалення цього алгоритму: (1) Використовувати іншу функцію дистанції замість відстані Хаусдорфа, (2) використовувати щось більш досконале, ніж k-найближчі сусіди, (3) покращити, як обрані навчальні мітки перетворюються на прогнозування.


3

Ось кілька способів використання нейронних мереж для вирішення цієї проблеми:

За допомогою простої нейронної мережі:

  • Масштабуйте свої дані, щоб вони вміщувались у квадраті навколо початку від (-1, -1) до (1,1)
  • Представляйте кожну точку з двома входами, що відповідають її координатам x і y, або 0,0, якщо kцього пункту немає
  • Додайте третій вхід індикатора для кожної точки, вказуючи, чи є ця точка
  • Виберіть кількість та розмір прихованих шарів
  • На виході використовуйте шар softmax розміром 10

Отже, кожним вхідним прикладом буде вектор довжини 30, де останні 3 * (10-k) значення дорівнюють нулю, коли вони є k точок, присутніх у наборі, а вихід є вектором довжиною 10, що підсумовує 1, чи найбільше значення відповідає передбачуваній точці (позиція якої відповідає цій позиції на вході).

З конволюційною нейронною мережею:

  • Розділіть свою площину на сітку n х n квадратів і представляють ваше введення як n х n матриця, яка є k якщо є k точки в квадраті (i,j) і 0інакше. Сподіваємось, очки не перекриються, тому у вас є матриця1с і 0с.
  • Тренуйте CNN на вхідних матрицях. Форма виводу повинна бути розміром софтмаксиnn, що відповідає вхідній формі сплюснутої. Виберіть точку з найвищим значенням у відповідних вихідних координатах.

CNN може працювати краще, оскільки ваші дані суттєво просторові. Однак ви повинні вирішити, що робити, якщо дві або більше точок перетинаються. Найпростіше рішення - вибрати один випадковим чином, який може бути нормальним залежно від конкретного завдання.

З періодичною нейронною мережею:

  • Подайте в послідовності змінної довжини масштабованих (x, y) точок і виведіть оцінку програмного забезпечення розміром 10

Так, це так просто, як це з RNN! Вони добре поводяться з введеннями різної довжини, але їм все ще бракує переваг CNN для обробки просторових даних.

Застереження:

Якщо ви використовуєте FNN або RNN, також важливим є спосіб замовлення вхідних даних. Якщо у ваших реальних даних немає притаманного порядку, то ми не хочемо, щоб наша мережа робила різні прогнози для одних і тих же даних, кодованих у різних замовленнях. Одним із способів впоратися з цим є розширення даних : кілька разів продублюйте кожен приклад тренувань з різними порядками введення, тож сподіваємось, що ваша мережа може вивчити відповідні симетрії.

Якщо у вас є час лише спробувати один підхід, я вибрав би CNN. CNN розроблені так, щоб вони добре відповідали просторовим даним, і немає впорядкування введення.


1
Проблема в цьому полягає в тому, що прогнозування залежить від порядку. Подача алгоритму набору точок (0,0), (1,1), (2,2)матиме інший ефект, ніж подача його набору точок (1,1), (2,2), (0,0).
Ілля Стреле

Хороший момент Еліас - я висловлю пропозицію пом'якшити це.
Імран

Це добре згадує @EliasStrehle, порядок не має значення для цієї проблеми. У нас є набір (весь унікальний, без порядку) балів.
Elmex80s
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.