说明和使用方法
- trainData:包含特征和标签的训练数据集,标签应位于最后一列。
- testData:要分类的测试数据集,只包含特征。
- kValues:数组,指定每个WKNN模型使用的k值。
- featuresSets:一个单元数组,每个元素包含一个整数数组,指定每个模型使用的特征索引。
- (新手,代码仅供参考)
function label = multipleWKNN(trainData, testData, kValues, featuresSets)
% trainData: 训练数据,其中包含特征和标签
% testData: 测试数据特征
% kValues: 每个模型使用的k值数组
% featuresSets: 使用的特征子集索引数组
numModels = length(kValues);
numTests = size(testData, 1);
votes = zeros(numTests, max(trainData(:, end))); % 假设标签是1到max的整数
% 对每个模型进行循环
for m = 1:numModels
k = kValues(m);
features = featuresSets{m};
% 调用WKNN函数获取结果
modelLabels = WKNN(trainData(:, [features end]), testData(:, features), k);
% 累计投票
for i = 1:numTests
votes(i, modelLabels(i)) = votes(i, modelLabels(i)) + 1;
end
end
% 确定最终标签
[~, label] = max(votes, [], 2);
end
function label = WKNN(trainData, testData, k)
% 一个简单的加权KNN实现
trainFeatures = trainData(:, 1:end-1);
trainLabels = trainData(:, end);
numTests = size(testData, 1);
label = zeros(numTests, 1);
for i = 1:numTests
distances = sqrt(sum((trainFeatures - testData(i, :)).^2, 2));
[~, sortedIndices] = sort(distances);
nearestNeighbors = trainLabels(sortedIndices(1:k));
weights = 1 ./ distances(sortedIndices(1:k)); % 权重为距离的倒数
% 加权投票
weightedVotes = accumarray(nearestNeighbors, weights, [max(trainLabels) 1], [], 0);
[~, label(i)] = max(weightedVotes);
end
end