我在两个不同的时间点测量了5个设备。测量基本上由一个1和0的数组组成,对应于相应位置的位值:
whos measurement1_dev1_time1
Name Size Bytes Class Attributes
measurement1_dev1_time1 4096x8 32768 logical
我认为对于特定设备,测量时间1和2之间的变化是唯一的。但是,由于我在不同位置处理32768位,因此很难想象是否存在某种依赖性。
由于位置x
的每一位都可视为观察的一个维度,我认为使用PCA来减少维数。
因此,对于5个设备中的每一个:
n
和t1
分别随机抽样t2
次pca()
的输入m
* n列(m
< 32768;它是所有观察位的子集,因为原始数据可能也是pca)和4行(每个设备一行)。A
上我计算了pca:``[coeff score latent] = pca(zscore(A))````biplot
:biplot(coeff(:,1:2), 'score', score(:,1:2))
但是,这给了我很奇怪的结果。也许PCA不是解决这个问题的正确方法?我还修改了输入数据以进行PCA而不是逻辑位数组本身。相反,我创建了一个向量,它保存原始测量数组中存在“1”的索引。这也会产生奇怪的结果。
由于我对PCA完全陌生,我想问你是否要么看到这个过程中的缺陷,或者PCA是不是我的目标的正确方法,我最好寻找其他降维方法或聚类算法。< / p>
答案 0 :(得分: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)