You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Matlab中用rangesearch函数处理异尺度X、Y数据的欧氏距离最近邻查询

解决Matlab中rangesearch处理不同尺度数据的最近邻问题

你遇到的这个问题非常典型——当特征(这里是X和Y列)的尺度差异悬殊时,直接用欧氏距离计算最近邻会被大尺度的特征“主导”,导致结果完全不符合实际需求。比如你的数据里,Y的范围是40-100,X只有1.5-5.5,Y的数值变化幅度是X的十几倍,欧氏距离里Y的权重会远远超过X,找出来的最近邻可能只是Y值接近,但X值相差极大,这显然不是你想要的结果。

核心解决方案:先标准化数据

解决思路很直接:先把所有特征缩放到相同尺度,再计算距离。常用的标准化方法有两种,你可以根据数据分布和需求选择:


方法1:Min-Max归一化(缩放到0-1范围)

这种方法会把每个特征的数值映射到[0,1]区间,保留原始数据的相对分布,适合对数据范围有明确要求的场景。

% 加载你的数据
fData = [3.6 79; 1.8 54; 3.333 74; 2.283 62; 4.533 85; 2.883 55; 4.7 88; 3.6 85; 1.95 51; 4.35 85; 1.833 54; 3.917 84; 4.2 78];

% 提取X和Y列
X_col = fData(:,1);
Y_col = fData(:,2);

% 执行Min-Max归一化
X_norm = (X_col - min(X_col)) / (max(X_col) - min(X_col));
Y_norm = (Y_col - min(Y_col)) / (max(Y_col) - min(Y_col));

% 组合成标准化后的数据集
fData_norm = [X_norm, Y_norm];

% 调用rangesearch:以第一个数据点为例,搜索归一化尺度下半径0.1的最近邻
[idx, dist] = rangesearch(fData_norm, fData_norm(1,:), 0.1, 'Distance', 'euclidean');

% 输出结果
disp('符合条件的最近邻索引(对应原始数据行):');
disp(idx{1});
disp('对应的归一化距离:');
disp(dist{1});

方法2:Z-Score标准化(均值为0,方差为1)

这种方法会让每个特征的均值为0、标准差为1,能有效减少极端值的影响,适合数据近似正态分布的场景。

% 加载数据(同上)
fData = [3.6 79; 1.8 54; 3.333 74; 2.283 62; 4.533 85; 2.883 55; 4.7 88; 3.6 85; 1.95 51; 4.35 85; 1.833 54; 3.917 84; 4.2 78];

% 一步完成Z-Score标准化
fData_norm = zscore(fData);

% 调用rangesearch:搜索所有数据点在Z-Score尺度下半径1的最近邻
[idx, dist] = rangesearch(fData_norm, fData_norm, 1, 'Distance', 'euclidean');

% 遍历输出每个点的最近邻
for i = 1:size(fData,1)
    fprintf('第%d个数据点的最近邻索引:%s\n', i, num2str(idx{i}));
end

关键注意事项

  • 如果你需要将归一化后的距离转换回原始尺度,可以提前记录下归一化参数(比如Min-Max的min/max值,或者Z-Score的均值/标准差),进行逆向计算。
  • 两种标准化方法的选择:Min-Max保留了原始数据的相对位置,Z-Score更适合处理存在极端值的数据。
  • 无论选择哪种距离类型(欧氏、曼哈顿等),先标准化都是处理不同尺度特征的必要前提,否则任何依赖数值大小的距离计算都会有偏差。

内容的提问来源于stack exchange,提问作者amjay

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:38:37