Matlab:计算多维元胞数组的成对距离

Matlab: Calculating the pairwise distance for a multidimensional cell array

我有一个多维元胞数组attributes(763x6 元胞)。属性:

我没有语法错误。我的代码生成的距离矩阵 D 每行的值都相同。我不知道我的距离函数如何处理多行/实例。

D:

我的数据样本 5x6 单元格:

'low back pain risk factor staff'   'low back pain' 'low back pain risk factor staff'   'back pain pain risk factor epidemiology' 'spiritual comment comment care be' 'spiritual comment comment care be'
'psd psd antipsychotic essential receptor'  'ht ht 5'   'antipsychotic protein signal receptor drug'    'cell protein signal cell receptor' 'spiritual comment comment care be' 'spiritual comment comment care be'
'school of medicine'    'case western reserve university'   'antidepressant action 5 for in'    'ht ht 5' 'spiritual comment comment care be' 'spiritual comment comment care be'
'spiritual comment comment care be' 'heal holistic comment india india' 'heal religious mental disorder psychiatric symptom'    'heal religious mental disorder psychiatric psychiatric' 'spiritual comment comment care be' 'spiritual comment comment care be'

这不是解决方案,但是太长了,不适合作为评论。问题在于 pdist2 如何计算成对距离。

为了快速检查这一点,我们可以向它传递一个距离函数,它只打印出传递给它的 XIXJ 参数(当它从 pdist2 调用时):

X = {'foo1', 'foo2', 'foo3', 'foo4', 'foo5', 'foo6';...
     'bar1', 'bar2', 'bar3', 'bar4', 'bar5', 'bar6'};

% call distance function via pdist2
D = pdist2(X,X,@printArgsIn);

并且在函数文件中:

function D2 = printArgsIn(XI,XJ)
    disp('XI'); disp(XI);
    disp('XJ'); disp(XJ);

    D2 = 1;
end

这 return 如下:

XI
    'foo1'    'foo2'    'foo3'    'foo4'    'foo5'    'foo6'

XJ
    'foo1'    'foo2'    'foo3'    'foo4'    'foo5'    'foo6'

XI
    'foo1'    'foo2'    'foo3'    'foo4'    'foo5'    'foo6'

XJ
    'foo1'    'foo2'    'foo3'    'foo4'    'foo5'    'foo6'
    'bar1'    'bar2'    'bar3'    'bar4'    'bar5'    'bar6'

XI
    'bar1'    'bar2'    'bar3'    'bar4'    'bar5'    'bar6'

XJ
    'foo1'    'foo2'    'foo3'    'foo4'    'foo5'    'foo6'
    'bar1'    'bar2'    'bar3'    'bar4'    'bar5'    'bar6'

忽略第一个 XI, XJ 对(如果您详细查看 pdist2,您会看到距离函数被调用一次以测试它是否有效),您可以看到它在观察 1 上调用了距离函数XI 反对 XJ.

的所有观察

换句话说,它希望您的距离函数能够处理多个 rows/instances 和 return 距离列向量。我没有详细查看您的距离函数,但我认为您不允许这样做。

问题出在你的距离函数上,当在第二个参数中给定多行时,它需要能够 return 多个距离,详见 [=16= 中的 table ].

它似乎也在处理由 regexp 生成的元胞数组错误。通过使用 cellfun 将单词元胞数组传递给 intersect,要求 intersect 函数比较不同单词中的字母。

我相信以下函数 returns 值具有预期的效果:

function D2 = intersection(XI,XJ)

wordsI = regexp(XI, '\s+', 'split');
wordsJ = regexp(XJ, '\s+', 'split');

D2 = zeros(size(XJ,1),1);
for i=1:numel(D2)
    D2(i) = sum(cellfun(@(wI,wJ) numel(intersect(wI,wJ)), wordsI, wordsJ(i,:)));
end