如何在Octave中手动生成pdist2函数的索引I?
替代MATLAB pdist2返回索引I的实现方法
MATLAB的pdist2函数支持返回[D, I],其中D是样本间的距离矩阵,I是对应最近邻(或指定k个邻居)的索引;但GNU Octave的pdist2仅能输出距离矩阵D。以下是手动生成索引I的方法:
示例数据
给定矩阵X:
X = [-0.2515 1.0451 -1.2817 -1.9741 0.2782 -1.0234 10.6772 10.7365 9.9264 8.7785 11.1680 9.5915 -34.2330 -30.8410 -31.7200 -32.6290 -31.7860 -31.2900 45.0000 43.0000 0 23.0000 -3.0000 2.0000];
通过D = pdist2(X, X, "euclidean")得到欧氏距离矩阵:
D = [0.0000000 1.9032127 18.4114208 17.3850403 55.6593018 55.0153084 61.7215919 23.8278294 1.9032127 0.0000000 19.7314529 18.6247940 54.3260574 53.7019653 63.5040855 25.3691425 18.4114208 19.7314529 0.0000000 1.9757286 74.0272751 73.3647156 48.1406441 20.0840893 17.3850403 18.6247940 1.9757286 0.0000000 72.9478302 72.3251266 49.1657410 21.4619255 55.6593018 54.3260574 74.0272751 72.9478302 0.0000000 1.9108551 112.8561935 72.0262222 55.0153084 53.7019653 73.3647156 72.3251266 1.9108551 0.0000000 112.2420197 70.9326706 61.7215919 63.5040855 48.1406441 49.1657410 112.8561935 112.2420197 0.0000000 51.0294037 23.8278294 25.3691425 20.0840893 21.4619255 72.0262222 70.9326706 51.0294037 0.0000000];
方法1:生成每个样本的最近邻索引(排除自身)
由于距离矩阵对角线是样本自身的距离(值为0),通常我们需要排除自身,找到其他样本中的最近邻:
% 将对角线(自身距离)设为无穷大,避免选中自己 D_no_self = D; D_no_self(1:size(D,1)+1:end) = Inf; % 提取每行最小值对应的索引,即最近邻索引 [min_dist, I] = min(D_no_self, [], 2);
运行后I的结果为:[2;1;4;3;6;5;3;6],对应每个样本的最近邻索引。
方法2:生成每个样本的k个最近邻索引
如果需要获取每个样本的前k个最近邻(例如k=2),可以通过排序实现:
k = 2; % 对每行距离排序,得到排序后的距离和对应索引 [sorted_D, sorted_I] = sort(D, 2); % 排除自身索引,提取前k个最近邻 I_k = cell(size(D,1), 1); for i = 1:size(D,1) % 过滤掉当前行的自身索引 non_self_idx = sorted_I(i, sorted_I(i,:) ~= i); % 取前k个索引 I_k{i} = non_self_idx(1:k); end
运行后I_k为单元格数组,每个元素是对应样本的前2个最近邻索引,例如第一行的结果是[2,4],对应距离最小的两个样本。
内容的提问来源于stack exchange,提问作者euraad
相关产品推荐
相关产品推荐

