У меня есть трехмерный массив numy, который представляет user id
, полученный из моего классификатора с формой (NxKxM)
, и я хотел бы вычислить индекс jaccard (пересечение len / len union), чтобы проверить соотношение перекрытия во время моего groupkfold. Мне нужно вычислить эту функцию по оси N (число гиперпарамов) и M (число или итераций), тогда как K
- это число сгибов CV. Я хотел бы иметь что-то вроде:
A [0] [0] [:] сравнивается с A [1:] [:] [:], A [0] [1] [:] сравнивается с A [1:] [:] [ :] и A [0] [2] [:] сравниваются с A [1:] [:] [:] для первого уровня и так далее итеративно. (в случае k = 3)
Я пытался использовать вложенный цикл, но, конечно, код очень медленный, до сих пор у меня такая ситуация:
for elem in range(len(total_users_splits)):
for subelem in range(elem+1,len(total_users_splits)):
for i in range(n_splits):
for j in range(n_splits):
first = b[elem][i]
second = b[subelem][j]
total_num = len(np.union1d(first,second))
intersect_len = len(np.intersect1d(first,second))
X.append(intersect_len/total_num)
overlap = {'overlap_ratio_mean_uids':np.nanmean(X),
'overlap_ratio_std_uids':np.nanstd(X),
'overlap_ratio_max_uids':np.max(X),
'overlap_ratio_min_uids':np.min(X)}
total_user_splits
- это список измерения NxM, а n_splits
- это k.
Код действительно медленный, но я не знаю, как применить np.intersect
векторизованным способом