Определите, насколько отличаются некоторые векторы - PullRequest
6 голосов
/ 21 февраля 2011

Я хочу дифференцировать векторы данных, чтобы найти те, которые похожи.Например:

A=[4,5,6,7,8];
B=[4,5,6,6,8];
C=[4,5,6,7,7];

D=[1,2,3,9,9];
E=[1,2,3,9,8];

В предыдущем примере я хочу различить, что векторы A, B, C похожи (не совпадают) друг на друга, а D, E подобны друг другу.Результат должен быть примерно таким: A, B, C похожи, D, E похожи, но группа A, B, C не похожа на группу D, E.Matlab может это сделать?Я думал об использовании некоторого алгоритма классификации или Kmeans, ROC и т. Д., Но я не уверен, какой из них будет лучшим.

Есть предложения?Заранее спасибо

Ответы [ 4 ]

10 голосов
/ 21 февраля 2011

Один из моих новых любимых методов для такого рода вещей - агломерационная кластеризация .

Сначала объедините все ваши векторы в матрицу, где каждая строка представляет собой отдельный вектор.Это значительно упрощает использование таких методов:

F = [A; B; C; D; E];

Затем можно найти связи:

Z = linkage(F, 'ward', 'euclidean');

Это можно построить с помощью:

dendrogram(Z);

enter image description here

Это показывает дерево, где каждый лист внизу является одним из исходных векторов.Длина ветвей показывает сходство и различие.

Как видите, 1, 2 и 3 показаны очень близкими, равно как 4 и 5. Это даже дает меру близости и показывает, что векторы1 и 3 считаются ближе, чем векторы 2 и 3 (в том смысле, что в процентном отношении 7 ближе к 8, чем 6 к 7).

2 голосов
/ 21 февраля 2011

Если все сравниваемые векторы имеют одинаковую длину, вполне может быть достаточно подходящей нормы для парных разностей.Конечно, выбранная норма будет зависеть от ваших конкретных критериев близости, но с примерами, которые вы показываете, простое суммирование абсолютных значений компонентов парных разностей дает:

  A B C  D  E
A 0 1 1 12 11
B   0 2 13 12
C     0 13 12
D       0  1
E          0

, что ненужен особенно хорошо настроенный порог для работы.

1 голос
/ 07 марта 2011

Вот решение, которое я предлагаю на основе ваших результатов:

Z = [A;B;C;D;E];
Y = pdist(Z);
matrix = SQUAREFORM(Y);
matrix_round = round(matrix);

Теперь, когда у нас есть вектор, мы можем установить пороговое значение, основанное на значении maximun, и решить, какое из них является наиболее подходящим.

Было бы неплохо создать кластерный график, показывающий различия между ними.

С уважением

1 голос
/ 21 февраля 2011

Вы можете использовать pdist () , эта функция дает вам попарные расстояния.

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

...