/// <summary> /// perform an EM clustering over the entire screening data /// </summary> /// <param name="ClassNumber"></param> private string ClusteringEMGlobalScreen(int ClassNumber, FormForEMInfo WindowEMinfo) { weka.core.Instances Ninsts = cGlobalInfo.CurrentScreening.CreateInstancesWithoutClass();// CreateInstanceWithoutClass(CurrentTable); weka.clusterers.EM EMCluster = new EM(); EMCluster.setNumClusters(ClassNumber); EMCluster.setMaxIterations((int)WindowEMinfo.numericUpDownMaxIterations.Value); EMCluster.setMinStdDev((double)WindowEMinfo.numericUpDownMinStdev.Value); EMCluster.setSeed((int)WindowEMinfo.numericUpDownSeedNumber.Value); EMCluster.buildClusterer(Ninsts); EMCluster.getClusterModelsNumericAtts(); if (EMCluster.numberOfClusters() > cGlobalInfo.ListWellClasses.Count) { richTextBoxInfoClustering.AppendText("\nCluster Number: more than " + cGlobalInfo.ListWellClasses.Count + ", clustering not operated.\n"); return null; } richTextBoxInfoClustering.AppendText("\n" + EMCluster.numberOfClusters() + " cluster(s) identified"); ClusterEvaluation eval = new ClusterEvaluation(); eval.setClusterer(EMCluster); eval.evaluateClusterer(Ninsts); cGlobalInfo.CurrentScreening.AssignClass(eval.getClusterAssignments()); return eval.clusterResultsToString(); }
/// <summary> /// Perform an EM clustering on each plate independantely /// </summary> /// <param name="CurrentPlateToProcess">the plate to process</param> /// <param name="ClassNumber">Number of class</param> private void ClusteringEMSinglePlate(cPlate CurrentPlateToProcess, int ClassNumber, FormForEMInfo WindowEMinfo) { weka.core.Instances Ninsts = CurrentPlateToProcess.CreateInstancesWithoutClass();// CreateInstanceWithoutClass(CurrentTable); weka.clusterers.EM EMCluster = new EM(); EMCluster.setNumClusters(ClassNumber); EMCluster.setMaxIterations((int)WindowEMinfo.numericUpDownMaxIterations.Value); EMCluster.setMinStdDev((double)WindowEMinfo.numericUpDownMinStdev.Value); EMCluster.setSeed((int)WindowEMinfo.numericUpDownSeedNumber.Value); EMCluster.buildClusterer(Ninsts); EMCluster.getClusterModelsNumericAtts(); if (EMCluster.numberOfClusters() > cGlobalInfo.ListWellClasses.Count) { richTextBoxInfoClustering.AppendText("\n Plate " + CurrentPlateToProcess.GetName() + ", cluster Number: more than " + cGlobalInfo.ListWellClasses.Count + ", clustering not operated.\n"); return; } else richTextBoxInfoClustering.AppendText("\n" + CurrentPlateToProcess.GetName() + ": " + EMCluster.numberOfClusters() + " cluster(s)"); ClusterEvaluation eval = new ClusterEvaluation(); eval.setClusterer(EMCluster); eval.evaluateClusterer(Ninsts); CurrentPlateToProcess.AssignClass(eval.getClusterAssignments()); }
/// <summary> /// display a GUI and generate the WEKA based clusterer /// </summary> /// <param name="InstancesList">list of the weka instance</param> /// <returns>weka clusterer</returns> public Clusterer BuildClusterer(cParamAlgo ClusteringAlgo, cExtendedTable Input) { this.InputTable = Input; foreach (var item in Input) { this.ListDescriptors.Add(item.Name); } cListValuesParam Parameters = ClusteringAlgo.GetListValuesParam(); Clusterer ClustererToReturn = null; Instances ListInstancesWithoutClasses = CreateInstancesWithoutClass(Input); #region EM if (ClusteringAlgo.Name == "EM") { ClustererToReturn = new EM(); if (Parameters.ListCheckValues.Get("checkBoxAutomatedClassNum").Value) ((EM)ClustererToReturn).setNumClusters(-1); else ((EM)ClustererToReturn).setNumClusters((int)Parameters.ListDoubleValues.Get("numericUpDownNumClasses").Value); ((EM)ClustererToReturn).setMaxIterations((int)Parameters.ListDoubleValues.Get("numericUpDownMaxIterations").Value); ((EM)ClustererToReturn).setMinStdDev((double)Parameters.ListDoubleValues.Get("numericUpDownMinStdev").Value); ((EM)ClustererToReturn).setSeed((int)Parameters.ListDoubleValues.Get("numericUpDownSeedNumber").Value); ClustererToReturn.buildClusterer(ListInstancesWithoutClasses); this.NumberOfClusters = ClustererToReturn.numberOfClusters(); } #endregion #region K Means else if (ClusteringAlgo.Name == "K-Means") { ClustererToReturn = new SimpleKMeans(); ((SimpleKMeans)ClustererToReturn).setNumClusters((int)Parameters.ListDoubleValues.Get("numericUpDownNumClasses").Value); ((SimpleKMeans)ClustererToReturn).setSeed((int)Parameters.ListDoubleValues.Get("numericUpDownSeedNumber").Value); string DistanceType = (string)Parameters.ListTextValues.Get("comboBoxDistance").Value; if (DistanceType == "Euclidean") { EuclideanDistance ED = new EuclideanDistance(); ED.setDontNormalize(!(bool)Parameters.ListCheckValues.Get("checkBoxNormalize").Value); ((SimpleKMeans)ClustererToReturn).setDistanceFunction(ED); } else if (DistanceType == "Manhattan") { ManhattanDistance MD = new ManhattanDistance(); MD.setDontNormalize(!(bool)Parameters.ListCheckValues.Get("checkBoxNormalize").Value); ((SimpleKMeans)ClustererToReturn).setDistanceFunction(MD); } else return null; ClustererToReturn.buildClusterer(ListInstancesWithoutClasses); this.NumberOfClusters = ClustererToReturn.numberOfClusters(); } #endregion //#region K Means++ //else if (ClusteringAlgo.Name == "K-Means++") //{ // ClustererToReturn = new SimpleKMeans(); // ((SimpleKMeans)ClustererToReturn).setNumClusters((int)Parameters.ListDoubleValues.Get("numericUpDownNumClasses").Value); // ((SimpleKMeans)ClustererToReturn).setSeed((int)Parameters.ListDoubleValues.Get("numericUpDownSeedNumber").Value); // string DistanceType = (string)Parameters.ListTextValues.Get("comboBoxDistance").Value; // if (DistanceType == "Euclidean") // { // EuclideanDistance ED = new EuclideanDistance(); // ED.setDontNormalize(!(bool)Parameters.ListCheckValues.Get("checkBoxNormalize").Value); // ((SimpleKMeans)ClustererToReturn).setDistanceFunction(ED); // } // else if (DistanceType == "Manhattan") // { // ManhattanDistance MD = new ManhattanDistance(); // MD.setDontNormalize(!(bool)Parameters.ListCheckValues.Get("checkBoxNormalize").Value); // ((SimpleKMeans)ClustererToReturn).setDistanceFunction(MD); // } // else return null; // ClustererToReturn.buildClusterer(ListInstancesWithoutClasses); // this.NumberOfClusters = ClustererToReturn.numberOfClusters(); //} //#endregion #region hierarchical else if (ClusteringAlgo.Name == "Hierarchical") { ClustererToReturn = new weka.clusterers.HierarchicalClusterer(); string OptionDistance = " -N " + (int)Parameters.ListDoubleValues.Get("numericUpDownNumClasses").Value; string DistanceType = (string)Parameters.ListTextValues.Get("comboBoxDistance").Value; OptionDistance += " -A \"weka.core."; switch (DistanceType) { case "Euclidean": OptionDistance += "EuclideanDistance"; break; case "Manhattan": OptionDistance += "ManhattanDistance"; break; case "Chebyshev": OptionDistance += "ChebyshevDistance"; break; default: break; } if (!(bool)Parameters.ListCheckValues.Get("checkBoxNormalize").Value) OptionDistance += " -D"; OptionDistance += " -R "; OptionDistance += "first-last\""; string WekaOption = "-L " + (string)Parameters.ListTextValues.Get("comboBoxLinkType").Value + OptionDistance; ((HierarchicalClusterer)ClustererToReturn).setOptions(weka.core.Utils.splitOptions(WekaOption)); ClustererToReturn.buildClusterer(ListInstancesWithoutClasses); this.NumberOfClusters = ClustererToReturn.numberOfClusters(); } #endregion #region Farthest First else if (ClusteringAlgo.Name == "FarthestFirst") { ClustererToReturn = new weka.clusterers.FarthestFirst(); ((FarthestFirst)ClustererToReturn).setNumClusters((int)Parameters.ListDoubleValues.Get("numericUpDownNumClasses").Value); ((FarthestFirst)ClustererToReturn).setSeed((int)Parameters.ListDoubleValues.Get("numericUpDownSeedNumber").Value); ClustererToReturn.buildClusterer(ListInstancesWithoutClasses); this.NumberOfClusters = ClustererToReturn.numberOfClusters(); } #endregion #region CobWeb else if (ClusteringAlgo.Name == "CobWeb") { ClustererToReturn = new weka.clusterers.Cobweb(); ((Cobweb)ClustererToReturn).setSeed((int)Parameters.ListDoubleValues.Get("numericUpDownSeedNumber").Value); ((Cobweb)ClustererToReturn).setAcuity((double)Parameters.ListDoubleValues.Get("numericUpDownAcuity").Value); ((Cobweb)ClustererToReturn).setCutoff((double)Parameters.ListDoubleValues.Get("numericUpDownCutOff").Value); ClustererToReturn.buildClusterer(ListInstancesWithoutClasses); this.NumberOfClusters = ClustererToReturn.numberOfClusters(); } #endregion #region Manual else if (ClusteringAlgo.Name == "Manual") { string DescriptorName = (string)Parameters.ListTextValues.Get("comboBoxForDescriptorManualClustering").Value; // this.Classes = new double[ListInstancesWithoutClasses.numInstances()]; for (int IdxPt = 0; IdxPt < this.Classes.Count / 2; IdxPt++) { this.Classes[IdxPt] = 2; } this.NumberOfClusters = 2; // break; //int IdxDesc = -1; //foreach (string item in this.ListDescriptors) //{ // IdxDesc++; // if (item == DescriptorName) break; //} //int Idx=0; //foreach (Instance item in ListInstancesWithoutClasses) //{ // this.Classes.Add(((int)item.value(IdxDesc)) % cGlobalInfo.ListCellularPhenotypes.Count); //} //// re - ordonner les valeurs du discripteur afin que les classes se suivent sans laisser de classe vide !! //this.NumberOfClusters = cGlobalInfo.ListCellularPhenotypes.Count; } #endregion else { System.Windows.Forms.MessageBox.Show("Clustering method not implemented !", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return null; } return ClustererToReturn; }
/// <summary> /// Perform an EM clustering on each plate independantely /// </summary> /// <param name="CurrentPlateToProcess">the plate to process</param> /// <param name="ClassNumber">Number of class</param> private void ClusteringEMSinglePlate(cPlate CurrentPlateToProcess, int ClassNumber, FormForEMInfo WindowEMinfo) { weka.core.Instances Ninsts = CurrentPlateToProcess.CreateInstancesWithoutClass();// CreateInstanceWithoutClass(CurrentTable); if (Ninsts.numInstances() == 0) { MessageBox.Show("No active wells !", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } weka.clusterers.EM EMCluster = new EM(); EMCluster.setNumClusters(ClassNumber); EMCluster.setMaxIterations((int)WindowEMinfo.numericUpDownMaxIterations.Value); EMCluster.setMinStdDev((double)WindowEMinfo.numericUpDownMinStdev.Value); EMCluster.setSeed((int)WindowEMinfo.numericUpDownSeedNumber.Value); EMCluster.buildClusterer(Ninsts); EMCluster.getClusterModelsNumericAtts(); if (EMCluster.numberOfClusters() > GlobalInfo.GetNumberofDefinedClass()) { richTextBoxInfoClustering.AppendText("\n Plate " + CurrentPlateToProcess.Name + ", cluster Number: more than " + GlobalInfo.GetNumberofDefinedClass() + ", clustering not operated.\n"); return; } else richTextBoxInfoClustering.AppendText("\n" + CurrentPlateToProcess.Name + ": " + EMCluster.numberOfClusters() + " cluster(s)"); ClusterEvaluation eval = new ClusterEvaluation(); eval.setClusterer(EMCluster); eval.evaluateClusterer(Ninsts); CurrentPlateToProcess.AssignClass(eval.getClusterAssignments()); }
/// <summary> /// Perform an EM clustering on each plate independantely /// </summary> /// <param name="CurrentPlateToProcess">the plate to process</param> /// <param name="ClassNumber">Number of class</param> private void ClusteringEMSinglePlate(cPlate CurrentPlateToProcess, int ClassNumber) { weka.core.Instances Ninsts = CurrentPlateToProcess.CreateInstancesWithoutClass();// CreateInstanceWithoutClass(CurrentTable); weka.clusterers.EM EMCluster = new EM(); EMCluster.setNumClusters(ClassNumber); EMCluster.buildClusterer(Ninsts); EMCluster.getClusterModelsNumericAtts(); if (EMCluster.numberOfClusters() > GlobalInfo.GetNumberofDefinedClass()) { richTextBoxInfoClustering.AppendText("\n Plate " + CurrentPlateToProcess.Name + ", cluster Number: more than " + GlobalInfo.GetNumberofDefinedClass() + ", clustering not operated.\n"); return; } else richTextBoxInfoClustering.AppendText("\n" + CurrentPlateToProcess.Name + ": " + EMCluster.numberOfClusters() + " cluster(s)"); ClusterEvaluation eval = new ClusterEvaluation(); eval.setClusterer(EMCluster); eval.evaluateClusterer(Ninsts); CurrentPlateToProcess.AssignClass(eval.getClusterAssignments()); }
/// <summary> /// perform an EM clustering over the entire screening data /// </summary> /// <param name="ClassNumber"></param> private void ClusteringEMGlobalScreen(int ClassNumber) { weka.core.Instances Ninsts = CompleteScreening.CreateInstancesWithoutClass();// CreateInstanceWithoutClass(CurrentTable); weka.clusterers.EM EMCluster = new EM(); EMCluster.setNumClusters(ClassNumber); EMCluster.buildClusterer(Ninsts); EMCluster.getClusterModelsNumericAtts(); if (EMCluster.numberOfClusters() > GlobalInfo.GetNumberofDefinedClass()) { richTextBoxInfoClustering.AppendText("\nCluster Number: more than " + GlobalInfo.GetNumberofDefinedClass() + ", clustering not operated.\n"); return; } else richTextBoxInfoClustering.AppendText("\n" + EMCluster.numberOfClusters() + " cluster(s) identified"); ClusterEvaluation eval = new ClusterEvaluation(); eval.setClusterer(EMCluster); eval.evaluateClusterer(Ninsts); CompleteScreening.AssignClass(eval.getClusterAssignments()); }