【发布时间】:2015-12-12 11:57:09
【问题描述】:
我一直在使用 java 版本的 libsvm 来解决许多数据挖掘问题。 然而我注意到即使我们有多核计算机,libsvm 只使用一个核心,它不会并行化问题。当我在常见问题解答中搜索时,有一个 c++ 解决方案[http://www.csie.ntu.edu.tw/~cjlin/libsvm/faq.html#f432].现有的java类是这样的。
@Override
float[] get_Q( int i, int len )
{
float[][] data = new float[1][];
int start, j;
if ( ( start = cache.get_data( i, data, len ) ) < len )
{
for ( j = start; j < len; j++ )
{
data[0][j] = ( float ) ( y[i] * y[j] * kernel_function( i, j ) );
}
}
return data[0];
}
我在 java 中也使用了相同的概念 - 更改类 SVC_Q 中 get_Q 的 for 循环,如下所示。
@Override
float[] get_Q( int i, int len )
{
float[][] data = new float[1][];
int start, j;
if ( ( start = cache.get_data( i, data, len ) ) < len )
{
ExecutorService executorService = Executors.newFixedThreadPool( Runtime.getRuntime()
.availableProcessors() ); // number of threads
for ( j = start; j < len; j++ )
{
final int count = j;
executorService.submit( new Runnable()
{
@Override
public void run()
{
data[0][count] = ( float ) ( y[i] * y[count] * kernel_function( i, count ) );
}
} );
}
executorService.shutdown();
}
return data[0];
}
即使现在更改后它使用了我机器中的所有内核,但结果却在下降。新测试集的正确分类实例的百分比从 78% 下降到 58%。训练时间也没有减少。所以很明显我做的不对。 是否有适当的方法来并行化 libsvm?我在代码中犯了什么错误?
【问题讨论】:
标签: java parallel-processing machine-learning libsvm