BicPAM makes available a set of pattern-based approaches for biclustering. BicPAM integrates existing disperse efforts towards pattern-based biclustering and introduces novel methods to discover biclusters with multiple patterns of expression, varying quality and alternative underlying structures. Additionally, BicPAM allows for parameterizable definition of mining, mapping, and closing options (including search, pattern representation, normalization, discretization, extension, merging and filtering strategies) and alternative ways to deal with missing values and noise.

Authors: Rui Henriques and Sara Madeira
	title = {BicPAM: Pattern-based biclustering for biomedical data analysis},
	journal = {Algorithms for Molecular Biology},
	author = {Henriques, Rui and Madeira, Sara},
	volume = {9},
	year = {2014},
	number = {1},
	pages = {27},
	url = {},
	doi = {10.1186/s13015-014-0027-z},
	issn = {1748-7188},

Synthetic datasets (non-exhaustive set):

Real datasets:



Example on how to use BicPAM:
public class SyntheticTests {

	//bicluster types
	static PatternType[] types = new PatternType[]{PatternType.Constant, PatternType.Additive, PatternType.Multiplicative};

	//mining methods
	static FIM[] pminers = new FIM[]{new CharmClosedFIM(), new AprioriTIDClosedFIM(), new FPGrowthTIDSimpleFIM(), new EclatSimpleFIM()};

	//mapping options
	static Itemizer itemizer = new Itemizer(10, //nr of items
				FillingCriteria.Replace, //missings handler
	//closing options
	Biclusterizer bichandler = new Biclusterizer(
				new BiclusterExtender(0.25,0.25), //criteria for the default extender
				new BiclusterIntraFilter(0.8), 
				new BiclusterBicFilter(0.4), 
				new BiclusterMerger(0.7));

	//Generator properties
	static Background background = Background.Random;
	static String distRowsBics = "Uniform", distColsBics = "Uniform";
	static double noise = 0.05; //5% of noise
	static double missings = 0.02; //2% of missing values
	static int[] alphabets = new int[]{10,20};
	static int[] numRows = new int[]{500,1000,2000,4000};
	static int[] numColumns = new int[]{60,100,200,400};
	static int[] numBics = new int[]{5,10,15,20};
	static int[] minRowsBics = new int[]{15,20,40,60}, maxRowsBics = new int[]{30,40,70,100};
	static int[] minColsBics = new int[]{6,6,6,6}, maxColsBics = new int[]{8,10,14,20};
	public static void main(String[] args) throws Exception{
		for(PatternType type : types){
			for(int alphabet : alphabets){	  
				for(int i = 0, l = numRows.length; i<l; i++){
					BicGenerator generator = new BicGenerator(numRows[i],numColumns[i],numBics[i],background,alphabet);

					Biclusters trueBics = generator.generateKBiclustersWithCoherentEvolutionOnColumns(type,
							distRowsBics, minRowsBics[i], maxRowsBics[i], distColsBics, minColsBics[i], maxColsBics[i]);
					int[][] dataset = generator.getSymbolicExpressionMatrix();
					dataset = generator.putNoise(dataset,noise);
					dataset = generator.putMissings(dataset,missings);
					Dataset data = new Dataset(dataset,true);

					for(FIM pminer : pminers){
						double minRowsSup = findMinRowsSupExpectations(data);
						double minColsSup = findMinColsSupExpectations(data);

						BiclusterMiner bicminer = null;
							bicminer = new ColumnConstantBiclusterMiner(data,pminer,bichandler,itemizer);
						else if(type.equals(PatternType.Additive))
							bicminer = new ColumnAdditiveBiclusterMiner(data,pminer,bichandler,itemizer);
						else bicminer = new ColumnMultiplicativeBiclusterMiner(data,pminer,bichandler,itemizer);

	private static void core(BiclusterMiner bicminer, Biclusters trueBics) throws Exception {
		Biclusters bics = bicminer.mineBiclusters();
		System.out.println("True Bics: " + trueBics.toShortString());
		System.out.println("Foung Bics: " + bics.toShortString());
		System.out.println(, trueBics));