ไลบรารีแมชชีนเลิร์นนิงใน C # [ปิด]


116

มีไลบรารีการเรียนรู้ของเครื่องใน C # หรือไม่ ฉันหลังจากสิ่งที่ต้องการWEKA ขอบคุณ.


89
ฉันไม่เห็นด้วยว่านี่ไม่ใช่คำถามที่สร้างสรรค์ ฉันคิดว่ามีประโยชน์มากที่จะมีชุดคำแนะนำไลบรารีที่จัดการโดยผู้ใช้ในผลการค้นหาอัตโนมัติที่ Google เปิดขึ้น ฉันไม่เห็นว่าเหตุใดคำแนะนำของห้องสมุดจึงไม่สามารถใช้ "ข้อเท็จจริงข้อมูลอ้างอิงและความเชี่ยวชาญเฉพาะด้าน" ตามที่อธิบายไว้ในบันทึกย่อ
Ismail Degani

2
@IsmailDegani คุณสามารถโหวตให้เปิดใหม่ได้หรือไม่?
James Ko

4
ทุกคนที่กำลังมองหากรอบ: คำตอบด้านล่างนี้ลงวันที่เนื่องจากคำถามถูกล็อก มีเฟรมเวิร์กการเรียนรู้ของเครื่อง C # แบบโอเพนซอร์สที่เป็นที่นิยมเรียกว่า Accord.NET และนี่คือหน้าเว็บของมัน: accord-framework.net
James Ko

2
ML.NET เป็นสิ่งที่ไมโครซอฟท์ลงทุนเป็นจำนวนมาก ฉันได้สร้างวิดีโอความยาว 1 ชั่วโมงนี้ซึ่งจะช่วยให้คุณเริ่มต้นกับ ML.NET โดยใช้ C # youtube.com/watch?v=83LMXWmzRDM
Shivprasad Koirala

1
ลองดูscisharpstack.orgซึ่งเป็นความพยายามในการพอร์ตไลบรารีแมชชีนเลิร์นนิงที่ได้รับความนิยมสูงสุดจาก Python ไปยัง C #
เฮนอน

คำตอบ:


59

ตรวจสอบรายชื่อที่ยอดเยี่ยมนี้ใน GitHub จากกรอบที่ระบุไว้ Accord.NET เป็นโอเพ่นซอร์สและได้รับความนิยมสูงสุดโดยมีดาวมากกว่า 2,000 ดวง

นอกจากนี้ตรวจสอบไลบรารีแมชชีนเลิร์นนิงอย่างเป็นทางการสำหรับ. NET ที่จัดทำโดย Microsoft: https://github.com/dotnet/machinelearning


OLD

มีไลบรารีเครือข่ายประสาทที่เรียกว่าAForge.netบน codeproject (รหัสโฮสต์ที่รหัส Google ) (ชำระเงินที่หน้าแรกของ AForge ด้วย - ตามหน้าแรกตอนนี้เวอร์ชันใหม่รองรับอัลกอริทึมทางพันธุกรรมและการเรียนรู้ของเครื่องด้วยเช่นกันดูเหมือนว่าจะก้าวหน้าไปมากตั้งแต่ฉันเล่นกับมันครั้งล่าสุด)

ฉันไม่รู้ว่ามันเหมือนกับ WEKA เพราะฉันไม่เคยใช้มันมาก่อน

(มีบทความเกี่ยวกับการใช้งานด้วย )


1
ไม่เลวแม้ว่าอย่างน้อยสำหรับคนที่ไม่ค่อยคุ้นเคยกับหัวข้อนี้มันก็ไม่ใช่ทางเลือกที่ดีนัก พวกเขาไม่ใช้คลาสบางส่วนสำหรับแบบฟอร์มของพวกเขา (ทำให้ยากที่จะอ่านโค้ดที่อยู่ด้านหลังตัวอย่าง) และฉันไม่พบเอกสารที่เหมาะสมสำหรับมัน
RCIX

@RCIX: ฉันยอมรับว่ามันไม่ง่ายอย่างแน่นอนคุณต้องเข้าใจโครงข่ายประสาทเทียมและคณิตศาสตร์ที่อยู่เบื้องหลังก่อน แน่นอนว่าไม่ได้ออกแบบมาเพื่อสอน NN แต่เป็นการใช้งานเมื่อคุณรู้ว่าคุณกำลังทำอะไรอยู่ เอกสารอยู่ที่นี่ - aforgenet.com/framework/docsแต่ใช่มันดูกระจัดกระจายไปหน่อย โดยส่วนตัวแล้วฉันไม่ได้ใช้มันมาหลายปีแล้วและดูเหมือนว่ามันจะเพิ่มเข้ามามากมายตั้งแต่นั้นมาดังนั้นมันอาจจะซับซ้อนขึ้นเรื่อย ๆ
Simon P Stevens


15

นอกจากนี้คุณยังสามารถใช้ Weka ด้วย C # ทางออกที่ดีที่สุดคือใช้IKVMดังในบทช่วยสอนนี้แม้ว่าคุณจะสามารถใช้ซอฟต์แวร์เชื่อมต่อได้


