【问题标题】:Executing Weka Classification in C# in Parallel在 C# 中并行执行 Weka 分类
【发布时间】:2013-12-18 20:03:25
【问题描述】:

我已经问了一些关于 Weka 和 C# 以及 WekaSharp 的操作的广泛问题,所以我想我会尝试问一个更集中的问题,以尝试自己进一步取得进展。作为从我使用的 C# 执行 weka 的 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();
        }
    }

}

我想跑步:

        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.Linq.ParallelExecutionMode() ,但我不确定在这种情况下如何应用它。非常感谢。

【问题讨论】:

    标签: c# linq classification weka


    【解决方案1】:

    为什么不改为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 如果你有时间我会尝试 unroll 并行循环(在循环内执行至少两次计算,对于 i 和 i + 1)或 partitioner。第二步是使用futuresasync 使更多的事情并行(但你应该分析哪些函数需要时间)。
    猜你喜欢
    • 2012-04-06
    • 1970-01-01
    • 1970-01-01
    • 2015-07-07
    • 2015-02-01
    • 2020-04-06
    • 2013-11-03
    • 2012-10-13
    • 2012-04-09
    相关资源
    最近更新 更多