Найти группы с высокой кросс-корреляционной матрицей в Matlab

Учитывая нижнюю треугольную матрицу (100x100), содержащую кросс-корреляцию значения, где entry 'ij' - это значение корреляции между сигналом 'i' и 'j', и поэтому высокое значение означает, что эти два сигнала принадлежат тот же класс объектов и зная, что не более четырех различных классы в наборе данных, кто-то знает быстрый и эффективный способ классифицировать данные и назначать все сигналы 4 различным классы, а не поиск и перекрестный контроль всех записей против друг друга? Следующая матрица 7x7 может помочь проиллюстрировать точка:

 1      0       0       0       0       0       0
.2      1       0       0       0       0       0
.8      .15     1       0       0       0       0
.9      .17     .8      1       0       0       0
.23     .8      .15     .14     1       0       0
.7      .13     .77     .83.    .11     1       0
.1      .21     .19     .11     .17     .16     1

в этом примере есть три класса:

class 1: rows <1 3 4 6>,
class 2: rows <2 5>,
class 3: rows <7>

Ответ 1

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

Сначала вам нужно преобразовать матрицу корреляции в матрицу dissimilarity. Поскольку корреляция между 0 и 1, 1-correlation будет работать хорошо - высокие корреляции получают оценку, близкую к 0, а низкие корреляции получают оценку, близкую к 1. Предположим, что корреляции хранятся в массиве corrMat

%# remove diagonal elements
corrMat = corrMat - eye(size(corrMat));
%# and convert to a vector (as pdist)
dissimilarity = 1 - corrMat(find(corrMat))';

%# decide on a cutoff
%# remember that 0.4 corresponds to corr of 0.6!
cutoff = 0.5; 

%# perform complete linkage clustering
Z = linkage(dissimilarity,'complete');

%# group the data into clusters
%# (cutoff is at a correlation of 0.5)
groups = cluster(Z,'cutoff',cutoff,'criterion','distance')
groups =
     2
     3
     2
     2
     3
     2
     1

Чтобы подтвердить, что все отлично, вы можете визуализировать дендрограмму

dendrogram(Z,0,'colorthreshold',cutoff)

enter image description here

Ответ 2

Вы можете использовать следующий метод вместо создания матрицы несходства.

Z = linkage(corrMat,'complete','correlation')

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

dendrogram(Z);

Один из способов проверить правильность вашей дендрограммы - проверить ее максимальную высоту, которая должна соответствовать 1-min(corrMat). Если минимальное значение в corrMat равно 0, максимальная высота вашего дерева должна быть 1. Если минимальное значение равно -1 (отрицательная корреляция), высота должна быть 2.

Ответ 3

Поскольку дается, что будут 4 группы, я бы начал с довольно упрощенного двухэтапного подхода.

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

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

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