如何从scikits.learn分类器中提取信息,然后在C代码中使用

ely*_*ely 8 python svm libsvm scikits scikit-learn

我在Python中使用scikits.learn训练了一堆RBF SVM,然后挑选了结果.这些用于图像处理任务,我想要进行测试的一件事是在一些测试图像的每个像素上运行每个分类器.也就是说,从以像素(i,j)为中心的窗口中提取特征向量,在该特征向量上运行每个分类器,然后继续前进到下一个像素并重复.这对于Python来说太慢了.

澄清:当我说"这太慢了......"我的意思是即使是scikits.learn使用的Libsvm底层代码太慢了.我实际上正在为GPU编写手动决策函数,因此每个像素的分类是并行发生的.

我是否可以使用Pickle加载分类器,然后获取描述如何从特征向量计算决策的某种属性,然后将该信息传递给我自己的C代码?在线性SVM的情况下,我可以提取权重向量和偏置向量,并将它们作为输入添加到C函数中.但是对于RBF分类器来说,相同的事情是什么,以及如何从scikits.learn对象获取该信息?

补充:首先尝试解决方案.

看起来分类器对象具有support_vectors_包含支持向量作为数组的每一行的属性.还有一个属性dual_coef_是1乘以len(support_vectors_)系数的数组.从非线性SVM的标准教程中可以看出,应该执行以下操作:

  • 计算v待测数据点的特征向量.这将是一个与行的长度相同的向量support_vectors_.
  • 对于每一行isupport_vectors_,计算平方欧几里德距离d[i]该支持向量和之间v.
  • 计算t[i]gamma * exp{-d[i]}其中gamma是RBF参数.
  • 总结dual_coef_[i] * t[i]在所有i.intercept_将scikits.learn分类器的属性值添加到此总和.
  • 如果总和为正,则归类为1.否则,归类为0.

补充:在此文档链接的编号第9页上,它提到intercept_分类器的属性确实包含偏差项.我已更新上述步骤以反映这一点.

ogr*_*sel 9

是的你的解决方案看起来不错.要将numpy数组的原始内存直接传递给C程序,您可以使用numpy中ctypes帮助程序或使用cython包装C程序并通过传递numpy数组直接调用它(请参阅http://cython.org上的文档)更多细节).

但是,我不确定尝试加速GPU上的预测是最简单的方法:已知内核支持向量机在预测时间较慢,因为它们的复杂性直接取决于支持向量的数量,这对于高度非高 - 线性(多模态)问题.

在预测时间更快的替代方法包括神经网络(可能比仅具有2个超参数C和伽马的SVM更复杂或更慢地训练)或者基于到原型的距离+阈值+非线性变换来转换数据+最大化图像区域(仅用于图像分类).

最后,您还可以尝试使用NuSVC模型,其正则化参数nu对拟合模型中的支持向量数量有直接影响:较少的支持向量意味着更快的预测时间(检查准确性,但它将是预测速度之间的权衡)最后的准确性).