| 494 | } |
| 495 | |
| 496 | @Override |
| 497 | public void trainC(ClassificationDataSet dataSet, ExecutorService threadPool) |
| 498 | { |
| 499 | if(dataSet.getPredicting().getNumOfCategories() > 2) |
| 500 | throw new FailedToFitException("CPM is a binary classifier, it can not be trained on a dataset with " + dataSet.getPredicting().getNumOfCategories() + " classes"); |
| 501 | final int d = dataSet.getNumNumericalVars(); |
| 502 | List<Vec> Wv_p = new ArrayList<Vec>(K); |
| 503 | List<Vec> Wv_n = new ArrayList<Vec>(K); |
| 504 | bp = new DenseVector(K); |
| 505 | bn = new DenseVector(K); |
| 506 | for(int i = 0; i < K; i++) |
| 507 | { |
| 508 | Wv_p.add(new ScaledVector(new DenseVector(d))); |
| 509 | Wv_n.add(new ScaledVector(new DenseVector(d))); |
| 510 | } |
| 511 | MatrixOfVecs W_p = new MatrixOfVecs(Wv_p); |
| 512 | MatrixOfVecs W_n = new MatrixOfVecs(Wv_n); |
| 513 | |
| 514 | sgdTrain(dataSet, W_p, bp, +1, threadPool); |
| 515 | sgdTrain(dataSet, W_n, bn, -1, threadPool); |
| 516 | |
| 517 | this.Wp = new DenseMatrix(W_p); |
| 518 | this.Wn = new DenseMatrix(W_n); |
| 519 | } |
| 520 | |
| 521 | @Override |
| 522 | public void trainC(ClassificationDataSet dataSet) |