如何在sklearn体系下获取RSLVQ各测试样本的类别概率p(c|x)
RSLVQ类别概率计算与分类拒识实现方案
核心实现逻辑
RSLVQ作为基于原型距离的分类器,没有内置predict_proba()方法,可通过距离-相似度转换+类别归一化的方式计算类别概率p(c|x),逻辑和RSLVQ原生分类决策规则完全对齐:
- 首先获取训练完成后RSLVQ模型的两个内置属性:
prototypes_(所有类别的原型特征向量)、proto_labels_(每个原型对应的类别标签) - 计算待预测样本到所有原型的距离,通过指数函数转换为相似度
- 按类别累加对应原型的相似度,归一化后得到每个类别的归属概率
代码实现
自定义概率预测函数
import numpy as np from sklearn_lvq import RSLVQ from sklearn.metrics.pairwise import euclidean_distances # 假设你已经完成RSLVQ模型训练 rslvq_model = RSLVQ() rslvq_model.fit(X_train, y_train) def rslvq_predict_proba(model, X, tau=1.0): # 计算样本到所有原型的欧氏距离 dists = euclidean_distances(X, model.prototypes_) # 距离转相似度,tau为温度系数,控制概率分布锐度 sim = np.exp(-dists / tau) # 获取所有唯一类别 unique_classes = np.unique(model.proto_labels_) proba = np.zeros((X.shape[0], len(unique_classes))) # 按类别累加相似度 for class_idx, label in enumerate(unique_classes): class_proto_mask = model.proto_labels_ == label proba[:, class_idx] = sim[:, class_proto_mask].sum(axis=1) # 归一化得到概率 proba = proba / proba.sum(axis=1, keepdims=True) return proba, unique_classes
分类拒识逻辑实现
# 自定义拒识阈值,可通过验证集调优 reject_threshold = 0.7 proba_result, class_order = rslvq_predict_proba(rslvq_model, X_test) # 取每个样本的最高归属概率 max_proba = proba_result.max(axis=1) # 生成预测结果,低于阈值的标记为-1(拒识) pred_result = class_order[proba_result.argmax(axis=1)] pred_result[max_proba < reject_threshold] = -1
注意事项
- 温度系数τ调优:τ越小,概率分布越陡峭,类别区分度越高;τ越大,概率分布越平缓。可结合验证集的分类准确率、拒识率两个指标调整τ和拒识阈值,匹配业务需求。
- 若你使用的RSLVQ配置了非欧氏的距离度量,替换上述代码中的
euclidean_distances为对应距离计算函数即可。
内容的提问来源于stack exchange,提问作者Hassan Amjad
相关产品推荐
相关产品推荐

