Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
04/06/16 12:00:09 (8 years ago)
Author:
abeham
Message:

#2457: adding relational SOM projection for solution network visualization

Location:
branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3

    • Property svn:ignore
      •  

        old new  
        22obj
        33Plugin.cs
         4*.user
  • branches/PerformanceComparison/HeuristicLab.OptimizationExpertSystem/3.3/Views/UnderstandingSolutionsView.cs

    r13722 r13743  
    2828using HeuristicLab.Optimization;
    2929using HeuristicLab.OptimizationExpertSystem.Common;
     30using HeuristicLab.Random;
    3031using System;
    3132using System.Collections.Generic;
     
    4243    public UnderstandingSolutionsView() {
    4344      InitializeComponent();
     45      solutionNetworkProjectionComboBox.SelectedIndex = 0;
    4446    }
    4547
     
    6668    protected override void OnSolutionSeedingPoolChanged() {
    6769      base.OnSolutionSeedingPoolChanged();
    68       UpdateSolutionNetworkAnalysis(similarityComboBox.SelectedItem as ISolutionSimilarityCalculator);
     70      UpdateSolutionNetworkAnalysis(similarityComboBox.SelectedItem as ISolutionSimilarityCalculator, (string)solutionNetworkProjectionComboBox.SelectedItem);
    6971    }
    7072
     
    107109        UpdateSolutionFdcAnalysis(calculator, fdcBetweenBestCheckBox.Checked);
    108110        UpdateSolutionLengthScaleAnalysis(calculator);
    109         UpdateSolutionNetworkAnalysis(calculator);
     111        UpdateSolutionNetworkAnalysis(calculator, (string)solutionNetworkProjectionComboBox.SelectedItem);
    110112      } else {
    111113        solutionsDiversityViewHost.Content = null;
     
    221223    }
    222224
    223     private void UpdateSolutionNetworkAnalysis(ISolutionSimilarityCalculator calculator) {
     225    private void UpdateSolutionNetworkAnalysis(ISolutionSimilarityCalculator calculator, string projection) {
    224226      var series = solutionsNetworkChart.Series["SolutionSeries"];
    225227      var seedingSeries = solutionsNetworkChart.Series["SeedingSolutionSeries"];
     
    235237          }
    236238        }
    237         var coords = MultidimensionalScaling.KruskalShepard(dissimilarities);
     239        DoubleMatrix coords = null;
     240        if (projection == "SOM")
     241          coords = Som(dissimilarities, new MersenneTwister(42), jittering: true);
     242        else coords = MultidimensionalScaling.KruskalShepard(dissimilarities);
    238243        for (var i = 0; i < coords.Rows; i++) {
    239244          var quality = GetQuality(solutionScopes[i], calculator.QualityVariableName) ?? double.NaN;
     
    266271      UpdateSolutionFdcAnalysis(calculator, fdcBetweenBestCheckBox.Checked);
    267272      UpdateSolutionLengthScaleAnalysis(calculator);
    268       UpdateSolutionNetworkAnalysis(calculator);
     273      UpdateSolutionNetworkAnalysis(calculator, (string)solutionNetworkProjectionComboBox.SelectedItem);
    269274    }
    270275
     
    279284      UpdateSolutionFdcAnalysis(calculator, fdcBetweenBestCheckBox.Checked);
    280285      UpdateSolutionLengthScaleAnalysis(calculator);
    281       UpdateSolutionNetworkAnalysis(calculator);
     286      UpdateSolutionNetworkAnalysis(calculator, (string)solutionNetworkProjectionComboBox.SelectedItem);
    282287    }
    283288
     
    285290      if (InvokeRequired) { Invoke((Action<object, EventArgs>)FdcBetweenBestCheckBoxOnCheckedChanged, sender, e); return; }
    286291      UpdateSolutionFdcAnalysis((ISolutionSimilarityCalculator)similarityComboBox.SelectedItem, fdcBetweenBestCheckBox.Checked);
     292    }
     293
     294    private void SolutionNetworkProjectionComboBoxOnSelectedIndexChanged(object sender, EventArgs e) {
     295      if (InvokeRequired) { Invoke((Action<object, EventArgs>)SolutionNetworkProjectionComboBoxOnSelectedIndexChanged, sender, e); return; }
     296      var calculator = (ISolutionSimilarityCalculator)similarityComboBox.SelectedItem;
     297      if (calculator != null) {
     298        calculator.SolutionVariableName = (string)solutionNameComboBox.SelectedItem;
     299        calculator.QualityVariableName = Content.Problem.Problem.Evaluator.QualityParameter.ActualName;
     300      }
     301      UpdateSolutionNetworkAnalysis(calculator, (string)solutionNetworkProjectionComboBox.SelectedItem);
    287302    }
    288303
     
    318333      return dval.Value;
    319334    }
     335
     336    #region SOM projection
     337    /// <summary>
     338    /// This is the online algorithm described in
     339    /// Olteanu, M. and Villa-Vialaneix, N. 2015.
     340    /// On-line relational and multiple relational SOM.
     341    /// Neurocomputing 147, pp. 15-30.
     342    /// </summary>
     343    /// <param name="dissimilarities">The full NxN matrix containing all dissimilarities between N points.</param>
     344    /// <param name="random">The random number generator to use.</param>
     345    /// <param name="somSize">The length of a side of the SOM grid (there are somSize * somSize neurons).</param>
     346    /// <param name="iterations">The amount of iterations to perform in learning.</param>
     347    /// <param name="learningRate">The initial learning rate.</param>
     348    /// <param name="learningRadius">The initial learning radius.</param>
     349    /// <param name="jittering">If the final coordinates should be jittered slightly within the grid.</param>
     350    /// <returns>A matrix of coordinates having N rows and 2 columns.</returns>
     351    private DoubleMatrix Som(DoubleMatrix dissimilarities, IRandom random, int somSize = 5, int iterations = 100, double learningRate = double.NaN, double learningRadius = 5.0, bool jittering = true) {
     352      var K = somSize * somSize;
     353      var N = dissimilarities.Rows;
     354      if (double.IsNaN(learningRate)) learningRate = 1.0 / Math.Sqrt(2.0 * N);
     355      var fixedLearningRate = learningRate / 10.0;
     356      var varLearningRate = 9.0 * fixedLearningRate;
     357      Func<int, int, double> learningRateT = (maxIter, iter) => {
     358        return varLearningRate * ((maxIter - iter) / (double)maxIter) + fixedLearningRate;
     359      };
     360      Func<int, int> getX = (neuron) => neuron % somSize;
     361      Func<int, int> getY = (neuron) => neuron / somSize;
     362      Func<int, int, int, int, double> neighborhood = (maxIter, iter, k, bmu) => {
     363        var sigma = 1.0 * ((maxIter - iter) / (double)maxIter) + 0.0001;
     364        var xK = getX(k);
     365        var yK = getY(k);
     366        var xW = getX(bmu);
     367        var yW = getY(bmu);
     368        var d = (xK - xW) * (xK - xW) + (yK - yW) * (yK - yW);
     369        return Math.Exp(-d / (2.0 * sigma * sigma));
     370      };
     371      var alphas = Enumerable.Range(0, K).Select(k => Enumerable.Range(0, N).Select(_ => random.NextDouble()).ToArray()).ToArray();
     372      // normalize s.t. sum(alphas[k]) = 1
     373      for (var k = 0; k < K; k++) {
     374        var sum = alphas[k].Sum();
     375        for (var i = 0; i < alphas[k].Length; i++) alphas[k][i] /= sum;
     376      }
     377      var oldAlphas = alphas.Select(x => (double[])x.Clone()).ToArray();
     378
     379      for (var iter = 0; iter < iterations; iter++) {
     380        var pointShuffle = Enumerable.Range(0, N).Shuffle(random).ToArray();
     381        for (var p = 0; p < N; p++) {
     382          var i = pointShuffle[p];
     383          var bmu = GetBestMatchingUnit(dissimilarities, alphas, i);
     384
     385          for (var k = 0; k < K; k++) {
     386            for (var j = 0; j < N; j++) {
     387              alphas[k][j] = oldAlphas[k][j] + learningRateT(iterations, iter) * neighborhood(iterations, iter, k, bmu) * ((i == j ? 1.0 : 0.0) - oldAlphas[k][j]);
     388            }
     389          }
     390        }
     391        for (var k = 0; k < K; k++) {
     392          for (var j = 0; j < N; j++) {
     393            oldAlphas[k][j] = alphas[k][j];
     394          }
     395        }
     396      }
     397
     398      var result = new DoubleMatrix(N, 2);
     399      for (var i = 0; i < N; i++) {
     400        var bmu = GetBestMatchingUnit(dissimilarities, alphas, i);
     401        if (!jittering) {
     402          result[i, 0] = getX(bmu);
     403          result[i, 1] = getY(bmu);
     404        } else {
     405          result[i, 0] = getX(bmu) + random.NextDouble() * 0.8;
     406          result[i, 1] = getY(bmu) + random.NextDouble() * 0.8;
     407        }
     408      }
     409      return result;
     410    }
     411
     412    private int GetBestMatchingUnit(DoubleMatrix D, double[][] alphas, int i) {
     413      var bmu = -1;
     414      var minV = double.MaxValue;
     415      for (var k = 0; k < alphas.Length; k++) {
     416        var Daki = 0.0;
     417        var akDak = 0.0;
     418        for (var r = 0; r < D.Rows; r++) {
     419          var Dakr = 0.0;
     420          for (var s = 0; s < D.Rows; s++) {
     421            Dakr += D[r, s] * alphas[k][s];
     422          }
     423          if (r == i) Daki = Dakr;
     424          akDak += alphas[k][r] * Dakr;
     425        }
     426        var v = Daki - 0.5 * akDak;
     427        if (v < minV) {
     428          bmu = k;
     429          minV = v;
     430        }
     431      }
     432      return bmu;
     433    }
     434    #endregion
     435
     436    private DoubleMatrix Mds(DoubleMatrix dissimilarities) {
     437      return MultidimensionalScaling.KruskalShepard(dissimilarities);
     438    }
    320439    #endregion
    321440  }
Note: See TracChangeset for help on using the changeset viewer.