2013-06-20 9 views
-3

У меня есть набор данных 6x1000 двоичных данных (6 точек данных, 1000 булевых измерений).Как визуализировать двоичные данные?

я выполнить кластерный анализ на нем

[idx, ctrs] = kmeans(x, 3, 'distance', 'hamming'); 

И я получаю три кластера. Как я могу визуализировать свой результат?

У меня есть 6 строк данных, каждый из которых имеет 1000 атрибутов; 3 из них должны быть одинаковыми или похожими. Применение кластеризации покажет кластеры. Поскольку я знаю количество кластеров Мне нужно найти только похожие строки. Расстояние Хэмминга показывает нам сходство между строками, и результат верен, что есть 3 кластера.

[EDIT: для любых разумных данных, kmeans всегда находит спросил номер кластеров]

Я хочу взять эти знания и сделать его легко наблюдать и понятно, без необходимости писать огромные объяснения ,

Пример Matlab не подходит, поскольку он касается числовых 2D-данных, в то время как мои вопросы касаются n-мерных категориальных данных.

Набор данных здесь http://pastebin.com/cEWJfrAR

[EDIT1: как проверить, если кластеры значимы]

Для получения дополнительной информации, пожалуйста, посетите следующую ссылку: http://chat.stackoverflow.com/rooms/32090/discussion-between-oleg-komarov-and-justcurious

Если вопрос непонятен, спросите, за все, что вам не хватает.

+2

Какую часть примера в документации из 'kmeans() 'вам не нравится? – Oleg

+0

plot (X (idx == 1,1), X (idx == 1,2), 'r.', 'MarkerSize', 12) провести на сюжет (X (idx == 2,1), X (idx == 2,2), 'b.', 'MarkerSize', 12) plot (ctrs (:, 1), ctrs (:, 2), 'kx', ... 'MarkerSize', 12, 'LineWidth', 2) plot (ctrs (:, 1), ctrs (:, 2), 'ko', ... 'MarkerSize', 12, 'LineWidth', 2) легенда ('Cluster 1 ',' Cluster 2 ',' Centroids ', ... «Местоположение», «NW») относится к двумерным данным с X = [randn (100,2) + единиц (100,2); ... randn (100,2) -онов (100,2)]; который далек от того, что у меня есть ... Это то, что вы имеете в виду? – JustCurious

+0

Попробуйте использовать «шпион» и поместите центроиды кластера. – Oleg

ответ

5

Вы можете начать визуализации данных с помощью «штрих-код» сюжета, а затем маркировки строк с кластерной группе они принадлежат:

% Create figure 
figure('pos',[100,300,640,150]) 

% Calculate patch xy coordinates 
[r,c] = find(A); 
Y = bsxfun(@minus,r,[.5,-.5,-.5, .5])'; 
X = bsxfun(@minus,c,[.5, .5,-.5,-.5])'; 

% plot patch 
patch(X,Y,ones(size(X)),'EdgeColor','none','FaceColor','k'); 

% Set axis prop 
set(gca,'pos',[0.05,0.05,.9,.9],'ylim',[0.5 6.5],'xlim',[0.5 1000.5],'xtick',[],'ytick',1:6,'ydir','reverse') 

% Cluster 
c = kmeans(A,3,'distance','hamming'); 

