/// <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; }
public cFeedBackMessage Run() { base.Start(); if (!FeedBackMessage.IsSucceed) return FeedBackMessage; if (this.Input.Count > 1) { this.FeedBackMessage = new cFeedBackMessage(false, this); return this.FeedBackMessage; } #region parameters initialization //object _firstValue = base.ListProperties.FindByName("Number of Clusters"); //int NumOfClusters = 0; //if (_firstValue == null) //{ // base.GenerateError("-Number of Clusters- not found !"); // return base.FeedBackMessage; //} //try //{ // cProperty TmpProp = (cProperty)_firstValue; // NumOfClusters = (int)TmpProp.GetValue(); //} //catch (Exception) //{ // base.GenerateError("-Number of Clusters- cast didn't work"); // return base.FeedBackMessage; //} #endregion cMachineLearning MachineLearning = new cMachineLearning(/*cWell.GlobalInfo*/null); if (ParamAlgoForClustering == null) ParamAlgoForClustering = MachineLearning.AskAndGetClusteringAlgo(); if (ParamAlgoForClustering == null) { FeedBackMessage.IsSucceed = false; FeedBackMessage.Message = "Invalid Parameters"; return FeedBackMessage; } MachineLearning.SelectedClusterer = MachineLearning.BuildClusterer(ParamAlgoForClustering, this.Input); if (MachineLearning.SelectedClusterer != null) { cLinearize L = new cLinearize(); L.SetInputData(this.Input); L.Run(); cExtendedTable Test = L.GetOutPut(); ClusterEvaluation CE = MachineLearning.EvaluteAndDisplayClusterer(/*richTextBoxInfoClustering*/null, null, MachineLearning.CreateInstancesWithoutClass(this.Input)); double[] Assign = CE.getClusterAssignments(); base.Output = new cExtendedTable(this.Input); cExtendedList CL = new cExtendedList("Class ID"); CL.SetInfo(CE.clusterResultsToString()); base.Output.Add(CL); for (int i = 0; i < Assign.Length; i++) base.Output[base.Output.Count-1].Add(Assign[i]); } base.End(); return FeedBackMessage; }
public cFeedBackMessage Run(bool IsDisplayResults) { cMachineLearning MachineLearning = new cMachineLearning(/*cWell.GlobalInfo*/null); ParamAlgoForClustering = MachineLearning.AskAndGetClusteringAlgo(); if (MinObjectsNumber == -1) MinObjectsNumber = (cGlobalInfo.CurrentScreening.Columns * cGlobalInfo.CurrentScreening.Rows * (int)cGlobalInfo.OptionsWindow.numericUpDownSystemMinWellRatio.Value) / 100; foreach (cPlate CurrentPlate in PlatesToProcess) { cExtendedTable CurrentPlateResult = null; foreach (var item in this.DescriptorsToProcess) { cExtendedTable ET = CurrentPlate.GetAverageValueList(item, false); ET.Name = item.GetName(); cExtendedTable ResultTable = this.GenerateArtifactMessage(ET, CurrentPlate); ResultTable.ListRowNames = new List<string>(); ResultTable.ListRowNames.Add(item.GetName()); if (CurrentPlateResult == null) CurrentPlateResult = new cExtendedTable(ResultTable); else { cMerge M = new cMerge(); M.IsHorizontal = false; M.SetInputData(CurrentPlateResult, ResultTable); M.Run(); CurrentPlateResult = M.GetOutPut(); } } CurrentPlateResult.Name = CurrentPlate.GetName(); CurrentPlateResult.Tag = CurrentPlate; this.Output.Add(CurrentPlateResult); } this.Output.Name = "Systematic Errors (" + PlatesToProcess.Count + " plate(s))"; if (IsDisplayResults) { cDisplayToWindow DTW = new cDisplayToWindow(); cDesignerMultiChoices DMC = new cDesignerMultiChoices(); foreach (var item in this.Output) { cDesignerSplitter DS = new cDesignerSplitter(); DS.Orientation = System.Windows.Forms.Orientation.Horizontal; DS.Title = item.Name; cViewerTable VT = new cViewerTable(); VT.SetInputData(item); VT.DigitNumber = 0; VT.Run(); DS.SetInputData(VT.GetOutPut()); cViewerHeatMap VHM = new cViewerHeatMap(); VHM.SetInputData(item); VHM.IsAutomatedMinMax = false; VHM.Min = 0; VHM.Max = 1; VHM.Run(); DS.SetInputData(VHM.GetOutPut()); DS.Run(); cExtendedControl TmpXCtrl = DS.GetOutPut(); TmpXCtrl.Tag = item.Tag; DMC.SetInputData(TmpXCtrl); } DMC.Run(); DTW.SetInputData(DMC.GetOutPut()); DTW.Title = "Systematic Errors [" + PlatesToProcess.Count + " plate(s)]"; DTW.Run(); DTW.Display(); //cDisplayListExtendedTable DLET = new cDisplayListExtendedTable(); //DLET.SetInputData(this.Output); //return DLET.Run(); } return FeedBackMessage; }