我已经在Python中使用scikits.learn训练了一堆RBF SVM,然后对结果进行了Pickled。这些是用于图像处理任务的,我想做的一件事是测试每个分类器在一些测试图像的每个像素上运行。也就是说,从以像素(i,j)为中心的窗口中提取特征向量,运行该特征向量上的每个分类器,然后移动到下一个像素并重复。这对于Python来说太慢了。如何从scikits.learn分类器中提取信息然后在C代码中使用
澄清:当我说“这太慢了......”我的意思是即使是scikits.learn使用的Libsvm底层代码太慢了。实际上,我正在为GPU编写一个手动决策函数,以便在每个像素处进行并行分类。
是否可以使用Pickle加载分类器,然后获取某种属性,描述如何从特征向量计算出决策,然后将该信息传递给我自己的C代码?在线性支持向量机的情况下,我可以提取权向量和偏向量,并将它们作为输入添加到C函数中。但是对于RBF分类器来说,等同的事情是什么?我如何从scikits.learn对象中获取这些信息?
加:首次尝试解决方案。
看起来分类器对象的属性为support_vectors_
,它包含作为数组的每一行的支持向量。还有属性dual_coef_
,这是一个由len(support_vectors_)
系数组成的数组。从非线性SVM的标准教程看来,应该执行以下操作:
- 从您的测试数据点计算特征向量
v
。这将是一个与support_vectors_
的行长度相同的向量。 - 对于
i
中的每一行support_vectors_
,计算该支持向量与v
之间的平方欧几里得距离d[i]
。 - 计算
t[i]
作为gamma * exp{-d[i]}
其中gamma
是RBF参数。 - 总结
dual_coef_[i] * t[i]
全部i
。将scikits.learn分类器的intercept_
属性的值添加到该总和中。 - 如果总和为正,归类为1,否则归为0。
补充:编号为第9页,在此documentation link它提到,的确分类的intercept_
属性包含偏项。我已经更新了上述步骤以反映这一点。
文档链接中断 – ademar111190