Машинное обучение: найдите ближайший результат к запрошенному вектору

У меня есть тысячи векторов по 20 функций каждый.

Учитывая один вектор запроса и набор потенциальных совпадений, я хотел бы иметь возможность выбирать лучшие совпадения N

Я провел пару дней, пытаясь регрессировать (используя SVM), обучая свою модель с помощью набора данных, который я создал сам: каждый вектор является конкатенацией вектора запроса и вектора результата, и я даю оценку (субъективно оцениваемую) между 0 и 1, 0 для идеального соответствия, 1 для худшего совпадения.

У меня не было больших результатов, и я считаю, что одна из причин может заключаться в том, что очень сложно субъективно назначать эти баллы. С другой стороны, легче было бы субъективно оценивать результаты ( score – неизвестная функция):

 score(query, resultA) > score(query, resultB) > score(query, resultC) 

Поэтому я считаю, что это больше проблема обучения для ранжирования, и я нашел различные ссылки для Python:

  • http://fa.bianp.net/blog/2012/learning-to-rank-with-scikit-learn-the-pairwise-transform/
  • https://gist.github.com/agramfort/2071994 …

но я не мог понять, как это работает. Я действительно смущен всей терминологией, парным ранжированием и т. Д. (Обратите внимание, что я ничего не знаю о механизме обучения, поэтому чувствую себя немного потерянным) и т. Д., Поэтому я не понимаю, как применить это к моя проблема.

Может кто-то, пожалуйста, помогите мне прояснить ситуацию, указать мне на ту категорию проблем, которую я пытаюсь решить, и даже лучше, как я мог реализовать это в Python (scikit-learn)?

    Мне кажется, что вы пытаетесь просто вычислить расстояния между запросом и остальными вашими данными, а затем вернете самые близкие N векторов к вашему запросу. Это проблема поиска. Нет заказа, вы просто измеряете расстояние между запросом и «тысячами векторов». Наконец, вы сортируете расстояния и берете наименьшие значения N. Они соответствуют самым близким N векторам к вашему запросу.

    Для повышения эффективности при сравнении вы можете использовать KD-деревья или другие эффективные структуры поиска: http://scikit-learn.org/stable/modules/neighbors.html#kd-tree

    Затем взгляните на страницу Википедии на пространстве Lp. Прежде чем выбрать подходящую метрику, вам нужно подумать о данных и их представлении:

    1. С какими данными вы работаете? Откуда она взялась и что она представляет? Является ли пространство признаков состоящим только из реальных чисел или оно содержит двоичные значения, категориальные значения или все из них? Wiki для однородных и гетерогенных данных.

    Для реального значения пространственного пространства, евклидово расстояние (L2) обычно является используемой метрикой выбора, с 20 функциями вы должны быть в порядке. Начните с этого. В противном случае вам, возможно, придется подумать о расстоянии от города (L1) или других показателях, таких как корреляция Пирсона, косинусоидальное расстояние и т. Д. Возможно, вам придется выполнить некоторую техническую обработку данных, прежде чем вы сможете сделать что-нибудь еще.

    1. Являются ли функции одного масштаба? например, x1 = [0,1], x2 = [0, 100]

    Если нет, попробуйте масштабировать свои функции. Обычно это вопрос проб и ошибок, поскольку некоторые функции могут быть шумными, и в этом случае масштабирование может не помочь. Чтобы объяснить это, подумайте о наборе данных с двумя характеристиками: высотой и весом. Если высота в сантиметрах (10 ^ 3), а вес – в килограммах (10 ^ 1), тогда вы должны стремиться преобразовать cm в метры, чтобы обе характеристики были одинаковыми. Это, как правило, хорошая идея для пространств с широким диапазоном значений, то есть у вас есть большой выбор значений для обеих функций. Вам в идеале хотелось бы, чтобы все ваши функции были нормально распределены, с небольшим количеством шума – см. Центральную предельную теорему.

    1. Все ли функции важны?

    Если вы работаете с реальными ценными данными, вы можете использовать основной компонентный анализ (PCA) для ранжирования функций и сохранения только соответствующих. В противном случае вы можете попробовать выбор функции. http://scikit-learn.org/stable/modules/classes.html#module-sklearn.feature_selection. Уменьшение размера пространства увеличивает производительность, хотя в вашем случае это не является критическим.


    Если ваши данные состоят из непрерывных, категориальных и двоичных значений, то они направлены на масштабирование или стандартизацию данных. Используйте свои знания о данных, чтобы получить соответствующее представление. Это основная часть работы и более или менее черное искусство. Методом проб и ошибок.

    В качестве побочного примечания методы с метрикой, такие как knn и kmeans, просто хранят данные. Обучение начинается там, где заканчивается память.