| 23 | } |
| 24 | |
| 25 | void naive_bayes_train(float *priors, array &mu, array &sig2, |
| 26 | const array &train_feats, const array &train_classes, |
| 27 | int num_classes) { |
| 28 | const int feat_len = train_feats.dims(0); |
| 29 | const int num_samples = train_classes.elements(); |
| 30 | |
| 31 | // Get mean and variance from trianing data |
| 32 | mu = constant(0, feat_len, num_classes); |
| 33 | sig2 = constant(0, feat_len, num_classes); |
| 34 | |
| 35 | for (int ii = 0; ii < num_classes; ii++) { |
| 36 | array idx = where(train_classes == ii); |
| 37 | array train_feats_ii = lookup(train_feats, idx, 1); |
| 38 | |
| 39 | mu(span, ii) = mean(train_feats_ii, 1); |
| 40 | |
| 41 | // Some pixels are always 0. Add a small variance. |
| 42 | sig2(span, ii) = var(train_feats_ii, AF_VARIANCE_SAMPLE, 1) + 0.01; |
| 43 | |
| 44 | // Calculate priors |
| 45 | priors[ii] = (float)idx.elements() / (float)num_samples; |
| 46 | } |
| 47 | |
| 48 | mu.eval(); |
| 49 | sig2.eval(); |
| 50 | } |
| 51 | |
| 52 | array naive_bayes_predict(float *priors, const array &mu, const array &sig2, |
| 53 | const array &test_feats, int num_classes) { |