Я работаю над алгоритмом KNN для университетского задания, и в настоящий момент я работаю над поиском евклидова расстояния между каждым из векторов обучения, хранящимся как Scipy lil_matrix (из-за разреженность значений в векторах) и вектор тестирования, сохраненный как 1 xn lil_matrix по тем же причинам выше.Euclidean Расстояние между Scipy Sparse Matrix и Sparse Vector
Для того, чтобы выработать евклидова расстояния я затем делать следующий код:
for positiveIndex, positivesComparison in enumerate(positives):
result.append((spatial.distance.euclidean(positivesComparison.todense(),sentenceVector.todense()), positiveIndex, 1))
Где sentenceVector является lil_matrix 1 ряд, и позитивов является lil_matrix размера п х т.
Я хочу попробовать что-то быстрее, чем проходить через положительную матрицу подряд за строкой и каждый раз оценивать эвклидовое расстояние и, возможно, запустить эвклидовое расстояние между матрицей положительных элементов и вектором предложенияVector и вернуть 1 xm матрица с евклидовыми расстояниями. Причина, по которой я хочу сделать это, заключается в том, что текущая система относительно медленна для вычисления, поскольку в основном это временная сложность NM, поскольку мне нужно вычислить более одного теста предложения. Возможно ли это, и если да, как бы я это сделал?
Примечание, задача состоит в том, чтобы оценить эффективность использования различных значений K для алгоритма Knn, а не на фактической реализации KNN (хотя мы не имеем права использовать библиотеки Knn для выполнения задачи)
Сначала я использовал массив numpy, но размер вектора очень велик, а данные очень разреженные. Сохранение нулевых значений привело к тому, что набор для обучения составлял около 5 гб, при сохранении только ненулевых значений он снизился до 20-30 мб. Огромная разница. Я использую lil_matrix, так как я определяю размер матрицы в начале, но тогда вам нужно назначить ему значения по координатам x, y и только найти способы сделать это с помощью lil_matrix. Я не уверен, могу ли я использовать scikit-learn, поинтересуюсь об этом, поэтому на данный момент я просмотрю статью о некоторых трюках, упомянутую в статье. – Lincoln
Если вы не можете использовать sklearn, вы всегда можете просто адаптировать к нему соответствующие функции: https://github.com/scikit-learn/scikit-learn/blob/master/sklearn/metrics/pairwise.py#L109 – perimosocordiae