How to find the local minimum points in the multi-dimensional numerical data?

2

1

I am trying to get some local minima of an n-dimensional function (which only has numerical form). For two-dimensional function data, we can find the local minimum points from the contour plot easily.

Now, I have a three-dimensional function data.

See the data here.

The variables x1,x2,and x3 are from 1 to 50 and the step is 1. Since I have sorted the data based on the f(x1,x2,x3) values, the global minimum point can be easily obtained, that is, -8.13526987(x1=11,x2=50,x3=50).

The problem is, how to find the other local minimum points for this data ?

Orders

Posted 2015-08-20T09:36:11.573

Reputation: 1 127

1What is the domain of the data ? Exhaustive search is the only way to find all the local minima. – image_doctor – 2015-08-20T10:13:22.780

With the increase of the x1,x2 and x3, the f(x1,x2,x3) can be more deeper. But the local minimum points are more important for this data. How to exhaustive search ? – Orders – 2015-08-20T11:18:32.233

Answers

1

You have quite a small data set, so a really inefficient brute force search will still run pretty fast (<1 sec on my computer). I stress that this is STUPID way to do it, and with list manipulation you can surely make it MUCH more efficient. But as I said - it works.

First, transform the data so that you could retrieve the data by calling f[x1,x2,x3], and unset values will be Infinity:

dat = Rest@Import["numdata.txt", "tsv"];
f[i_,j_,k_] := Infinity;
Table[f[d[[1]], d[[2]], d[[3]]] = d[[4]], {d, dat}];

Then simply iterate over all entries, and see which of them is larger than all its neighbors:

Last@Last@Reap@For[i = 1, i <= 50, i++,
   For[j = 1, j <= 50, j++,
    For[k = 1, k <= 50, k++,
     If[
      And[
       f[i, j, k] < f[i + 1, j, k],
       f[i, j, k] < f[i - 1, j, k],
       f[i, j, k] < f[i, j + 1, k],
       f[i, j, k] < f[i, j - 1, k],
       f[i, j, k] < f[i, j, k + 1],
       f[i, j, k] < f[i, j, k - 1]
       ],
      Sow[{i, j, k}]
      ]
     ]
    ]
   ]

Output:

{{4, 3, 3}, {9, 13, 15}, {9, 14, 14}, {10, 17, 2}, {10, 50, 1}, 
 {11, 8, 17}, {11, 15, 2}, {11, 50, 50}, {15, 5, 15}, {15, 10, 3},
 {16, 6, 12}, {16, 7, 9}, {16, 8, 7}, {16, 9, 5}, {16, 10, 4}, 
 {50, 50, 50}}

These are the positions of all the local minima.

yohbs

Posted 2015-08-20T09:36:11.573

Reputation: 6 816

Thanks! Yes, it works. Since it is a small data set, is it possible to smooth the multi-dimensional function by fitting based on the present data ? Then, we can find the more exact local minima. – Orders – 2015-08-21T00:34:59.767