private void SimplePerceptronTrain() { InitializeWeights(); decimal tempSum = 0; for (int i = 0; i < iterationLimit; i++) { foreach (Dots member in ExtractData.GetDataTrain()) { #region Compute Output for (int j = 0; j < numClusters; j++) { decimal a = Activation(member.X, ClusterCenters[j, 0], ClusterSpreads[j]); decimal w = Weights[j]; tempSum += a * w; } #endregion #region UpdateWeights decimal delta = 0; for (int j = 0; j < numClusters; j++) { delta = trainingCoefficient * (member.Y - tempSum) * Activation(member.X, ClusterCenters[j, 0], ClusterSpreads[j]); Weights[j] += delta; } #endregion tempSum = 0; } } }
private void FindSpreads() { ClusterSpreads = new decimal[numClusters]; for (int i = 0; i < numClusters; i++) { ClusterSpreads[i] = Utils.SimpleDistance(ClusterCenters[i, 0], ExtractData.GetDataTrain().Max(x => x.X)) / 2; } }
public RBF(int ParamNumClusters, int numOfIterations) { iterationLimit = numOfIterations; numClusters = ParamNumClusters; AssignClusterCenters(numClusters); InitialCluster(); FindSpreads(); SimplePerceptronTrain(); SimplePerceptronValidate(); List <Dots> asdasd = ExtractData.GetDataTrain(); }
private void ReCalculateCenters() { for (int i = 0; i < numClusters; i++) { decimal count = Convert.ToDecimal(ExtractData.GetDataTrain().Where(x => x.BelongingCluster[numClusters - 1] == i + 1).Count()); decimal summ = ExtractData.GetDataTrain().Where(x => x.BelongingCluster[numClusters - 1] == i + 1).Sum(y => y.X); if (count != 0) { ClusterCenters[i, 0] = summ / count; } } }
private void InitialCluster() { foreach (Dots item in ExtractData.GetDataTrain()) { decimal Dist = 500000m; for (int i = 0; i < numClusters; i++) { item.DistanceToCentersByX[i] = Utils.SimpleDistance(ClusterCenters[i, 0], item.X); } for (int i = 0; i < numClusters; i++) { if (item.DistanceToCentersByX[i] < Dist) { Dist = item.DistanceToCentersByX[i]; item.BelongingCluster[numClusters - 1] = i + 1; } } } ReCalculateCenters(); foreach (Dots item in ExtractData.GetDataValidation()) { decimal Dist = 500000m; for (int i = 0; i < numClusters; i++) { item.DistanceToCentersByX[i] = Utils.SimpleDistance(ClusterCenters[i, 0], item.X); } for (int i = 0; i < numClusters; i++) { if (item.DistanceToCentersByX[i] < Dist) { Dist = item.DistanceToCentersByX[i]; item.BelongingCluster[numClusters - 1] = i + 1; } } } }