Итерация по 2d массиву, заменяющему значения столбцов (сделать код универсальным) - PullRequest
0 голосов
/ 26 октября 2018

У меня есть КОД 2, который я хотел бы сделать универсальным.CODE 2 принимает 2d столбцы массива в качестве значений: x1, x2, x3, x4 и R. И генерирует вероятности.Я хотел бы создать код, который делает этот универсальный для 2d массивов с большим количеством столбцов.

В моем КОДЕ 1 я успешно напечатал столбцы 2d-массива в виде 1d-массива, используя первую часть моего кода.

Затем я хотел бы взять каждый из моих столбцов и заменить их на x1, например, в следующей строке: double p1 = network.performQuery("P(+x1|+R)").Итак, поскольку у меня есть 4 столбца, я хочу цикл, который повторяется для x1, x2, x3, x4.Обратите внимание, что мой последний столбец называется R.

Я думал об этом коде, но он не работает:

CODE 1

  public static void main(String[] args) {

  double  DATA[][] = { 

 // x1,x2,x3,x4,R                            
  { 1, 0, 0, 1, 1 }, // case 1 
  { 1, 1, 1, 1, 0 }, // case 2 
  { 0, 0, 1, 1, 1 }, // case 3 
  { 1, 1, 1, 1, 1 }, // case 4 
  { 0, 0, 0, 1, 0 }, // case 5 
  { 0, 1, 1, 0, 1 }, // case 6 
  { 1, 1, 1, 0, 1 }, // case 7 
  { 0, 0, 0, 0, 1 }, // case 8 
  { 1, 1, 1, 0, 1 }, // case 9 
  { 0, 0, 0, 0, 1 }, // case 10   
      };


for (int j = 0; j < DATA[0].length; j++) {
double[] cols = new double[DATA.length];
    for (int i = 0; i < DATA.length; i++) {
        cols[i] = DATA[i][j];
    }

System.out.println(Arrays.toString(cols)); //prints it right

MLDataSet data = new BasicMLDataSet(DATA,null);
BayesianNetwork network = new BayesianNetwork();
network.createEvent(cols); // in CODE 2, cols = x1 is written between quotation marks


//TRAINING PART

double p1 = network.performQuery("P(+" + cols +"|+R)");
//double p1 = network.performQuery("P(+x1|R)");
System.out.println("x1 probability : " + network.getEvent("" +  cols + "").getTable().findLine(1, new int[] {1}));
System.out.println("Calculated P(+R|+"  + cols+   "): " + p1);
//System.out.println("Calculated P(+R|+x1):" + p1);

}

}

CODE 2

double  DATA[][] = { 

 // x1,x2,x3,x4,R                            
  { 1, 0, 0, 1, 1 }, // case 1 
  { 1, 1, 1, 1, 0 }, // case 2 
  { 0, 0, 1, 1, 1 }, // case 3 
  { 1, 1, 1, 1, 1 }, // case 4 
  { 0, 0, 0, 1, 0 }, // case 5 
  { 0, 1, 1, 0, 1 }, // case 6 
  { 1, 1, 1, 0, 1 }, // case 7 
  { 0, 0, 0, 0, 1 }, // case 8 
  { 1, 1, 1, 0, 1 }, // case 9 
  { 0, 0, 0, 0, 1 }, // case 10   
      };

    MLDataSet data = new BasicMLDataSet(DATA,null);
    BayesianNetwork network = new BayesianNetwork();
    network.createEvent("x1"); 
    network.createEvent("x2");
    network.createEvent("x3");
    network.createEvent("x4");
    network.createEvent("R");
    network.finalizeStructure();

    //TRAINING PART    
    TrainBayesian train = new TrainBayesian(network,data,10);
    train.setInitNetwork(BayesianInit.InitEmpty);
    while(!train.isTrainingDone()) { 

            train.iteration();

            }



    double p1 = network.performQuery("P(+x1|+R)"); 
    double p2 = network.performQuery("P(+x2|+R)"); 
    double p3 = network.performQuery("P(+x3|+R)"); 
    double p4 = network.performQuery("P(+x4|+R)"); 

 System.out.println("x1 probability : " + network.getEvent("x1").getTable().findLine(1, new int[] {1}));
 System.out.println("x2 probability : " + network.getEvent("x2").getTable().findLine(1, new int[] {1}));
 System.out.println("x3 probability : " + network.getEvent("x3").getTable().findLine(1, new int[] {1}));
 System.out.println("x4 probability : " + network.getEvent("x4").getTable().findLine(1, new int[] {1}));
 System.out.println("R probability : " + network.getEvent("R").getTable().findLine(1, new int[] {1}));


 System.out.println("Calculated P(+R|+x1): " + p1);
 System.out.println("Calculated P(+R|+x2): " + p3);
 System.out.println("Calculated P(+R|+x3): " + p4);
 System.out.println("Calculated P(+R|+x4): " + p5);

Не могли бы вы помочь мне?

...