From f0bac8410e4dd45f328bbd0c6b924d1c72e6d6dd Mon Sep 17 00:00:00 2001
From: Walt Mankowski <wmankowski@coe.drexel.edu>
Date: Thu, 28 Jul 2016 16:14:34 -0400
Subject: [PATCH] added relicates and numiters to gui

fixed bug in summing logLiklihoods
still having issues with randomness
---
 src/ImageJ/Demo_Pixel_Replication.class | Bin 9246 -> 10253 bytes
 src/ImageJ/Demo_Pixel_Replication.java  |  77 ++++++++++++++++++++----
 2 files changed, 66 insertions(+), 11 deletions(-)

diff --git a/src/ImageJ/Demo_Pixel_Replication.class b/src/ImageJ/Demo_Pixel_Replication.class
index aae38ecec2287eee0c651123e85a142620694308..4fb78d61790c294acb0c5eec90bc6d1b5026c554 100644
GIT binary patch
delta 5512
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
Vj3*gCFrH%IWIWBl$asc<69CB|<evZl

delta 4445
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

diff --git a/src/ImageJ/Demo_Pixel_Replication.java b/src/ImageJ/Demo_Pixel_Replication.java
index 85f5fdb..345dd02 100755
--- a/src/ImageJ/Demo_Pixel_Replication.java
+++ b/src/ImageJ/Demo_Pixel_Replication.java
@@ -21,6 +21,8 @@ public class Demo_Pixel_Replication implements PlugInFilter {
 
     int k;
     Random rnd;
+    int Replicates = 5;
+    int MaxIter = 100;
 
     // foreground points in ip
     ArrayList<Point2f> UniqPts;
@@ -44,12 +46,17 @@ public class Demo_Pixel_Replication implements PlugInFilter {
         String[] kChoices = {"2", "3", "4", "5", "6"};
 
         GenericDialog gd = new GenericDialog("Number of ellipses");
-        gd.addChoice("Number of ellipses:", kChoices, kChoices[0]);
+        gd.addChoice("Number of ellipses:", kChoices, kChoices[2]);
+        gd.addNumericField("Number of replicates", Replicates, 0);
+        gd.addNumericField("Maximum number of iterations", MaxIter, 0);
+
         gd.showDialog();
         if (gd.wasCanceled()) {
             return false;
         } else {
             k = gd.getNextChoiceIndex() + 2;
+            Replicates = (int) gd.getNextNumber();
+            MaxIter = (int) gd.getNextNumber();
             return true;
         }
     }
@@ -72,8 +79,8 @@ public class Demo_Pixel_Replication implements PlugInFilter {
                 if (n > 0) {
                     Point2f p = new Point2f(x, y);
                     UniqPts.add(p);
-                    // long rep = Math.round((double)n/10.0);
-                    long rep = 1;
+                    long rep = Math.round((double)n/1.0);
+                    // long rep = 1;
                     if (rep == 0) rep = 1;
                     for (int i = 0; i < rep; i++) {
                         PrPts.add(p);
@@ -176,42 +183,83 @@ public class Demo_Pixel_Replication implements PlugInFilter {
     private EM computeGMM(int k) {
         EM bestEm = new EM();
         double bestScore = -1e300;
+        int bestI = 0;
+        // Mat initMeans = randomInitMeans(k);
 
-        for (int i = 1; i <= 10; i++) {
+        for (int i = 1; i <= Replicates; i++) {
             IJ.log(String.format("replicate %d", i));
             EM em = new EM();
             Mat logLikelihoods = new Mat(PrPts.size(), 1, CV_64FC1);
             Mat labels = new Mat(PrPts.size(), 1, CV_32FC1);
+            Mat covs0 = makeInitCovs(k);
+            Mat weights0 = makeInitWeights(k);
             em.set("nclusters", k);
             em.set("covMatType", EM.COV_MAT_GENERIC);
-            em.set("maxIters", 1000);
+            em.set("maxIters", MaxIter);
             em.set("epsilon", 1e-6);
 
             // Mat emMat = PrPts2Mat(PrPts, 0.10);
             Mat emMat = PrPts2Mat(PrPts);
             Mat initMeans = randomInitMeans(k);
             // em.trainE(emMat, initMeans, noArray());
-            em.trainE(emMat, initMeans, new Mat(), new Mat(), logLikelihoods, labels, new Mat());
-            double score = addUp(logLikelihoods.row(0));
+            // if (!em.trainE(emMat, initMeans, new Mat(), new Mat(), logLikelihoods, labels, new Mat()))
+            // try {
+                IJ.log("calling trainE");
+                if (!em.trainE(emMat, initMeans, covs0, weights0, logLikelihoods, labels, new Mat()))
+                // if (!em.train(emMat, logLikelihoods, new Mat(), new Mat()))
+                    IJ.log("trainE() returned false!");
+            // } catch (Exception e) {
+            //     IJ.log(String.format("exception calling trainE: %s", e.getMessage()));
+            // }
+            double score = addUp(logLikelihoods.col(0));
             IJ.log(String.format("score = %f", score));
             if (score > bestScore) {
                 bestEm = em;
                 bestScore = score;
+                bestI = i;
             }
         }
 
+        IJ.log(String.format("best replicate was %d", bestI));
         return bestEm;
     }
 
     private double addUp(Mat m) {
         DoubleIndexer idx = m.createIndexer();
         double total = 0;
-        for (int c = 0; c < m.cols(); c++)
-            total += idx.get(0, c);
+        for (int r = 0; r < m.rows(); r++) {
+            total += idx.get(r, 0);
+        }
 
         return total;
     }
 
+    private Mat makeInitCovs(int k) {
+        // Mat covs0 = new Mat(1, 4*k, CV_64FC1); 
+        // DoubleIndexer idx = covs0.createIndexer();
+        // for (int i = 0; i < 4*k; i += 4) {
+        //     idx.put(0, i,   1);
+        //     idx.put(0, i+1, 0);
+        //     idx.put(0, i+2, 0);
+        //     idx.put(0, i+3, 1);
+        // }
+
+        // return covs0;
+        return new Mat();
+    }
+
+    private Mat makeInitWeights(int k) {
+        // Mat weights0 = new Mat(k, 1, CV_64FC1);
+        // DoubleIndexer idx = weights0.createIndexer();
+        // double weight = 1/k;
+
+        // for (int r = 0; r < k; r++)
+        //     idx.put(r, 0, weight);
+
+        // return weights0;
+        return new Mat();
+    }
+
     private EllipseRoi makeEllipseRoi(Mat center, Mat unitVec, double A, double B) {
         Mat end1 = new Mat();
         Mat end2 = new Mat();
@@ -230,8 +278,8 @@ public class Demo_Pixel_Replication implements PlugInFilter {
     // We're using a simple naive algorithm since we assume k << n.
     private Mat randomInitMeans(int k) {
         HashSet<Integer> used = new HashSet<Integer>();
-        Mat means = new Mat(k, 2, CV_32FC1);
-        FloatIndexer meansIdx = means.createIndexer();
+        Mat means = new Mat(k, 2, CV_64FC1);
+        DoubleIndexer meansIdx = means.createIndexer();
 
         int i = 0;
         while (i < k) {
@@ -245,6 +293,13 @@ public class Demo_Pixel_Replication implements PlugInFilter {
                 i++;
             }
         }
+
+        for (int r = 0; r < means.rows(); r++) {
+            for (int c = 0; c < means.cols(); c++) {
+                IJ.log(String.format("means(%d,%d) = %f", r, c, meansIdx.get(r, c)));
+            }
+        }
+
         return means;
     }
 }
-- 
GitLab