Esempio n. 1
0
        /// <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;
        }
Esempio n. 2
0
        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;
        }