示例#1
0
 public FCMSolution(MethodInputResponse input, int clustersNumber)
     : base(input, clustersNumber)
 {
     // random initialization:
     Random gen = new Random();
     // initialize random cluster prototypes:
     for (int j = 0; j < clustersNumber; j++)
     {
         InputObject prototype = new InputObject("");
         foreach (string dimension in input.dimensionsLowerBounds.Keys)
         {
             prototype.Dimensions.Add(dimension, input.dimensionsLowerBounds[dimension] + gen.NextDouble() * (input.dimensionsUpperBounds[dimension] - input.dimensionsLowerBounds[dimension]));
         }
         clusterPrototypes[j] = prototype;
     }
     // initialize random primary memberships:
     for (int j = 0; j < input.InputObjects.Count; j++)
     {
         double[] fuzzyMarkers = new double[clustersNumber + 1];
         fuzzyMarkers[0] = 0;
         fuzzyMarkers[clustersNumber] = 1;
         for (int mcount = 1; mcount < clustersNumber; mcount++)
             do
             {
                 fuzzyMarkers[mcount] = gen.NextDouble();
             } while (fuzzyMarkers[mcount] <= fuzzyMarkers[mcount - 1]);
         for (int mcount = 0; mcount < clustersNumber; mcount++)
             primaryMemberships[mcount, j] = fuzzyMarkers[mcount + 1] - fuzzyMarkers[mcount];
     }
     setTarget();
 }
示例#2
0
        public InputObject Clone()
        {
            InputObject cloneObject = new InputObject(Name);
            foreach (string dimensionName in Dimensions.Keys)
            {
                cloneObject.Dimensions.Add(dimensionName, Dimensions[dimensionName]);
            }

            return cloneObject;
        }
示例#3
0
 public PCMSolution(FCMSolution init, MethodInputResponse input, int clustersCount)
     : base(input, clustersCount)
 {
     eta = new double[clustersNumber];
     D = new double[clustersNumber, methodInput.InputObjects.Count];
     // initialize cluster prototypes (as a result of FCM):
     for (int i = 0; i < clustersNumber; i++)
     {
         clusterPrototypes[i] = new InputObject("");
         clusterPrototypes[i].Dimensions = init.ClusterPrototypes[i].Dimensions;
     }
     // initialize primary memberships (the same way):
     for (int i = 0; i < methodInput.InputObjects.Count; i++)
         for (int j = 0; j < clustersNumber; j++)
             primaryMemberships[j, i] = init.PrimaryMemberships[j, i];
     setD();
     setTarget();
 }
示例#4
0
 private InputObject VectorXnumber(InputObject vector, double number)
 {
     InputObject result = new InputObject("");
     foreach (string dimension in vector.Dimensions.Keys)
     {
         result.Dimensions.Add(dimension, vector.Dimensions[dimension] * number);
     }
     return result;
 }
示例#5
0
 private InputObject VectorPlusVector(InputObject vector1, InputObject vector2)
 {
     InputObject result = new InputObject("");
     foreach (string dimension in vector1.Dimensions.Keys)
     {
         result.Dimensions.Add(dimension, vector1.Dimensions[dimension] + vector2.Dimensions[dimension]);
     }
     return result;
 }
示例#6
0
 protected double GetSqrEuclideanDistance(InputObject x, InputObject centre)
 {
     double dist = 0;
     foreach (string dimension in x.Dimensions.Keys)
     {
         dist += Math.Pow(x.Dimensions[dimension] - centre.Dimensions[dimension], 2);
     }
     return dist;
 }
示例#7
0
        public double GetSignedEuclidean(InputObject x, InputObject centre)
        {
            double dist = 0;
            foreach (string dimension in x.Dimensions.Keys)
            {
                double unsignedDistance = Math.Pow(x.Dimensions[dimension] - centre.Dimensions[dimension], 2);
                if (x.Dimensions[dimension] > centre.Dimensions[dimension])
                {
                    dist += unsignedDistance;
                }
                else
                {
                    dist -= unsignedDistance;
                }

            }
            return dist;
        }
