但是为什么要“手动”分类呢? OpenCv has a classification routine 调用 predict,它使用找到的 SVs' 和 alphas'
float response = SVM.predict(sampleMat);
如果你真的想自己做,你不仅需要 SV 和 alpha,还需要一个用于训练和计算的核函数
SUM alpha_i K( support_vector_i , data_point ) - rho
我不确定是否可以在不扩展 SVM 类的情况下“手动”提取 alpha,正如在 sources 中看到的那样 - 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 )
see source for more details.