Хорошо, я опишу то, что я пытаюсь достичь, и как я пытался достичь этого, тогда я объясню, почему я попробовал этот метод.
У меня есть данные из Кубка KDD 1999 в исходном формате, данныеимеет 494 тыс. строк с 42 столбцами.
Моя цель - попытаться кластеризовать эти данные без присмотра.Из предыдущего вопроса здесь:
кластеризация и Matlab
Я получил этот отзыв:
Для начала вам нужно нормализовать атрибутыбыть в том же масштабе: при вычислении евклидова расстояния как части шага 3 в вашем методе объекты со значениями, такими как 239 и 486, будут доминировать над другими объектами с небольшими значениями, равными 0,05, тем самым нарушая результат.
Еще один момент, о котором следует помнить, это то, что слишком много атрибутов может быть плохой вещью (проклятие размерности).Таким образом, вам следует изучить методы выбора элементов или уменьшения размерности.
Итак, первое, что я сделал, - это выбор элементов, относящийся к этой статье: http://narensportal.com/papers/datamining-classification-algorithm.aspx#_sec-2-1
и выглядит так после выбора необходимых функций:
Итак, для кластеризации я удалил дискретные значения, которые оставили меня с 3 столбцами с числовыми данными, а затем приступил к удалениюдубликаты строк: мусор, индекс и уникальность в матрице (как сохранить формат матрицы) в файле, который уменьшил 3 столбца с 494k до 67k, что было сделано следующим образом:
[M,ind] = unique(data, 'rows', 'first');
[~,ind] = sort(ind);
M = M(ind,:);
Затем я использовал случайную перестановку, чтобы уменьшить размер файла с 67k до 1000 следующим образом:
m = 1000;
n = 3;
%# pick random rows
indX = randperm( size(M,1) );
indX = indX(1:m);
%# pick random columns
indY = randperm( size(M,2) );
indY = indY(1:n);
%# filter data
data = M(indX,indY)
Итак, теперь у меня есть файл с тремя выбранными мной функциями, я удалил дубликаты записей и использовалслучайная перестановка для дальнейшего уменьшения набора данных моей последней целью было нормализовать эти данные, и я сделал это с помощью:
normalized_data = data/norm(data);
Затем я использовал tон следует сценарию K-означает:
%% generate clusters
K = 4;
%% cluster
opts = statset('MaxIter', 500, 'Display', 'iter');
[clustIDX, clusters, interClustSum, Dist] = kmeans(data, K, 'options',opts, ...
'distance','sqEuclidean', 'EmptyAction','singleton', 'replicates',3);
%% plot data+clusters
figure, hold on
scatter3(data(:,1),data(:,2),data(:,3), 50, clustIDX, 'filled')
scatter3(clusters(:,1),clusters(:,2),clusters(:,3), 200, (1:K)', 'filled')
hold off, xlabel('x'), ylabel('y'), zlabel('z')
%% plot clusters quality
figure
[silh,h] = silhouette(data, clustIDX);
avrgScore = mean(silh);
%% Assign data to clusters
% calculate distance (squared) of all instances to each cluster centroid
D = zeros(numObservarations, K); % init distances
for k=1:K
%d = sum((x-y).^2).^0.5
D(:,k) = sum( ((data - repmat(clusters(k,:),numObservarations,1)).^2), 2);
end
% find for all instances the cluster closet to it
[minDists, clusterIndices] = min(D, [], 2);
% compare it with what you expect it to be
sum(clusterIndices == clustIDX)
Но мои результаты все еще выходят как мой первоначальный вопрос, который я задал здесь: кластеризация и Matlab
Вот чтопри построении графика данные выглядят так:
и:
Может кто-нибудь помочь решить эту проблему, методы, которые я используюне правильные методы или что-то мне не хватает?