@Override protected Likelihood createInstance() { return new Likelihood(pointDimension); } };
@Override public void setVerbose(boolean verbose) { selectInitial.setVerbose(verbose); this.verbose = verbose; }
@Override public AssignCluster<double[]> copy() { return new AssignGmm_F64(this); }
@Override public int assign(double[] point) { int indexBest = -1; double scoreBest = 0; for (int i = 0; i < mixture.size(); i++) { double score = glm.getLikelihood(i).likelihood(point); if( score > scoreBest ) { scoreBest = score; indexBest = i; } } return indexBest; }
/** * Copy constructor */ public AssignGmm_F64( AssignGmm_F64 original ) { mixture = new ArrayList<GaussianGmm_F64>(); for (int i = 0; i < original.mixture.size(); i++) { GaussianGmm_F64 o = original.mixture.get(i); mixture.add(o.copy()); } int N = mixture.get(0).mean.getNumElements(); glm = new GaussianLikelihoodManager(N,mixture); glm.precomputeAll(); }
/** * <p> * High level interface for creating GMM cluster. If more flexibility is needed (e.g. custom seeds) * then create and instance of {@link ExpectationMaximizationGmm_F64} directly * </p> * * <p>WARNING: DEVELOPMENTAL AND IS LIKELY TO FAIL HORRIBLY</p> * * @param maxIterations Maximum number of iterations it will perform. * @param maxConverge Maximum iterations allowed before convergence. Re-seeded if it doesn't converge. * @param convergeTol Distance based convergence tolerance. Try 1e-8 * @return ExpectationMaximizationGmm_F64 */ public static ExpectationMaximizationGmm_F64 gaussianMixtureModelEM_F64( int maxIterations, int maxConverge , double convergeTol) { StandardKMeans_F64 kmeans = kMeans_F64(null,maxIterations,maxConverge,convergeTol); SeedFromKMeans_F64 seeds = new SeedFromKMeans_F64(kmeans); return new ExpectationMaximizationGmm_F64(maxIterations,convergeTol,seeds); }
@Override public void init(final int pointDimension, long randomSeed) { mixture = new FastQueue<GaussianGmm_F64>(GaussianGmm_F64.class,true ) { @Override protected GaussianGmm_F64 createInstance() { return new GaussianGmm_F64(pointDimension); } }; selectInitial.init(pointDimension,randomSeed); if( dx.length < pointDimension ) dx = new double[pointDimension]; likelihoodManager = new GaussianLikelihoodManager(pointDimension,mixture.toList()); }
public GaussianGmm_F64 copy() { GaussianGmm_F64 out = new GaussianGmm_F64(mean.getNumElements()); out.mean.set(mean); out.covariance.set(covariance); out.weight = weight; return out; }
@Override public int assign(double[] point) { int indexBest = -1; double scoreBest = 0; for (int i = 0; i < mixture.size(); i++) { double score = glm.getLikelihood(i).likelihood(point); if( score > scoreBest ) { scoreBest = score; indexBest = i; } } return indexBest; }
@Override public ComputeClusters<double[]> createClustersAlg( boolean hint ) { if( hint ) { return new ExpectationMaximizationGmm_F64(1000, 1e-8, seeds); } else { InitializeStandard_F64 kseeds = new InitializeStandard_F64(); StandardKMeans_F64 kmeans = new StandardKMeans_F64(1000,1000,1e-8,kseeds); SeedFromKMeans_F64 seeds = new SeedFromKMeans_F64(kmeans); return new ExpectationMaximizationGmm_F64(1000, 1e-8, seeds); } } }
@Override public void init(final int pointDimension, long randomSeed) { mixture = new FastQueue<GaussianGmm_F64>(GaussianGmm_F64.class,true ) { @Override protected GaussianGmm_F64 createInstance() { return new GaussianGmm_F64(pointDimension); } }; selectInitial.init(pointDimension,randomSeed); if( dx.length < pointDimension ) dx = new double[pointDimension]; likelihoodManager = new GaussianLikelihoodManager(pointDimension,mixture.toList()); }
@Override public AssignCluster<double[]> copy() { return new AssignGmm_F64(this); }
public GaussianGmm_F64 copy() { GaussianGmm_F64 out = new GaussianGmm_F64(mean.getNumElements()); out.mean.set(mean); out.covariance.set(covariance); out.weight = weight; return out; }
@Override protected Likelihood createInstance() { return new Likelihood(pointDimension); } };
@Override public void setVerbose(boolean verbose) { selectInitial.setVerbose(verbose); this.verbose = verbose; }
@Override public void assign(double[] point, double[] fit) { double total = 0; for (int i = 0; i < mixture.size(); i++) { total += fit[i] = glm.getLikelihood(i).likelihood(point); } for (int i = 0; i < mixture.size(); i++) { fit[i] /= total; } }
@Override public AssignCluster<double[]> getAssignment() { return new AssignGmm_F64(mixture.toList()); }
public static GaussianGmm_F64 createGaussian( double mean , double var ) { GaussianGmm_F64 ret = new GaussianGmm_F64(1); ret.mean.set(0,0,mean); ret.covariance.set(0,0,var); ret.weight = 2; return ret; } }
@Override public void assign(double[] point, double[] fit) { double total = 0; for (int i = 0; i < mixture.size(); i++) { total += fit[i] = glm.getLikelihood(i).likelihood(point); } for (int i = 0; i < mixture.size(); i++) { fit[i] /= total; } }
@Override public AssignCluster<double[]> getAssignment() { return new AssignGmm_F64(mixture.toList()); }