2014-11-05 40 views
1

你好StackOverflow社区,MATLAB - 如何比较数据集中的值并将其分配给集群?

我很难包围我在MATLAB中遇到的问题。

我有一个矩阵,看起来像这样:

enter image description here

这是一个非常大的数据集簇表。

我有一个辅助表,它也非常大,是5000x4。这第二张表只包含整数。我该如何让软件比较此辅助表中的列13中的值与第一个表中的值,然后使代码根据哪个组合的值最接近第二个表中的值?

例如,辅助表有一行值为141, 162, 239, 1。通过查看它,我可以看出它属于群集表的第1行。但我无法通过数千行手动检查它。

4现在可以忽略不计,因为它将用于其他目的。如果我在这个问题上有些不清楚,请告诉我,我很难用英语解释。任何建议将被认真考虑。

回答

1

你可以集群中最小L2距离方面:

d = sqrt(bsxfun(@plus, sum(A.*A,2), sum(B.*B,2)') - 2 * A*B.').' 
[~,ic] = min(d,[],1) 

变量ic包含的A每一行的簇数(最接近行的索引B)。

(修剪过柱4,然后计算上述)

与4列实施例:

>> B = randi(255,3,4) 

B = 

    255 164 195 120 
    59 27 206 56 
    235 69 27 236 

>> A = B(randi(3,10,1),:) + randi(20,10,4) - 10 

A = 

    259 163 195 116 
    226 61 25 228 
    255 160 195 121 
    69 29 210 62 
    248 167 205 116 
    260 173 187 115 
    62 37 212 53 
    237 61 29 236 
    255 168 204 125 
    237 72 20 237 

>> d = sqrt(bsxfun(@plus, sum(A.*A,2), sum(B.*B,2)') - 2 * A*B.').'; 
>> [~,ic] = min(d,[],1) 
ic = 

    1  3  1  2  1  1  2  3  1  3 

也可以使用pdist2与任何其他距离度量你喜欢,或使用bsxfun与比较熟悉的配方:

d = squeeze(sqrt(sum(bsxfun(@minus,A,permute(B,[3 2 1])).^2,2))); 

或者kmeans ...

Reference 12

+0

这太棒了。就你所证明的那样,我的工作起到了作用。但是,我认为从这里拿到它会很容易,而且我错了。我对提出与此相关的另一个话题感到不满。 可以说现在我有一个{ic}变量,其中的整数范围从1到5.我怎么说,如果{ic}值等于1或4以将+1添加到变量N,并且if看看它是否代表数组A列4中的值1是1还是4?我假设我需要使用for循环,但我无法解决它。 – Agito 2014-11-06 11:55:23

+0

无法编辑...续 - ic值和A行之间必须有连接。因此,如果ic值为1或4,并且它代表来自A的行,而列4等于1 。 – Agito 2014-11-06 12:02:20