我已经使用kernlab软件包在R中创建了一个SVM,但是它的运行速度非常慢(在win64 R发行版上,20,000次预测需要大约45秒)。 CPU运行率为25%,RAM利用率仅为17%......这不是硬件瓶颈。在SQL Server分析服务中使用数据挖掘算法的类似计算运行速度提高了约40倍。
通过反复试验,我们发现laplacedot内核给我们带来了最大的效果。 Rbfdot的准确率降低了约15%,但速度提高了一倍(但仍然太慢)。最好的表现是vanilladot。它或多或少地立即运行,但精度太低而无法使用。
我们理想地喜欢使用laplacedot内核,但为此我们需要大量的加速。有没有人对如何做到这一点有任何想法?
以下是我使用rprof生成的一些分析信息。看起来大部分时间都花在低级数学调用上(其余部分包含与第16-40行类似的数据)。这应该运行得非常快,但看起来代码没有优化(我不知道从哪里开始)。
修改:要重现的示例代码:
dummy.length = 20000;
source.data = as.matrix(cbind(sample(1:dummy.length)/1300, sample(1:dummy.length)/1900))
colnames(source.data) <- c("column1", "column2")
y.value = as.matrix((sample(1:dummy.length) + 9) / 923)
model <- ksvm(source.data[,], y.value, type="eps-svr", kernel="laplacedot",C=1, kpar=list(sigma=3));
源数据有7个数字列(浮点)和20,000行。这需要大约2-3分钟的训练。下一个调用会生成预测,并且始终需要40秒才能运行:
predictions <- predict(model, source.data)
编辑2: Laplacedot内核使用以下公式计算两个向量的点积。这与profr输出非常接近。奇怪的是,负面符号(在圆函数之前)似乎消耗了大约50%的运行时间。
return(exp(-sigma * sqrt(-(round(2 * crossprod(x, y) - crossprod(x,x) - crossprod(y,y), 9)))))
编辑3:添加了要重现的示例代码 - 这给了我与实际数据相同的运行时。
答案 0 :(得分:0)
SVM本身是一种非常慢的算法。 SVM的时间复杂度为O(n * n)。
SMO(序列最小优化http://en.wikipedia.org/wiki/Sequential_minimal_optimization)是一种有效解决支持向量机训练过程中出现的优化问题的算法。
libsvm(http://www.csie.ntu.edu.tw/~cjlin/libsvm/)和liblinear是两个开源实现。