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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 05:27:03