Уменьшение размеров для логических массивов
У меня есть измерения 5 устройств в двух разных точках времени. Измерение в основном состоит из массива единиц и нулей, соответствующих значению бита в соответствующем местоположении:
whos measurement1_dev1_time1
Name Size Bytes Class Attributes
measurement1_dev1_time1 4096x8 32768 logical
Я предполагаю, что для конкретного устройства изменения между временем 1 и 2 измерений являются уникальными. Однако, поскольку я имею дело с 32768 битами в разных местах, довольно сложно представить, есть ли какая-то зависимость.
Как каждый бит на месте x
можно рассматривать как одно измерение наблюдения, я подумал, чтобы использовать PCA, чтобы уменьшить количество измерений.
Таким образом, для каждого из 5 устройств:
- Я случайный образец
n
измерения в точкеt1
а такжеt2
seperatly - Я готовлю массив в качестве ввода для
pca()
сm
*n столбцов (m
<32768; это подмножество всех наблюдаемых битов, поскольку исходные данные могут быть слишком большими для pca) и 4 строки (по одной строке для каждого устройства). - На этом массиве
A
Я вычисляю pca: ``[коэффициент латентного счета] = pca(zscore(A))``` - Затем я пытаюсь визуализировать это с помощью
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)