我有一个庞大的数据集,X
包含调查对象的人口统计信息。数据在很大程度上是分类的,因此其中的每一行都X
包含一组字符串值的特征,例如单个受访者的性别、种族、兴趣等。的每一列X
都是一个响应类别。我已将此数据集加载到 MATLAB/Octave 中的一个大单元格数组中(两者都进行了测试)。我想测量数据集中每个样本与每个其他样本之间的 Jaccard 距离。基本上我想做的是:
dist = zeros(size(X,1)); % Initialize my distance matrix
for ii = 1:size(X,1)
for jj = ii:size(X,1) % Only need the upper triangle since dist is symmetric
% Find the Jaccard distance between the ii-th and jj-th respondent
dist(ii,jj) = 1 - numel(intersect(X(ii,:), X(jj,:))) / numel(union(X(ii,:), X(jj,:)));
end
end
除了显然我想对代码进行矢量化。我曾尝试使用cellfun
andbsxfun
进行矢量化,但是当我执行以下操作时:
res = cellfun('intersect', X, X, 'UniformOutput', false);
我得到一个与 大小相同的单元格数组X
,其中 (i,j) 元素等效于intersect(X(i,j), X(i,j))
; 基本上是 (ij) 单元格中的唯一字符。这对我没有帮助。当我尝试:
res = bsxfun('intersect', X, X);
我得到一个包含(我认为)任何单元格所X
采用的所有唯一值的长单元格数组。这对我也没有帮助。
我想要一个解决方案,使我能够在讨论开始时对代码进行矢量化。如果这样做更容易,那么找到X
与任何一行中的最小(或最大)Jaccard 距离的子集的代码X
将正是我所需要的。
提前致谢!
编辑:将循环代码更改为仅计算dist
. 仍然需要很长时间,而且它是非矢量化的事实在哲学层面上困扰着我。
编辑:X
通过键入给出的第一个元素X(1,:)
是:
ans =
{
[1,1] = Non - U.S. Citizen
[1,2] = Denied
[1,3] = M
[1,4] = CHINA
[1,5] = Full Time
[1,6] = D-Asian American or Pacific Islander
[1,7] =
[1,8] =
[1,9] = MSME
[1,10] =
}
这只是在我等待实际调查结果时用于开发算法的测试数据,但调查结果将具有类似的形式。
编辑:来自 CSV 格式的更多数据X
如下:
Non - U.S. Citizen,Denied,M,INDIA,Full Time,E-Other,,,MSME,
Non - U.S. Citizen,Denied,F,INDIA,Full Time,D-Asian American or Pacific Islander,,,MSME,DESIGN
Non - U.S. Citizen,Denied,M,INDIA,Full Time,E-Other,,,MS,
Non - U.S. Citizen,Denied,M,IRAN,Full Time,B-Caucasian American Non-Hispanic,,,PhD,NANO
Non - U.S. Citizen,Left Without Degree,M,JORDAN,Full Time,E-Other,,,,
Non - U.S. Citizen,Denied,F,IRAN,Full Time,E-Other,,,PhD,BIOENG
,Not Attending,M,,Full Time,,,,PhD,
Non - U.S. Citizen,Not Attending,F,IRAN,Full Time,I-International Student,,,PhD,
Non - U.S. Citizen,Denied,M,BANGLADESH,Full Time,E-Other,,,PhD,NANO
Non - U.S. Citizen,Denied,M,BANGLADESH,Full Time,E-Other,,,MS,