В настоящее время я реализую алгоритм в matlab, который ищет через базу данных клиентов, которые купили определенные статьи. Эта база данных выглядит так:Ускоренный поиск огромного массива matlab
[ 0 1 2 3 4 5 NaN NaN;
4 6 7 8 NaN NaN NaN NaN;
...]
Только размер этой вещи - это размер (данные) = [90810 30]. Теперь я хочу найти частые пункты в этой базе данных (без слишком большого использования панелей инструментов). Я обеспечу toyexample здесь:
toyset = [
0, 1, 2, 3, 4, 5, 6, 7, 8, 9;
5, 6, 7,NaN,NaN,NaN,NaN,NaN,NaN,NaN;
5, 6, 7,NaN,NaN,NaN,NaN,NaN,NaN,NaN;
1, 6, 7, 9, 10, 11,NaN,NaN,NaN,NaN;
2, 4, 8, 11, 12,NaN,NaN,NaN,NaN,NaN];
Это будет генерировать следующие наборы элементов при применении минимальной поддержки 0,5 [поддержки = (occurences_of_set)/(all_sets)]:
frequent_itemsets = [
7,NaN,NaN;
6,NaN,NaN;
5,NaN,NaN;
6, 7,NaN;
5, 7,NaN;
5, 6,NaN;
5, 6, 7];
Моя проблема сейчас нахождение частого набора элементов в наборе данных. В настоящее время я использую следующий алгоритм (который работает прекрасно кстати):
function list = preprocess(subjectArray, combinations, progressBar)
% =========================================================================
%
% Creates a list which indicates how often an article-combination given by
% combinations is present in the array of Customers
%
% =========================================================================
%
% preprocesses the array; Finds the frequency of articles
% subjectArray - Array that contains customer data
% combinations - The article combinations to be found
% progressBar - The progress bar to indicate the progress of the
% algorithm
%
% =========================================================================
[countCustomers,maxSizeCustomers] = size(subjectArray);
[countCombinations,sizeCombinations] = size(combinations);
list=zeros(1,countCombinations);
for i = 1:countCustomers
waitbar(i/countCustomers,progressBar,sprintf('Preprocess: %.0f/%.0f\nSet size:%.0f',i,countCustomers,sizeCombinations));
for k = 1 : countCombinations
helpArray = zeros(1,maxSizeCustomers);
help2Array = zeros(1,sizeCombinations);
for j = 1:sizeCombinations
helpArray = helpArray + (subjectArray(i,:) == combinations(k,j));
help2Array(j) = any(helpArray);
end
list(k) = list(k) + all(help2Array);
end
end
end
Моя единственная проблема это то, что берет возрасты !!! Буквально!! Есть ли какая-то простая возможность (за исключением наборов длины 1, я знаю, что можно сделать быстрее простым подсчетом), чтобы сделать это быстрее?
Я думаю, что это:
helpArray = helpArray + (subjectArray(i,j) == combinations(k,:));
является узким местом? Но я не уверен, так как не знаю, как быстро Matlab выполняет определенные операции.
Спасибо за глядя в него, mind_
То, что я закончил с делать:
function list = preprocess(subjectArray, combinations)
% =========================================================================
%
% Creates a list which indicates how often an article-combination given by
% combinations is present in the array of Customers
%
% =========================================================================
%
% preprocesses the array; Finds the frequency of articles
% subjectArray - Array that contains customer data
% combinations - The article combinations to be found
%
% =========================================================================
[countCustomers,maxSizeCustomers] = size(subjectArray);
[countCombinations,sizeCombinations] = size(combinations);
list=zeros(1,countCombinations);
if sizeCombinations == 1
for i = 1 : countCustomers
for j = 1 : maxSizeCustomers
x = subjectArray(i,j) + 1;
if isnan(x), break; end
list(x+1) = list(x+1) + 1;
end
end
else
for i = 1:countCombinations
logical = zeros(size(subjectArray));
for j = 1:sizeCombinations
logical = logical + (subjectArray == combinations(i,j));
end
list(i) = sum(sum(logical,2) == sizeCombinations);
end
end
end
Спасибо за поддержку!
Можете ли вы объяснить концептуально, как вы получаете 'often_itemsets'? – Oleg
С помощью приведенного выше алгоритма я определяю, насколько частым является количество элементов в данных, затем я удаляю все неточные элементы. В примере игрушки, например, 0-4 и 8-12. затем я создаю все возможные комбинации оставшихся и снова запускаю алгоритм. В примере с игрушками: 5,6 5,7 6,7 –
О да: то, что я также делаю, заключается в сокращении данных после этого, так что мне не нужно просматривать элементы, которые не содержат частых наборов предметов снова и снова. –