Python 如何从scikits中提取信息。学习分类器,然后在C代码中使用

Python 如何从scikits中提取信息。学习分类器,然后在C代码中使用,python,svm,libsvm,scikits,scikit-learn,Python,Svm,Libsvm,Scikits,Scikit Learn,我已经使用scikits.learn在Python中训练了一批RBF支持向量机,然后对结果进行了处理。这些是用于图像处理任务的,我想为测试做的一件事是在一些测试图像的每个像素上运行每个分类器。也就是说,从以像素(i,j)为中心的窗口中提取特征向量,在该特征向量上运行每个分类器,然后移动到下一个像素并重复。这对于Python来说太慢了 澄清:当我说“这太慢了…”时,我的意思是,即使是scikits.learn使用的Libsvm隐藏代码也太慢了。实际上,我正在为GPU编写一个手动决策函数,以便在每个

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

澄清:当我说“这太慢了…”时,我的意思是,即使是scikits.learn使用的Libsvm隐藏代码也太慢了。实际上,我正在为GPU编写一个手动决策函数,以便在每个像素上并行进行分类

我是否可以用Pickle加载分类器,然后获取某种描述如何从特征向量计算决策的属性,然后将该信息传递给我自己的C代码?对于线性支持向量机,我可以只提取权重向量和偏差向量,并将它们作为C函数的输入。但是,RBF分类器的等效功能是什么?我如何从scikits.learn对象中获取这些信息

添加:首次尝试解决方案

看起来分类器对象具有属性
support\u vectors\uu
,该属性将支持向量作为数组的每一行。还有一个属性
dual\u coef\uuu
,它是一个1乘
len(支持向量)
系数数组。从非线性支持向量机的标准教程中,似乎应该执行以下操作:

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

添加:在编号为9的第9页中,它提到分类器的
intercept\uu
属性确实包含偏差项。我已更新了上述步骤以反映这一点。

是的,您的解决方案看起来不错。要将numpy数组的原始内存直接传递给C程序,您可以使用或使用cython包装您的C程序,并通过传递numpy数组直接调用它(有关详细信息,请参阅中的文档)

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

在预测时速度更快的替代方法包括神经网络(可能比仅具有2个超参数C和gamma的支持向量机更复杂或训练速度更慢),或者使用基于到原型的距离的非线性变换+阈值化+图像区域上的最大池化来转换数据(仅适用于图像分类)

  • 对于第一种方法,您可以在

  • 第二,阅读亚当·科茨(Adam Coates)最近发表的论文,并在


最后,您还可以尝试使用NuSVC模型,其正则化参数
nu
对拟合模型中的支持向量数量有直接影响:支持向量越少,预测时间越快(尽管要检查准确性,但最终将在预测速度和准确性之间进行权衡).

感谢您周到的回复。这个建议在以后的过程中会非常有用,但对于当前的项目,由于其他限制,我很不幸地被困在使用支持向量机的过程中。然后您应该看看
sklearn.svm.NuSVC
,并尝试首先权衡支持向量机的数量。从我看到的情况来看,sklearn 0.9 NuSVC()中的nu参数只给出了支持向量数量的下限。当我训练时,我会不断获得与我的数据相同的支持向量,除非我将nu设置得太大以至于我实际上得到了更多。我不知道如何使它提供更少的支持向量。好吧。我自己没有尝试过。我刚才阅读了libsvm文档,认为这可能会有所帮助。这个文档链接已断开