Мне нужен метод, чтобы найти минимальную пару хи-квадрат между двумя одномерными массивами.Например, один массив
a = np.array([1, 2, 3])
другой массив
b = np.array([0.9, 1, 3.5, 4.5])
Нам нужно найти подмассив в b
с такой же длиной a
, как
sub_b = np.array([0.9, 1, 3.5])
обратите внимание, что sub_b
не должен включать дублирующиеся элементы.
И найти ближайшую пару между двумя массивами.Мы выбираем chi-square = sum((a - sub_b)**2) / len(a)
.Итак, нам нужно найти sub_b
с минимальным хи-квадратом.
Я использую iteration.permutations
, чтобы найти все перестановки sub_b
, а затем найти минимальный хи-квадрат.
from itertools import permutations
def find_chi2_array(b, a):
chi2 = lambda x: sum((x-a)**2) / len(a)
perm = np.array(list(permutations(b, len(a))))
chi2_results = np.apply_along_axis(chi2, 1, perm)
return chi2_results.min(), candidates[chi2_results.argmin()]
Но этот метод очень глуп, и когда длина b
увеличивается, память быстро истощается.
Если я использую цикл for
в чистом Python,скорость слишком низкаяМожет у кого-нибудь есть более эффективный и менее емкий метод памяти?
def find_chi2_array_slow(b, a):
chi2 = lambda x: sum((x-a)**2) / len(a)
n = 0
for perm in permutations(b, len(a)):
perm = np.array(perm)
n += 1
if n == 1:
chi2_result = chi2(perm)
elif chi2_result > chi2(perm):
chi2_result = chi2(perm)
return chi2_result