#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, и он работает нормально.