Я написал следующую программу, которая рассматривает все возможные комбинации категорий, присутствующих в данных, и возможные способы их организации в определенный период времени, чтобы найти наиболее часто встречающиеся.
(Идея проистекает из этой статьи: https://www.nature.com/articles/s41598-018-34136-w).
Он работает правильно для небольших тестовых примеров, но как только я пытаюсь применить его к реальным данным, он «взрывается» во внешнююошибка памяти.
Я не лучший программист, но я попробовал все, что было в моих знаниях. Я пытался рассчитать каждый цикл, чтобы увидеть, будет ли понимание лучше. В конце концов, я былможет заставить программу работать на 30% быстрее, но этого все же недостаточно для реального анализа.
function ordered_combinations(data,L)
return [collect(t) for t in collect(Iterators.product(fill(data,L)...))[:]]
end
Возвращает все возможные комбинации значений из данных общей длины L с разрешенным повторением.
function knapsack_solver(n,length)
kombi = ordered_combinations(collect(1:length),n-1)
return [k for k in kombi if sum(k)<length]
end
Находит все возможные комбинации из n чисел, идущих от 1 до длины, которые в сумме составляют сумму, меньшую длины.
Вот "главная"функция:
function pattern_definer(data, len, delays)
kombinations = []
for L in 2:len
for k in ordered_combinations(unique(data),L)
push!(kombinations,k)
end
end
patterns = []
for k in kombinations
for d in knapsack_solver(length(k),delays)
push!(patterns,(k,d))
end
end
return patterns
end
Последняя вычисляет частоту появления каждого шаблона:
function relative_occurence(data,len,delay)
patterns = pattern_definer(data, len, delay)
occurence = []
for p in patterns
count = 0
for i in 1:length(data)-delay
if vcat(data[i],[data[i+delay] for delay in cumsum(p[2])]) == p[1]
count +=1
end
end
push!(occurence,count)
end
return patterns,occurence
end