1
คุณกำลังพูดถึง "ซอฟต์แวร์เชื่อมโยง" อะไร อันไหน?
lmsasu

14

Weka สามารถใช้งานจาก C # ได้อย่างง่ายดายตามที่ Shane ระบุโดยใช้ IKVM และ 'รหัสกาว' บางส่วน ทำตามบทช่วยสอนในหน้า wekaเพื่อสร้าง '.Net version' ของ weka จากนั้นคุณสามารถลองเรียกใช้การทดสอบต่อไปนี้:

[Fact]
public void BuildAndClassify()
{
  var classifier = BuildClassifier();
  AssertCanClassify(classifier);
}

[Fact]
public void DeserializeAndClassify()
{
  BuildClassifier().Serialize("test.weka");
  var classifier = Classifier.Deserialize<LinearRegression>("test.weka");
  AssertCanClassify(classifier);
}

private static void AssertCanClassify(LinearRegression classifier)
{
  var result = classifier.Classify(-402, -1);
  Assert.InRange(result, 255.8d, 255.9d);
}

private static LinearRegression BuildClassifier()
{
  var trainingSet = new TrainingSet("attribute1", "attribute2", "class")
    .AddExample(-173, 3, -31)
    .AddExample(-901, 1, 807)
    .AddExample(-901, 1, 807)
    .AddExample(-94, -2, -86);

  return Classifier.Build<LinearRegression>(trainingSet);
}

การทดสอบครั้งแรกแสดงให้เห็นว่าคุณสร้างลักษณนามและจำแนกตัวอย่างใหม่ด้วยวิธีใดแบบที่สองแสดงวิธีที่คุณสามารถใช้คลาสดิฟายเออร์ที่ยังคงอยู่จากไฟล์เพื่อจำแนกตัวอย่างได้ หากคุณต้องการการสนับสนุนคุณลักษณะที่ไม่ต่อเนื่องมากเกินไปการปรับเปลี่ยนบางอย่างจะมีความจำเป็น โค้ดด้านบนใช้ตัวช่วย 2 คลาส:

public class TrainingSet
{
    private readonly List<string> _attributes = new List<string>();
    private readonly List<List<object>> _examples = new List<List<object>>();

    public TrainingSet(params string[] attributes)
    {
      _attributes.AddRange(attributes);
    }

    public int AttributesCount
    {
      get { return _attributes.Count; }
    }

    public int ExamplesCount
    {
      get { return _examples.Count; }
    }

    public TrainingSet AddExample(params object[] example)
    {
      if (example.Length != _attributes.Count)
      {
        throw new InvalidOperationException(
          String.Format("Invalid number of elements in example. Should be {0}, was {1}.", _attributes.Count,
            _examples.Count));
      }


      _examples.Add(new List<object>(example));

      return this;
    }

    public static implicit operator Instances(TrainingSet trainingSet)
    {
      var attributes = trainingSet._attributes.Select(x => new Attribute(x)).ToArray();
      var featureVector = new FastVector(trainingSet.AttributesCount);

      foreach (var attribute in attributes)
      {
        featureVector.addElement(attribute);
      }

      var instances = new Instances("Rel", featureVector, trainingSet.ExamplesCount);
      instances.setClassIndex(trainingSet.AttributesCount - 1);

      foreach (var example in trainingSet._examples)
      {
        var instance = new Instance(trainingSet.AttributesCount);

        for (var i = 0; i < example.Count; i++)
        {
          instance.setValue(attributes[i], Convert.ToDouble(example[i]));
        }

        instances.add(instance);
      }

      return instances;
    }
}

public static class Classifier
{
    public static TClassifier Build<TClassifier>(TrainingSet trainingSet)
      where TClassifier : weka.classifiers.Classifier, new()
    {
      var classifier = new TClassifier();
      classifier.buildClassifier(trainingSet);
      return classifier;
    }

    public static TClassifier Deserialize<TClassifier>(string filename)
    {
      return (TClassifier)SerializationHelper.read(filename);
    }

    public static void Serialize(this weka.classifiers.Classifier classifier, string filename)
    {
      SerializationHelper.write(filename, classifier);
    }

    public static double Classify(this weka.classifiers.Classifier classifier, params object[] example)
    {
      // instance lenght + 1, because class variable is not included in example
      var instance = new Instance(example.Length + 1);

      for (int i = 0; i < example.Length; i++)
      {
        instance.setValue(i, Convert.ToDouble(example[i]));
      }

      return classifier.classifyInstance(instance);
    }
}


2

นอกจากนี้ยังมีโครงการที่เรียกว่า Encog ที่มีรหัส C # ได้รับการดูแลโดย Jeff Heaton ผู้เขียนหนังสือ "Introduction to Neural Network" ที่ฉันซื้อมาเมื่อสักครู่ codebase Git อยู่ที่นี่: https://github.com/encog/encog-dotnet-core


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.