Matlab中knnsearch的k值设置及分类结果异常问题
问题解答
关于knnsearch的默认k值
是的,Matlab中的knnsearch函数默认k值为1,未指定'K'参数时,仅返回每个查询点最近的1个邻居索引。
修改k=5后无分类结果的解决方法
修改后失效的核心原因是:当k=5时,knnsearch返回的result是1×5的索引数组,而非单个数值,原有的if-else判断逻辑仅适用于单值场景,无法匹配数组输入。
具体修复步骤如下:
- 为训练样本添加类别标签
先给每组训练数据分配对应标签,方便后续投票统计:% 给80个训练样本分配类别标签 training_labels = zeros(80,1); training_labels(1:20) = 1; % Raw对应标签1 training_labels(21:40) = 2; % Undercook对应标签2 training_labels(41:60) = 3; % Cook对应标签3 training_labels(61:80) = 4; % Rotten对应标签4 - 基于k个邻居的标签做投票
提取k个邻居的标签,统计出现次数最多的标签作为最终分类结果:k = 5; result = knnsearch(training,Z,'K',k); % 获取k个邻居对应的类别标签 neighbor_labels = training_labels(result); % 统计出现频率最高的标签 [~,most_freq_label] = mode(neighbor_labels); - 根据投票结果更新显示
将原有的单值判断逻辑改为基于投票标签的分支:switch most_freq_label case 1 set(handles.EditBox,'string','Raw'); case 2 set(handles.EditBox,'string','Undercook'); case 3 set(handles.EditBox,'string','Cook'); case 4 set(handles.EditBox,'string','Rotten'); end
额外优化:原代码中training变量的拼接可以简化为training = training1(:,1:24);,无需逐个列手动拼接,代码更简洁。
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

