2014-11-05 8 views
1

Сообщество Hello StackOverflow,MATLAB - Как сравнить и присвоить значение кластеру из набора данных?

Мне нелегко обернуть голову вокруг проблемы, с которой я сталкиваюсь в MATLAB.

У меня есть матрица, которая выглядит следующим образом:

enter image description here

Это кластерная таблица с очень большим набором данных.

У меня есть вторичный стол, который также очень большой и составляет 5000x4. Эта вторая таблица содержит только целые числа. Как сделать программное обеспечение сопоставлять значения из столбцов 1 через 3 в этой вторичной таблице со значениями из первой таблицы, а затем сделать код решающим, в каком кластере будут использоваться значения из второй таблицы, в зависимости от того, какая комбинация значений, наиболее близкая к ?

Например, вторичная таблица имеет строку со значениями 141, 162, 239, 1. Посмотрев на это, я могу сказать, что он принадлежит в строке 1 таблицы кластеров. Но я не могу пройти тысячи строк, проверяя их вручную.

Столбец 4 можно пренебречь, поскольку он будет использоваться для других целей. Если я как-то неясен в вопросе, пожалуйста, дайте мне знать, мне сложно объяснить на английском языке. Любые советы будут оценены.

ответ

1

Вы могли группироваться с точки зрения минимального расстояния L2:

d = sqrt(bsxfun(@plus, sum(A.*A,2), sum(B.*B,2)') - 2 * A*B.').' 
[~,ic] = min(d,[],1) 

Переменная ic содержит номер кластера (индекс Ближайшее Роу в B) для каждой строки A.

(. Обрежьте столбец 4, а затем вычислить выше)

Пример 4 колонки:

>> B = randi(255,3,4) 

B = 

    255 164 195 120 
    59 27 206 56 
    235 69 27 236 

>> A = B(randi(3,10,1),:) + randi(20,10,4) - 10 

A = 

    259 163 195 116 
    226 61 25 228 
    255 160 195 121 
    69 29 210 62 
    248 167 205 116 
    260 173 187 115 
    62 37 212 53 
    237 61 29 236 
    255 168 204 125 
    237 72 20 237 

>> d = sqrt(bsxfun(@plus, sum(A.*A,2), sum(B.*B,2)') - 2 * A*B.').'; 
>> [~,ic] = min(d,[],1) 
ic = 

    1  3  1  2  1  1  2  3  1  3 

Вы также можете использовать pdist2 с любым другим расстоянием метрическую вам нравится, или использовать bsxfun с более знакомы формулировка:

d = squeeze(sqrt(sum(bsxfun(@minus,A,permute(B,[3 2 1])).^2,2))); 

Или kmeans ...

Reference 1 и 2.

+0

Это было здорово. Насколько я понял, я работал. Тем не менее, я думал, что это будет довольно легко взять оттуда, и я ошибся. Мне плохо, когда я поднимаю еще одну тему, связанную с этим. Скажем, теперь у меня есть переменная {ic}, целые числа в ней варьируются от 1 до 5. Как я могу сказать, что если значение {ic} равно 1 или 4, чтобы добавить +1 к переменной N и если это 1 или 4, чтобы увидеть, представляет ли оно значение 1 в столбце 4 столбца A? Я предполагаю, что мне нужно использовать цикл for, но я не могу его обработать. – Agito

+0

Недостаточно времени для редактирования ... Продолжение - Должна быть связь между значениями ic и строками A. Поэтому, если значение ic равно 1 или 4, и оно представляет строку из A, столбец 4 которой равен 1 , – Agito