% Add lateral labeling of the clusters 
nc = numel(c); 
h = text(repmat(1010,nc,1),1:nc,reshape(sprintf('%3d',c),3,numel(c))'); 
cmap = hsv(max(c)); 
set(h,{'Background'},num2cell(cmap(c,:),2)) 

enter image description here

+0

Код штрих-кода Nice –

+0

Но это также показывает, что его трудно узнать, осмотрев его визуально. –

+0

@Hugues Точно, поэтому мне лично очень понравилась дендрограмма. – Oleg

6

для представления различия между многомерных векторов или кластеров, я использовал функцию Matlab dendrogram. Например, после загрузки вашего набора данных в матрицу x я побежал следующий код:

l = linkage(a, 'average'); 
dendrogram(l); 

и получил следующий сюжет:

Dendrogram plot of your dataset

Высота панели, которая соединяет две группы узлов представляет собой среднее расстояние между членами этих двух групп. В этом случае это выглядит как (5 и 6), (1 и 2) и (3 и 4) сгруппированы.

Если вы предпочитаете использовать расстояние Хэмминга, а не расстояние евклидова (который linkage делает по умолчанию), то вы можете просто сделать

l = linkage(x, 'average', {'hamming'}); 

хотя это мало что меняет для сюжета.

+3

+1 Сегодня я кое-что узнал. – Oleg

4

Определение

расстояние Хэмминга для двоичных строк а и б расстояние Хэмминга равно числу единиц (количество населения) в XOR б (см Hamming distance).

Решение

Поскольку у вас есть шесть строк данных, так что вы можете создать 6 по 6 матрице, заполненной с расстоянием Хэмминга. Матрица будет симметричной (расстояние от a до b совпадает с расстоянием от b до a), а диагональ равна 0 (расстояние до a до nUL).

Например, расстояние Хэмминга между первой и второй струны:

hamming_dist12 = sum(xor(x(1,:),x(2,:))); 

Loop, который и наполнит вашу матрицу:

hamming_dist = zeros(6); 
for i=1:6, 
    for j=1:6, 
    hamming_dist(i,j) = sum(xor(x(i,:),x(j,:))); 
    end 
end 

(И да, этот код является излишним, учитывая симметрию и нулевой диагональю, но вычисление минимально и оптимизация не стоит усилий).

Распечатайте свою матрицу как электронную таблицу в текстовом формате, и пусть читатель найдет, какая строка данных похожа на эту.

Это не использует подход «kmeans», но ваше добавленное описание проблемы помогло сформировать этот готовый ответ. Я надеюсь, что это помогает.


Результаты

0 182 481 495 490 500 
    182 0 479 489 492 488 
    481 479 0 180 497 517 
    495 489 180 0 503 515 
    490 492 497 503 0 174 
    500 488 517 515 174 0 

Редактировать 1:

Как читать таблицу? Таблица проста distance table. Каждая строка и каждый столбец представляют собой серию данных (здесь двоичная строка). Значение на пересечении строк 1 и столбца 2 является расстоянием Хэмминга между строкой 1 и строкой 2, которая равна 182. Расстояние между строками 1 и 2 такое же, как между строками 2 и 1, поэтому матрица симметрична ,


Анализ данных

Три кластеры могут быть легко идентифицированы: 1-2, 3-4 и 5-6, чье расстояние Хэмминга, соответственно, 182, 180 и 174. В кластер, данные имеют ~ 18% несходство. Напротив, данные, не являющиеся частью кластера, имеют ~ 50% несходство (это случайные данные двоичных данных).

+0

как сделал анализ данных? как вы выяснили классы? – JustCurious

+0

Я уточнил ** таблицу расстояний ** в моем ответе. –

0

Презентация

Я рекомендую Kohonen network или подобную технику, чтобы представить свои данные, скажем, в 2-х измерениях. В целом эта область называется Dimensionality reduction.

Я также могу пойти проще, например.Principal Component Analysis, но нет гарантии, что вы можете эффективно удалить размеры 9998: P

scikit-learn - хороший пакет Python, чтобы вы начали, аналогичные существуют в matlab, java, ect. Я могу заверить вас, что довольно легко реализовать некоторые из этих алгоритмов самостоятельно.

Касается

У меня есть беспокойство по поводу набора данных, хотя. 6 точек данных действительно небольшое число. кроме того, ваши атрибуты кажутся логичными на первый взгляд, если это так, расстояние на манхэттене, если вы используете. Я думаю (кто-то поправьте меня, если я ошибаюсь) Расстояние Хэмминга имеет смысл, если ваши атрибуты каким-то образом связаны, например. если атрибуты на самом деле являются бинарной строкой длиной 1000 бит, а не 1000 независимыми 1-битными атрибутами.

Кроме того, с 6 точками данных у вас есть только 2 ** 6 комбинаций, это означает, что 936 из 1000 атрибутов, которые у вас есть, действительно избыточны или неотличимы от избыточных.

K-means почти всегда находит столько кластеров, сколько вы просите. Чтобы проверить значимость ваших кластеров, запустите K-средство несколько раз с разными начальными условиями и проверьте, есть ли у вас одинаковые кластеры. Если вы получаете разные кластеры каждый раз или даже время от времени, вы не можете доверять своему результату.

0

Я использовал визуализацию типа штрих-кода для своих данных. Код, который был вывешен здесь ранее Олег был слишком тяжелым для моего решения (файлы изображения были более 500 кб), поэтому я использовал изображение(), чтобы цифры

function barcode(A) 
B = (A+1)*2; 
image(B); 
colormap flag; 

set(gca,'Ydir','Normal')  
axis([0 size(B,2) 0 size(B,1)]); 
ax = gca; 
ax.TickDir = 'out' 

end