并行执行C#中的Weka分类

并行执行C#中的Weka分类,c#,linq,classification,weka,C#,Linq,Classification,Weka,我已经就Weka和C#以及WekaSharp的运营提出了一些广泛的问题,因此我想我会尝试提出一个更为集中的问题,以期自己取得更大的进展。作为weka站点给出的从C#执行weka的示例,我使用的是我希望使用并行操作运行部分计算,但不确定如何编码这里是原始代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; using weka.classifiers.meta; using

我已经就Weka和C#以及WekaSharp的运营提出了一些广泛的问题,因此我想我会尝试提出一个更为集中的问题,以期自己取得更大的进展。作为weka站点给出的从C#执行weka的示例,我使用的是我希望使用并行操作运行部分计算,但不确定如何编码这里是原始代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using weka.classifiers.meta;
using weka.classifiers.functions;
using weka.core;
using java.io;
using weka.clusterers;
using System.Diagnostics;
using System.Threading;

// From http://weka.wikispaces.com/IKVM+with+Weka+tutorial

class MainClass
{
    public static void Main(string[] args)
    {
        System.Console.WriteLine("J48 in C#");
        classifyTest();
    }

    const int percentSplit = 66;
    public static void classifyTest()
    {
        try
        {
            weka.core.Instances insts = new weka.core.Instances(new java.io.FileReader(@"C:\Users\Deines\Documents\School\Software\WekaSharp2012\data\iris.arff"));
            insts.setClassIndex(insts.numAttributes() - 1);

            weka.classifiers.Classifier cl = new weka.classifiers.trees.J48();
            System.Console.WriteLine("Performing " + percentSplit + "% split evaluation.");

            //randomize the order of the instances in the dataset.
            weka.filters.Filter myRandom = new weka.filters.unsupervised.instance.Randomize();
            myRandom.setInputFormat(insts);
            insts = weka.filters.Filter.useFilter(insts, myRandom);

            int trainSize = insts.numInstances() * percentSplit / 100;
            int testSize = insts.numInstances() - trainSize;
            weka.core.Instances train = new weka.core.Instances(insts, 0, trainSize);

            cl.buildClassifier(train);
            int numCorrect = 0;
            for (int i = trainSize; i < insts.numInstances(); i++)
            {
                weka.core.Instance currentInst = insts.instance(i);
                double predictedClass = cl.classifyInstance(currentInst);
                if (predictedClass == insts.instance(i).classValue())
                    numCorrect++;
            }
            System.Console.WriteLine(numCorrect + " out of " + testSize + " correct (" +
                       (double)((double)numCorrect / (double)testSize * 100.0) + "%)");
        }
        catch (java.lang.Exception ex)
        {
            ex.printStackTrace();
        }
    }

}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用weka.classifiers.meta;
使用weka.classifiers.functions;
使用weka.core;
使用java.io;
使用weka.clusters;
使用系统诊断;
使用系统线程;
//从http://weka.wikispaces.com/IKVM+使用+Weka+教程
类主类
{
公共静态void Main(字符串[]args)
{
System.Console.WriteLine(“C#中的J48”);
分类测试();
}
const int percentSplit=66;
公共静态无效分类测试()
{
尝试
{
weka.core.Instances insts=新的weka.core.Instances(新的java.io.FileReader(@“C:\Users\Deines\Documents\School\Software\WekaSharp2012\data\iris.arff”);
insts.setClassIndex(insts.numAttributes()-1);
weka.classifiers.Classifier cl=新的weka.classifiers.trees.J48();
System.Console.WriteLine(“执行”+百分比分割+%分割评估”);
//随机化数据集中实例的顺序。
weka.filters.Filter myRandom=新的weka.filters.unsupervised.instance.Randomize();
myRandom.setInputFormat(insts);
insts=weka.filters.Filter.useFilter(insts,myRandom);
int TRAINSSIZE=仪表numInstances()*百分比拆分/100;
int testSize=insts.numInstances()-列车尺寸;
weka.core.Instances train=新的weka.core.Instances(insts,0,trainSize);
cl.1(列车);
int numCorrect=0;
对于(int i=列车尺寸;i
我想参加:

        for (int i = trainSize; i < insts.numInstances(); i++)
        {
            weka.core.Instance currentInst = insts.instance(i);
            double predictedClass = cl.classifyInstance(currentInst);
            if (predictedClass == insts.instance(i).classValue())
                numCorrect++;
        }
for(inti=trainSize;i

顺序和并发操作,以比较费率。我知道该命令是
System.Linq.ParallelExecutionMode()
,但我不确定在这种情况下如何应用它。非常感谢。

为什么不改为
System.Threading.Tasks.Parallel.For

Parallel.For(trainSize, inst.numInstances(), i => 
{
    weka.core.Instance currentInst = insts.instance(i);
    double predictedClass = cl.classifyInstance(currentInst);
    if (predictedClass == insts.instance(i).classValue())
        Interlocked.Increment(ref numCorrect);
});

请不要,我没有执行此代码,因此您可能需要添加一些同步代码(监视器或锁)以访问某些共享数据。

谢谢,我更喜欢此方法,这就是您成为专家的原因:-)。我将试一试,这应该很有趣,如果我需要在这里添加一些同步代码以供将来阅读,我会注意到。你既谦虚又乐于助人:-)我不需要添加任何同步代码,它执行得很好,并且显示出比大数据集的效率有所提高。@RedMassiveStar是的,并行编程的第一步是…评测!如果开销(用于并行执行)与计算相比太高,那么改进就会更小。@RedMassiveStar如果您有时间,我会尝试展开并行循环(在循环内部执行至少两个计算,对于I和I+1)或一个循环。第二步是使用and使更多的事情并行(但您应该分析哪些函数需要时间)。