2016-11-13 15 views
5

Tôi mới học máy và mới học với accord.net (Mã I C#).Ví dụ học tập máy accord.net đơn giản

Tôi muốn tạo một dự án đơn giản nơi tôi xem xét một chuỗi dữ liệu thời gian đơn giản dao động, sau đó tôi muốn accord.net tìm hiểu và dự đoán giá trị tiếp theo sẽ là gì.

Đây là những gì các dữ liệu (chuỗi thời gian) nên hình như:

X - Y

1 - 1 

2 - 2 

3 - 3 

4 - 2 

5 - 1 

6 - 2 

7 - 3 

8 - 2 

9 - 1 

Sau đó, tôi muốn nó để dự đoán như sau:

X - Y

10 - 2 

11 - 3 

12 - 2 

13 - 1 

14 - 2 

15 - 3 

Các bạn có thể giúp tôi với một số ví dụ về cách giải quyết không?

Trả lời

9

Cách đơn giản để thực hiện việc này là sử dụng cây quyết định Accord ID3.

Bí quyết là tìm ra đầu vào để sử dụng - bạn không thể đào tạo trên X - cây sẽ không tìm hiểu bất kỳ điều gì về giá trị tương lai của X từ đó - tuy nhiên bạn có thể xây dựng một số tính năng bắt nguồn từ X (hoặc các giá trị trước đó của Y) sẽ hữu ích.

Thông thường đối với các vấn đề như thế này - bạn sẽ đưa ra mỗi dự đoán dựa trên các tính năng có được từ các giá trị trước đó của Y (điều được dự đoán) thay vì X. Tuy nhiên, giả sử bạn có thể quan sát Y liên tiếp giữa mỗi dự đoán (bạn không thể sau đó dự đoán cho bất kỳ trọng tài X) vì vậy tôi sẽ gắn bó với câu hỏi như được trình bày.

Tôi đã đi xây dựng cây quyết định Accord ID3 để giải quyết vấn đề này bên dưới. Tôi đã sử dụng một vài giá trị khác nhau của x % n làm các tính năng - hy vọng cây có thể tìm ra câu trả lời từ điều này. Trong thực tế, nếu tôi thêm (x-1) % 4 như một tính năng nó có thể làm điều đó trong một mức duy nhất chỉ với thuộc tính đó - nhưng tôi đoán điểm là nhiều hơn để cho cây tìm các mẫu.

Và đây là mã cho rằng:

// this is the sequence y follows 
    int[] ysequence = new int[] { 1, 2, 3, 2 }; 

    // this generates the correct Y for a given X 
    int CalcY(int x) => ysequence[(x - 1) % 4]; 

    // this generates some inputs - just a few differnt mod of x 
    int[] CalcInputs(int x) => new int[] { x % 2, x % 3, x % 4, x % 5, x % 6 }; 


    // for http://stackoverflow.com/questions/40573388/simple-accord-net-machine-learning-example 
    [TestMethod] 
    public void AccordID3TestStackOverFlowQuestion2() 
    { 
     // build the training data set 
     int numtrainingcases = 12; 
     int[][] inputs = new int[numtrainingcases][]; 
     int[] outputs = new int[numtrainingcases]; 

     Console.WriteLine("\t\t\t\t x \t y"); 
     for (int x = 1; x <= numtrainingcases; x++) 
     { 
      int y = CalcY(x); 
      inputs[x-1] = CalcInputs(x); 
      outputs[x-1] = y; 
      Console.WriteLine("TrainingData \t " +x+"\t "+y); 
     } 

     // define how many values each input can have 
     DecisionVariable[] attributes = 
     { 
      new DecisionVariable("Mod2",2), 
      new DecisionVariable("Mod3",3), 
      new DecisionVariable("Mod4",4), 
      new DecisionVariable("Mod5",5), 
      new DecisionVariable("Mod6",6) 
     }; 

     // define how many outputs (+1 only because y doesn't use zero) 
     int classCount = outputs.Max()+1; 

     // create the tree 
     DecisionTree tree = new DecisionTree(attributes, classCount); 

     // Create a new instance of the ID3 algorithm 
     ID3Learning id3learning = new ID3Learning(tree); 

     // Learn the training instances! Populates the tree 
     id3learning.Learn(inputs, outputs); 

     Console.WriteLine(); 
     // now try to predict some cases that werent in the training data 
     for (int x = numtrainingcases+1; x <= 2* numtrainingcases; x++) 
     { 
      int[] query = CalcInputs(x); 

      int answer = tree.Decide(query); // makes the prediction 

      Assert.AreEqual(CalcY(x), answer); // check the answer is what we expected - ie the tree got it right 
      Console.WriteLine("Prediction \t\t " + x+"\t "+answer); 
     } 
    } 

Đây là sản phẩm nó tạo ra:

    x y 
TrainingData  1 1 
TrainingData  2 2 
TrainingData  3 3 
TrainingData  4 2 
TrainingData  5 1 
TrainingData  6 2 
TrainingData  7 3 
TrainingData  8 2 
TrainingData  9 1 
TrainingData  10 2 
TrainingData  11 3 
TrainingData  12 2 

Prediction  13 1 
Prediction  14 2 
Prediction  15 3 
Prediction  16 2 
Prediction  17 1 
Prediction  18 2 
Prediction  19 3 
Prediction  20 2 
Prediction  21 1 
Prediction  22 2 
Prediction  23 3 
Prediction  24 2 

Hy vọng rằng sẽ giúp.

EDIT: Các nhận xét sau, bên dưới ví dụ được sửa đổi để tập trung vào các giá trị trước của mục tiêu (Y) - thay vì các tính năng được lấy từ chỉ mục thời gian (X). Điều này có nghĩa là bạn không thể bắt đầu đào tạo khi bắt đầu chuỗi video - vì bạn cần lịch sử quay lại các giá trị trước đó của Y. Trong ví dụ này, tôi bắt đầu tại x = 9 chỉ vì nó giữ nguyên chuỗi đó.

Bạn cũng có thể xem xét đào tạo về sự khác biệt giữa các giá trị trước đó của Y - sẽ hoạt động tốt hơn khi giá trị tuyệt đối của Y không quan trọng bằng thay đổi tương đối.

+0

Điều này thật xuất sắc, tôi dựa rất nhiều vào ví dụ này (cách tạo đầu vào và đầu ra) Ví dụ này hoạt động hoàn hảo. Nhưng trong "trường hợp thực", tôi không thể sử dụng giá trị X để tính toán, vì đó là một serie thời gian (ví dụ x1 = 3:00 AM, x2 = 4: 00am, x3 = 5: 00am), vì vậy tôi chỉ có một serie thời gian của tất cả các giá trị Y và muốn tìm kiếm tại patten ở đây để giúp dự đoán giá trị Y tiếp theo sẽ là .... nếu điều đó tạo ra sence? – RHC

+0

Chắc chắn - tự nhiên hơn khi sử dụng các giá trị trước đó của mục tiêu (Y) cho chuỗi thời gian - ít nhất là khi thời gian thực tế không liên quan và mối quan hệ giữa các giá trị là nơi mẫu nằm. – reddal

+0

Tôi sẽ chỉnh sửa câu trả lời để thêm ví dụ có thể sửa đổi để huấn luyện các giá trị trước đó của Y. – reddal

Các vấn đề liên quan