вычисление квадратного расстояния ci в python

#image-processing #vectorization #knn #chi-squared

#обработка изображений #векторизация #knn #хи-квадрат

Вопрос:

я использую модель knn из sklean (- документация https://scikit-learn.org/stable/modules/generated/sklearn.neighbors .KNeighborsClassifier.html ) обучить некоторую модель классификации изображений. как вы можете видеть в документации, нет возможности передать расстояние хи-квадрат в качестве показателя функции KNeighborsClassifier. но есть возможность передать вызываемый элемент — так что я могу передать функцию, которую я создал для вычисления хи-квадрата. поэтому я попытался написать свою собственную функцию. я знаю, что для некоторых двух изображений хи-квадрат вычисляется по следующей формуле: формула для вычисления расстояния хи-квадрат

моя задача — решить эту проблему без использования циклов for, так как это занимает слишком много времени. мне нужно решить это с помощью векторизации, так как мои данные, передаваемые в квадрат хи, представляют собой изображения, поэтому, если у меня есть два изображения, представленные в виде np-массивов, я могу выполнять с ними математические действия без циклов, я имею в виду, например, для A = [1,2,3] и B = [3,4,5], A B просто дайте нам [4,6,8], нет необходимости использовать цикл для вычисления этого. таким образом, мне также нужно вычислить функцию хи-квадрат.

во всяком случае, когда я попробовал, например, эту функцию:

 def chi2(A, B):
#compute the chi-squared distance using above formula

chi = 0.5 * (((A - B) ** 2) / (A   B))


return chi
 

чтобы вычислить квадрат хи, я получаю сообщение об ошибке, и если я попробую некоторые другие подобные функции, например, этот код :

 def chi2(A, B):
#compute the chi-squared distance using above formula

def chi2_distance(A, B):
    # compute the chi-squared distance using above formula
    chi = 0.5 * np.sum([((a - b) ** 2) / (a   b)
                        for (a, b) in zip(A, B)])

    return chi
 

я получаю предупреждения: предупреждение о времени выполнения: недопустимое значение, встречающееся в double_scalars
для (a, b) в zip (A, B)])

и программа работает как вечно.

любые предложения по какому-либо эффективному коду для вычисления расстояния хи-квадрат (как я уже сказал, без циклов)?

Комментарии:

1. Что плохого в том, чтобы просто использовать функцию ядра scikit-learn с попарным хи-квадратом? scikit-learn.org/stable/modules/generated /…

2. на самом деле, я уже пробовал этот метод, но это дает мне очень низкую оценку модели. я имею в виду, что использование, например, евклидова встроенного расстояния дало мне примерно 0,76 балла точности, и когда я попробовал эту функцию, она дала мне примерно 0,03 или что-то в этом роде. разве это не странно? я догадался, что это не сработает, и мне было интересно, представляет ли формула там (k (x, y) = -Sum [(x — y) ^ 2 / (x y)] ) ту же формулу, которую я дал? для чего этот знак минус

3. Эта вторая реализация выглядит так же, как пример на geeksforgeeks.org/chi-square-distance-in-python Получаете ли вы тот же результат для их тестовых случаев?

4. да, я взял это оттуда. кстати, спасибо geeksforgeeks. в любом случае, я не пробовал их тестовые примеры, поскольку это одна и та же функция, поэтому она должна работать. я не знаю, почему комбинация функции knnClassifier с этой функцией не работает — KNeighborsClassifier(n_neighbors=i,metric= chi2) , как я уже сказал, выдала мне предупреждение RuntimeWarning: недопустимое значение, встречающееся в double_scalars для (a, b) в zip(A, B)]) , и выполняетсянавсегда

5. Ну, вы получаете предупреждение во время выполнения с кодом, основанным на этом примере, поэтому попытка их тестовых примеров исключит или обнаружит возможную опечатку. Я просто запустил их код точно так, как показано в записной книжке Jupyter, и он работает нормально.