示例#8
0
        private MethodInputResponse GetInput()
        {
            try
            {
                MethodInputResponse inputParameters = new MethodInputResponse();

                //count objects:
                myExcel.Range nameCell = m_ObjWorkSheet1.get_Range("A2", "A2");
                int rowNumber = 2;
                while (nameCell.Text.ToString() != "")
                {
                    //inputParameters.ObjectsQuantity++;
                    InputObject newInputObject = new InputObject(nameCell.Text.ToString());// What's in the A column starting row 2

                    //get the dimensions now; start with the B1 (C1?) and go on along row 1 till run into an empty cell
                   // myExcel.Range dimensionCell = m_ObjWorkSheet1.get_Range("B2", "B2");
                    int columnNumber = 2;
                    myExcel.Range dimensionCell = m_ObjWorkSheet1.get_Range(MethodInputResponse.ALPHABET[columnNumber] + rowNumber.ToString(), MethodInputResponse.ALPHABET[columnNumber] + rowNumber.ToString());

                    while (!String.IsNullOrEmpty(dimensionCell.Text.ToString()))
                    {
                        string dimensionName = "Dimension" + (columnNumber-1);
                        newInputObject.Dimensions.Add(dimensionName, double.Parse(dimensionCell.Text.ToString()));

                        //handle bounds
                        double dimensionLowestValue, dimensionHighestValue;
                        if (inputParameters.dimensionsLowerBounds.TryGetValue(dimensionName, out dimensionLowestValue))
                        {
                            if (dimensionLowestValue > newInputObject.Dimensions[dimensionName])
                            {
                                inputParameters.dimensionsLowerBounds[dimensionName] = newInputObject.Dimensions[dimensionName];
                            }
                        }
                        else
                        {
                            inputParameters.dimensionsLowerBounds.Add(dimensionName, double.PositiveInfinity);
                        }

                        if (inputParameters.dimensionsUpperBounds.TryGetValue(dimensionName, out dimensionHighestValue))
                        {
                            if (dimensionHighestValue < newInputObject.Dimensions[dimensionName])
                            {
                                inputParameters.dimensionsUpperBounds[dimensionName] = newInputObject.Dimensions[dimensionName];
                            }
                        }
                        else
                        {
                            inputParameters.dimensionsUpperBounds.Add(dimensionName, double.NegativeInfinity);
                        }

                        columnNumber++;
                        dimensionCell = m_ObjWorkSheet1.get_Range(MethodInputResponse.ALPHABET[columnNumber] + rowNumber.ToString(), MethodInputResponse.ALPHABET[columnNumber] + rowNumber.ToString());
                    }

                    inputParameters.InputObjects.Add(newInputObject);
                    rowNumber++;
                    nameCell = m_ObjWorkSheet1.get_Range("A" + rowNumber.ToString(), "A" + rowNumber.ToString());
                }

                return inputParameters;
            }
            catch (Exception ex)
            {
                MessageBox.Show("Exception occured while reading input data " + ex.ToString());
                return new MethodInputResponse();
            }
        }
示例#9
0
        public double GetKwonIndex()
        {
            InputObject meanPrototypes = new InputObject("");

            foreach ( string dimension in methodInput.dimensionsLowerBounds.Keys)
            {
                double tempDimension = 0;
                for (int i = 0; i < clustersNumber; i++)
                    tempDimension += clusterPrototypes[i].Dimensions[dimension];
                meanPrototypes.Dimensions[dimension] = tempDimension / clustersNumber;
            }

            double minDist = double.PositiveInfinity;
            for (int i = 0; i < clustersNumber; i++)
                for (int j = 0; j < clustersNumber; j++)
                    if ((i != j) && (GetSqrEuclideanDistance(clusterPrototypes[i], clusterPrototypes[j]) < minDist))
                        minDist = GetSqrEuclideanDistance(clusterPrototypes[i], clusterPrototypes[j]);

            double summand1 = 0;
            for (int i = 0; i < clustersNumber; i++)
                for (int j = 0; j < methodInput.InputObjects.Count; j++)
                    summand1 += Math.Pow(primaryMemberships[i, j], m) * GetSqrEuclideanDistance(methodInput.InputObjects[j], clusterPrototypes[i]);

            double summand2 = 0;
            for (int i = 0; i < clustersNumber; i++)
                summand2 += GetSqrEuclideanDistance(clusterPrototypes[i], meanPrototypes);

            summand2 /= clustersNumber;

            KwonIndex = (summand1 + summand2) / minDist;
            return KwonIndex;
        }