如何用c语言做钓鱼网站,网站法人与负责人,免费咨询医生男科,阿尔山网站建设多标签K近邻#xff08;ML-KNN#xff09;是经典KNN算法在多标签学习场景下的直接扩展#xff0c;也是非常有效和常用的基准方法。一、 算法核心思想
传统的KNN用于多分类问题时#xff0c;会找出K个最近邻#xff0c;然后通过“投票法”决定样本的单一类别。而多标签KNNML-KNN是经典KNN算法在多标签学习场景下的直接扩展也是非常有效和常用的基准方法。一、 算法核心思想传统的KNN用于多分类问题时会找出K个最近邻然后通过“投票法”决定样本的单一类别。而多标签KNNML-KNN的核心思想是对于每一个标签Label独立地判断样本属于该标签的概率。这个判断依据是其K个最近邻样本在该标签上的表现即哪些邻居有这个标签。它本质上为每个标签都训练了一个独立的分类器基于邻居信息因此可以输出样本的多个标签。二、 算法步骤详解假设我们有训练集Train_X(特征),Train_Y(标签0/1矩阵)要预测测试样本Test_X的标签Test_Y。Step 1: 计算最近邻对于每一个测试样本Test_X(i)计算它与所有训练样本Train_X的距离如欧氏距离。找出与Test_X(i)距离最近的 K 个训练样本记其索引为N_i(大小为 K 的集合)。Step 2: 统计邻居的标签信息核心对于每一个标签l(即标签矩阵的每一列)统计这 K 个邻居中拥有该标签l的邻居个数。记作C_l。C_l sum(Train_Y(N_i, l) 1)Step 3: 应用贝叶斯规则进行预测这是ML-KNN区别于简单投票法的关键。它使用先验概率来做出更稳健的决策。先验概率 (Prior): 从整个训练集中计算。P1_prior(l) (s sum(Train_Y(:, l) 1)) / (s*2 n_train)P0_prior(l) 1 - P1_prior(l)(通常用拉普拉斯平滑s1防止概率为0)后验概率 (Posterior)基于当前样本的邻居信息计算。P1 P(H_l^1) * P(E_l^c | H_l^1)P0 P(H_l^0) * P(E_l^c | H_l^0)其中H_l^1: 事件“测试样本有标签l”H_l^0: 事件“测试样本没有标签l”E_l^c: 事件“测试样本的K个邻居中恰好有c个拥有标签l”这里c C_l决策如果P1 P0则预测该测试样本拥有标签l否则没有。在实际代码实现中我们通常预先计算整个训练集每个标签的邻居数量分布似然概率然后查表。三、 MATLABfunctionPredicted_LabelsML_KNN(Train_X,Train_Y,Test_X,K,Smooth)% ML-KNN 多标签K近邻算法% 输入:% Train_X, Train_Y - 训练数据和标签 (多标签0/1矩阵)% Test_X - 测试数据% K - 近邻数% Smooth - 拉普拉斯平滑参数 (通常为1)% 输出:% Predicted_Labels - 测试集的预测标签 (0/1矩阵)[n_train,n_label]size(Train_Y);n_testsize(Test_X,1);% 初始化预测结果矩阵Predicted_Labelszeros(n_test,n_label);% 1. 计算所有测试样本与所有训练样本的距离% 注意对于大数据集此处需要优化以防止内存溢出 (例如使用循环或pdist2)Distpdist2(Test_X,Train_X);% 需要 Statistics and Machine Learning Toolbox% 或者自己实现欧氏距离:% for i1:n_test% Dist(i,:) sqrt(sum((Train_X - Test_X(i,:)).^2, 2));% end% 2. 对每个标签预先计算先验概率P1_priorzeros(1,n_label);forl1:n_labelP1_prior(l)(Smoothsum(Train_Y(:,l)1))/(Smooth*2n_train);endP0_prior1-P1_prior;% 3. 对每个测试样本进行预测fori1:n_test% a. 获取当前测试样本的K个最近邻的索引[~,sorted_idx]sort(Dist(i,:));neighbor_idxsorted_idx(1:K);% b. 获取这些邻居的标签子集Neighbor_LabelsTrain_Y(neighbor_idx,:);% c. 对于每一个标签l进行贝叶斯推断forl1:n_label% 统计K个邻居中拥有标签l的个数 (c)csum(Neighbor_Labels(:,l));% --- 此处应使用预计算的似然概率 P(c | H_l^1) 和 P(c | H_l^0) ---% 为了简化示例我们做一个近似估计% 假设似然概率正比于二项分布并从训练集中估计其参数% 计算整个训练集中每个样本的K近邻拥有标签l的个数的分布% (在实际完整实现中这里需要预先用交叉验证等方法计算一个概率表)% 本例简化: 使用邻居中标签l的频率作为概率的估计% 注意这是一个简化完整的ML-KNN需要预先计算整个训练集的这个分布。% 简单频率估计 (带平滑)prob_c_given_H1(Smoothc)/(Smooth*2K);prob_c_given_H0(Smooth(K-c))/(Smooth*2K);% 计算后验概率P1P1_prior(l)*prob_c_given_H1;P0P0_prior(l)*prob_c_given_H0;% 决策ifP1P0Predicted_Labels(i,l)1;elsePredicted_Labels(i,l)0;endendendend如何使用% 假设您已有数据% Train_X: n_train x d_features 矩阵% Train_Y: n_train x n_labels 矩阵 (元素为0或1)% Test_X: n_test x d_features 矩阵K10;% 选择近邻数Smooth1;% 拉普拉斯平滑参数Predicted_YML_KNN(Train_X,Train_Y,Test_X,K,Smooth);% 评估性能 (例如计算Hamming Loss)% True_Y 是测试集真实的标签hamming_losssum(sum(Predicted_Y~True_Y))/(size(True_Y,1)*size(True_Y,2));fprintf(Hamming Loss: %.4f\n,hamming_loss);参考代码 多标签K近邻方法实现对多标签数据进行分类www.3dddown.com/csa/53349.html四、 事项与优化距离度量: 欧氏距离是默认选择但对于高维或特定类型数据如文本余弦距离可能更合适。务必对特征数据进行标准化Z-score或Min-Max防止某些特征主导距离计算。参数选择:K近邻数是最关键的参数。太小容易过拟合太大会平滑过度导致性能下降。需要通过交叉验证在验证集上选择最佳K值。Smooth平滑参数通常设为1拉普拉斯平滑即可用于处理概率为0的情况。计算效率:ML-KNN的预测阶段很慢因为需要为每个测试样本计算与所有训练样本的距离。对于大规模数据集这是主要瓶颈。优化方法使用KD树、Ball Tree等数据结构进行近邻搜索MATLAB中可使用knnsearch或fitcknn或采用近似最近邻算法ANN。完整实现:上面的代码是简化版。完整的ML-KNN实现需要在训练阶段预先为每个标签l计算一个概率分布表即P(c | H_l^1)和P(c | H_l^0)c从0到K。这个表是通过对训练集本身进行K近邻统计得到的。上述示例中用简单频率估计代替了这一步。评估指标:多标签学习的评估指标与单标签不同常用Hamming Loss汉明损失被错误预测的标签比例越小越好。F1-Score宏平均/微平均精确率和召回率的调和平均。Subset Accuracy子集准确率预测的标签集合与真实集合完全一致的样本比例非常严格。