/*
* Encog(tm) Core v3.4 - Java Version
* http://www.heatonresearch.com/encog/
* https://github.com/encog/encog-java-core
* Copyright 2008-2016 Heaton Research, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* For more information on Heaton Research copyrights, licenses
* and trademarks visit:
* http://www.heatonresearch.com/copyright
*/
package org.encog.ml.hmm.train.kmeans;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Hashtable;
import java.util.List;
import org.encog.ml.data.MLDataPair;
import org.encog.ml.data.MLDataSet;
import org.encog.util.kmeans.KMeansUtil;
/**
* Clusters used for the KMeans HMM training algorithm.
*
*/
public class Clusters {
private final Hashtable<MLDataPair, Integer> clustersHash;
private final ArrayList<Collection<MLDataPair>> clusters;
public Clusters(final int k, final MLDataSet observations) {
this.clustersHash = new Hashtable<MLDataPair, Integer>();
this.clusters = new ArrayList<Collection<MLDataPair>>();
final List<MLDataPair> list = new ArrayList<MLDataPair>();
for (final MLDataPair pair : observations) {
list.add(pair);
}
final KMeansUtil<MLDataPair> kmc = new KMeansUtil<MLDataPair>(k, list);
kmc.process();
for (int i = 0; i < k; i++) {
final Collection<MLDataPair> cluster = kmc.get(i);
this.clusters.add(cluster);
for (final MLDataPair element : cluster) {
this.clustersHash.put(element, i);
}
}
}
public Collection<MLDataPair> cluster(final int clusterNb) {
return this.clusters.get(clusterNb);
}
public int cluster(final MLDataPair o) {
return this.clustersHash.get(o);
}
public boolean isInCluster(final MLDataPair o, final int x) {
return cluster(o) == x;
}
public void put(final MLDataPair o, final int clusterNb) {
this.clustersHash.put(o, clusterNb);
this.clusters.get(clusterNb).add(o);
}
public void remove(final MLDataPair o, final int clusterNb) {
this.clustersHash.put(o, -1);
this.clusters.get(clusterNb).remove(o);
}
}