【问题标题】:Dimension reduction for logical arrays逻辑数组的降维
【发布时间】:2014-11-13 15:21:52
【问题描述】:

我在两个不同的时间点测量了 5 台设备。测量基本上由对应于相应位置的位值的 1 和 0 数组组成:

whos measurement1_dev1_time1

Name                         Size               Bytes  Class      Attributes

measurement1_dev1_time1      4096x8             32768  logical

我假设对于特定设备,测量时间 1 和 2 之间的变化是唯一的。但是,由于我在不同位置处理 32768 位,因此很难想象是否存在某种依赖关系。

因为x位置的每一位都可以看作是观察的一个维度,我认为使用 PCA 来减少维度的数量。

因此,对于 5 台设备中的每台设备:

  1. 我在 t1t2 点分别随机抽样 n 测量值
  2. 我准备了一个数组作为pca() 的输入,其中包含m*n 列(m
  3. 在这个数组 A 上,我计算 pca:``[coeff score latent] = pca(zscore(A))```
  4. 然后我尝试使用biplot 将其可视化:biplot(coeff(:,1:2), 'score', score(:,1:2))

但是,这给了我非常奇怪的结果。也许 PCA 不是解决这个问题的正确方法?我还修改了输入数据以不在逻辑位数组本身上执行 PCA。相反,我创建了一个向量,它保存原始测量数组中存在“1”的索引。这也会产生奇怪的结果。

由于我对 PCA 完全陌生,所以我想问您是否发现过程中存在缺陷,或者 PCA 是否不适合我的目标,我最好寻找其他降维方法或聚类算法。

【问题讨论】:

  • 也许可以在这里试试:datascience.stackexchange.com
  • 谢谢,我会在那里转贴!
  • 有 5 个设备(尽管数量可以增加)。我更新了原始线程。

标签: matlab pca dimension-reduction


【解决方案1】:

这种“某种依赖”是否只是数据点的成对相关?或者你想知道什么?

如果这样做,你会得到“预期结果”吗:

meas_norm = 2*measurement1_dev1_time1 - 1;

CovarianceMatrix = meas_norm' * meas_norm;

figure
pcolor(CovarianceMatrix )

会不会是数据类型的问题?尝试喂double(data)。 (请在您的示例中添加正确的代码)

如果你寻找降维,也可以考虑ICA


更新: 你能用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)

【讨论】:

  • 我期望的相关性如下:给定一个特定的设备和在时间 t 的 n 次测量,超过 90% 的位在它们的各个位置对于 n 次测量将是相同的(因此,将是 10% 的噪声,即位翻转)。但是,稳定位的位置以及它们的首选值(0 或 1)将分别从 t1 变为 t2 用于设备。我想形象化这种变化的独特性。因此,您使用 CovarianceMatrix 编码并不能表达我想要表达的内容。我将研究 ICA 并添加一些代码。非常感谢。
  • 这取决于您所说的我的数据点之间的成对相关性:实际上,预期的相关性总是在点 t1 处测量的第 i 个数据点和第 i 个数据点之间t2 点的测量值。但是,仅查看所有数据点就可以发现 t1 和 t2 之间的特征,这对于单个设备来说是独一无二的。
  • 更新代码有问题:stable_points_before 未定义。应该是: stable_points_before = all(meas_before, 2) |全部(~meas_before, 2);
  • 完全正确,就像'*after'
猜你喜欢
  • 2021-02-13
  • 2017-02-02
  • 2012-06-08
  • 2017-02-23
  • 1970-01-01
  • 1970-01-01
  • 2019-02-28
  • 1970-01-01
  • 2013-10-06
相关资源
最近更新 更多