Уменьшение размеров для логических массивов

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

whos measurement1_dev1_time1

Name                         Size               Bytes  Class      Attributes

measurement1_dev1_time1      4096x8             32768  logical

Я предполагаю, что для конкретного устройства изменения между временем 1 и 2 измерений являются уникальными. Однако, поскольку я имею дело с 32768 битами в разных местах, довольно сложно представить, есть ли какая-то зависимость.

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

Таким образом, для каждого из 5 устройств:

  1. Я случайный образец n измерения в точке t1а также t2 seperatly
  2. Я готовлю массив в качестве ввода для pca() с m*n столбцов (m<32768; это подмножество всех наблюдаемых битов, поскольку исходные данные могут быть слишком большими для pca) и 4 строки (по одной строке для каждого устройства).
  3. На этом массиве A Я вычисляю pca: ``[коэффициент латентного счета] = pca(zscore(A))```
  4. Затем я пытаюсь визуализировать это с помощью biplot: biplot(coeff(:,1:2), 'score', score(:,1:2))

Однако это дает мне действительно странные результаты. Может быть, PCA не подходит для этой проблемы? Я также изменил входные данные, чтобы PCA не входил в сам массив логических битов. Вместо этого я создал вектор, в котором содержатся индексы, в которых есть "1" в исходном массиве измерений. Также это дает странные результаты.

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

1 ответ

Может ли эта "какая-то зависимость" быть просто парной корреляцией ваших точек данных? Или что ты хочешь узнать?

Получаете ли вы "ожидаемые результаты", если вы делаете:

meas_norm = 2*measurement1_dev1_time1 - 1;

CovarianceMatrix = meas_norm' * meas_norm;

figure
pcolor(CovarianceMatrix )

Может ли быть проблема типа данных? Попробуйте кормить double(data), (Пожалуйста, добавьте правильный код в ваш пример)

если вы ищете сокращение размеров, вы также можете подумать о ICA.


UPD: можете ли вы проверить это с xor? Как вы не можете сделать xor на строки или столбцы, вы можете обмануть all(x, dimension)

example = imread('cameraman.tif')>128;

meas_points = numel(example);
num_sensors = 4;

%// simulate data for t1
meas_before = repmat(example(:), 1, num_sensors);
flickering_before = (rand(meas_points, num_sensors)<0.001);
meas_before(flickering_before) = ~meas_before(flickering_before);

%// simulate position of changing pixels, let's say 8%
true_change = (rand(num_sensors,1)<0.08);

%// simulate data for t2    
meas_after = repmat(example(:), 1, num_sensors);
meas_after(true_change) = ~meas_after(true_chage);
flickering_after = (rand(meas_points, num_sensors)<0.001);
meas_after(flickering_after) = ~meas_after(flickering_after);

stable_points_after = all(meas_after, 2) | all(~meas_after, 2);
stable_point_fraction = sum(stable_points_after)./ meas_points;

%// similarly for the states before (i.e. t1)
stable_points_before = all(meas_before, 2) | all(~meas_before, 2);   

%// now see which change coherently
stable_chage = meas_after(stable_points_after, 1) & meas_before(stable_points_before, 1)
Другие вопросы по тегам