Я хотел бы использовать класс NeighborSearch в mlpack, чтобы выполнить классификацию KNN для некоторых векторов, представляющих документы.
Я бы хотел использовать Cosine Distance, но у меня проблемы. Я думаю, что способ сделать это — использовать метрику внутреннего продукта «IPMetric» и указать ядро CosineDistance … Вот что у меня есть:
NeighborSearch<NearestNeighborSort, IPMetric<CosineDistance>> nn(X_train);
Но я получаю следующие ошибки компиляции:
/usr/include/mlpack/core/tree/hrectbound_impl.hpp:211:15: error: ‘Power’ is not a member of ‘mlpack::metric::IPMetric<mlpack::kernel::CosineDistance>’
sum += pow((lower + fabs(lower)) + (higher + fabs(higher)),
^
/usr/include/mlpack/core/tree/hrectbound_impl.hpp:220:3: error: ‘TakeRoot’ is not a member of ‘mlpack::metric::IPMetric<mlpack::kernel::CosineDistance>’
if (MetricType::TakeRoot)
^
Я подозреваю, что проблема может быть в том, что тип дерева по умолчанию, KDTree, не поддерживает эту метрику расстояния? Если это проблема, есть ли тип дерева, который работает для CosineDistance?
Наконец, возможно ли использовать перебор? Я не могу найти способ использовать дерево вообще …
Спасибо!
К сожалению, как вы и предполагали, произвольные типы метрик не работают с KDTree — это потому, что для kd-дерева требуется расстояние, которое можно разложить на разные измерения. Но это невозможно с IPMetric
, Вместо этого, почему бы не попробовать использовать дерево обложек? Время сборки дерева может быть несколько больше, но оно должно давать сопоставимую производительность:
NeighborSearch<NearestNeighborSort, IPMetric<CosineDistance>, arma::mat,
tree::StandardCoverTree> nn(X_train);
Если вы хотите выполнить поиск методом перебора, укажите режим поиска в конструкторе:
NeighborSearch<NearestNeighborSort, IPMetric<CosineDistance>, arma::mat,
tree::StandardCoverTree> nn(X_train, NAIVE_MODE);
Я надеюсь, что это полезно; дайте мне знать, если я могу уточнить что-нибудь.
Других решений пока нет …