Free cookie consent management tool by TermsFeed Policy Generator

source: branches/QAP/HeuristicLab.Analysis/3.3/Tests/MultidimensionalScalingTest.cs @ 5873

Last change on this file since 5873 was 5873, checked in by abeham, 13 years ago

#1330

  • Fixed project references
  • Moved Analysis.Tests project one level up
  • Removed Optimization project as the changes have been merged into the trunk (cf. #1430)
File size: 3.4 KB
Line 
1using System;
2using HeuristicLab.Data;
3using Microsoft.VisualStudio.TestTools.UnitTesting;
4
5namespace HeuristicLab.Analysis.Tests {
6  [TestClass]
7  public class MultidimensionalScalingTest {
8    [TestMethod]
9    public void TestGoodnessOfFit() {
10      double stress;
11      DoubleMatrix distances3 = new DoubleMatrix(3, 3);
12      // Example 1: A right triangle
13      distances3[0, 1] = distances3[1, 0] = 3;
14      distances3[0, 2] = distances3[2, 0] = 4;
15      distances3[1, 2] = distances3[2, 1] = 5;
16      stress = MultidimensionalScaling.CalculateNormalizedStress(distances3,
17        MultidimensionalScaling.KruskalShepard(distances3));
18      Assert.IsTrue(stress < 0.1);
19      // Example 2: An arbitrary triangle
20      distances3[0, 1] = distances3[1, 0] = 8;
21      distances3[0, 2] = distances3[2, 0] = 6.4;
22      distances3[1, 2] = distances3[2, 1] = 5;
23      stress = MultidimensionalScaling.CalculateNormalizedStress(distances3,
24        MultidimensionalScaling.KruskalShepard(distances3));
25      Assert.IsTrue(stress < 0.1);
26      DoubleMatrix distances4 = new DoubleMatrix(4, 4);
27      // Example 3: A small square
28      distances4[0, 1] = distances4[1, 0] = 1;
29      distances4[0, 2] = distances4[2, 0] = Math.Sqrt(2);
30      distances4[0, 3] = distances4[3, 0] = 1;
31      distances4[1, 2] = distances4[2, 1] = 1;
32      distances4[1, 3] = distances4[3, 1] = Math.Sqrt(2);
33      distances4[2, 3] = distances4[3, 2] = 1;
34      stress = MultidimensionalScaling.CalculateNormalizedStress(distances4,
35        MultidimensionalScaling.KruskalShepard(distances4));
36      Assert.IsTrue(stress < 0.1);
37      // Example 4: A large square
38      distances4[0, 1] = distances4[1, 0] = 1000;
39      distances4[0, 2] = distances4[2, 0] = Math.Sqrt(2000000);
40      distances4[0, 3] = distances4[3, 0] = 1000;
41      distances4[1, 2] = distances4[2, 1] = 1000;
42      distances4[1, 3] = distances4[3, 1] = Math.Sqrt(2000000);
43      distances4[2, 3] = distances4[3, 2] = 1000;
44      stress = MultidimensionalScaling.CalculateNormalizedStress(distances4,
45        MultidimensionalScaling.KruskalShepard(distances4));
46      Assert.IsTrue(stress < 0.1);
47      // Example 5: An arbitrary cloud of 8 points in a plane
48      DoubleMatrix distancesK = GetDistances(new double[,] { { 2, 1 }, { 5, 2 }, { 7, 1 }, { 4, 0 }, { 3, 3 }, { 4, 2 }, { 1, 8 }, { 6, 3 } });
49      stress = MultidimensionalScaling.CalculateNormalizedStress(distancesK,
50        MultidimensionalScaling.KruskalShepard(distancesK));
51      Assert.IsTrue(stress < 0.1);
52      // Example 6: A tetrahedron
53      distancesK = GetDistances(new double[,] { { 0, 0, 0 }, { 4, 0, 0 }, { 2, 3.4641, 0 }, { 2, 1.1547, 3.2660 } });
54      stress = MultidimensionalScaling.CalculateNormalizedStress(distancesK,
55        MultidimensionalScaling.KruskalShepard(distancesK));
56      Assert.IsTrue(stress < 0.1);
57    }
58
59    internal DoubleMatrix GetDistances(double[,] coordinates) {
60      int dimension = coordinates.GetLength(0);
61      DoubleMatrix distances = new DoubleMatrix(dimension, dimension);
62      for (int i = 0; i < dimension - 1; i++)
63        for (int j = i + 1; j < dimension; j++) {
64          double sum = 0;
65          for (int k = 0; k < coordinates.GetLength(1); k++)
66            sum += (coordinates[i, k] - coordinates[j, k]) * (coordinates[i, k] - coordinates[j, k]);
67          distances[i, j] = distances[j, i] = Math.Sqrt(sum);
68        }
69      return distances;
70    }
71  }
72}
Note: See TracBrowser for help on using the repository browser.