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(); }
public InputObject Clone() { InputObject cloneObject = new InputObject(Name); foreach (string dimensionName in Dimensions.Keys) { cloneObject.Dimensions.Add(dimensionName, Dimensions[dimensionName]); } return cloneObject; }
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(); }
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; }
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; }
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; }
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; }
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(); } }
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; }