但是为什么要“手动”分类呢?OpenCv 有一个名为的分类例程predict
,它使用找到的 SVs' 和 alphas'
float response = SVM.predict(sampleMat);
如果你真的想自己做,你不仅需要 SV 和 alpha,还需要一个用于训练和计算的核函数
SUM alpha_i K( support_vector_i , data_point ) - rho
我不确定是否可以在不扩展 SVM 类的情况下“手动”提取 alpha,正如在源代码中看到的那样- alpha 存储在CvSVMDecisionFunc
结构中:
struct CvSVMDecisionFunc
{
double rho;
int sv_count;
double* alpha;
int* sv_index;
};
而对该结构的唯一参考是在以下protected
部分:
protected:
(...)
CvSVMDecisionFunc* decision_func;
从源代码中svm.cpp
我们可以发现,它只能通过save
例程公开访问。所以一些“hack”将是保存模型并从那里提取 alpha(它将位于“决策函数”部分,以人类可读的格式编写)。
最简单的提取技术似乎扩展了CvSVM
类并包含方法,例如
public:
CvSVMDecisionFunc* get_decision_function() { return decision_func; }
更新
澄清后,OP实际上正在尝试在opencv中使用外部训练模型-最简单的方法是将由其他方法(libsvm,linearsvm等)创建的libsvm模型转换为opencv兼容格式并使用read
方法加载它
void CvSVM::read( CvFileStorage* fs, CvFileNode* svm_node )
有关更多详细信息,请参阅来源。