Применить ранг в перестановке списка

У меня есть два списка:

l1 = [0, 1, 12, 33, 41, 52, 69, 7.2, 8.9, 9.91]
l2 = [45, 51]

Мне нужно получить все возможные комбинации (без повторения) от l1 с размером, равным длине l2 . Затем примените метрику ранжирования к l2 и l1 (для каждой комбинации). Наконец, мне нужно получить ближайшую метрику относительно. l1 и lx ( lx - перестановочный список).

Что я пробовал до сих пор (это больше похоже на псевдокод):

import numpy as np

def apply_metric(predictions, targets):
    return np.sqrt(((predictions - targets) ** 2).mean())

l1 = [0, 1, 12, 33, 41, 52, 69, 7.2, 8.9, 9.91]
l2 = [45, 51]

for item in l1:
    #do the possible combinations
    temp_result = apply_metric(np.array(l2), np.array(permuted_items))

выход:

best metric = 0 (identical)
best list = [45, 51]

Всего 1 ответ


Вы можете использовать перестановку itertools, чтобы получить свой перестановочный список, а затем применить метрику.

import numpy as np
import itertools as it

def apply_metric(predictions, targets):
    return np.sqrt(((predictions - targets) ** 2).mean())

l1 = [0, 1, 12, 33, 41, 52, 69, 7.2, 8.9, 9.91]
l2 = [45, 51]

temp_dict = {}
for elements in it.permutations(l1, len(l2)):
    temp_result = apply_metric(np.array(l2), np.array(elements))
    temp_dict.update({temp_result : list(elements)})

print(f"Best metric: {min(temp_dict)}")
print(f"Best list: {temp_dict[min(temp_dict)]}")

Который дает:

Best metric: 2.9154759474226504
Best list: [41, 52]

Есть идеи?

10000