SVC常见算法的计算复杂度
Hands-on Machine Learning with Scikit Learn, Keras & TensorFlow
Charpter 5 学习笔记
LinearSVC类基于liblinear库,它实现了线性支持向量机的优化算法(https://homl.info/13)。它不支持核技巧,但它几乎随训练实例的数量和特征的数量线性扩展。其训练时间复杂度约为O(m * n)。
如果你需要非常高的精度,算法需要更长的时间。这是由公差超参数(在Scikit-Learn中称为tol)控制的。在大多数分类任务中,默认容忍是很好的。
SVC类基于libsvm库,它实现了一个支持核技巧(kernel trick)的算法(https://homl.info/14)。训练时间复杂度通常介于O(m^2 x n)和O(m^3 x n)之间。不幸的是,这意味着当训练实例的数量变大(例如,几十万个实例)时,它会变得非常慢。该算法适用于复杂的中小型训练集。它可以很好地根据特征的数量伸缩,特别是在稀疏特征(即,当每个实例只有很少的非零特征时)。在这种情况下,算法大致上根据每个实例的非零特征的平均数量进行扩展。
Class | Time complexity | Out-of-core support | Scaling required | Kernel trick |
---|---|---|---|---|
LinearSVC | O(m*n) | No | Yes | No |
SGDClassifier | O(m*n) | Yes | Yes | No |
SVC | O(m^2 * n) to O(m^3 * n) | No | Yes | Yes |