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