2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу 1, 2  След.
 
 [MATLAB] fminsearch не по всем элементам матрицы-аргумента
Сообщение27.03.2021, 19:51 


07/01/12
69
Есть функция от матрицы. Нужно много раз искать ее минимум по разным комбинациям элементов матричного аргумента, т.е., напимер один раз крутим x(1,1), x(3,1) и x(5,2), а все остальные x(i,j) не трогаем; другой раз – x(4,1) и x(4,2) и т.п.
Знаю фишку fminsearch (@(x) f(x,y,z)) (минимизация по указанной переменной из нескольких), но это напрямую не годится.
Мой случай можно подогнать под эту «фишку», преобразовывая требуемую выжимку из матрицы x в отдельный массив, а затем обратно. Но, может, есть более прямой способ?

 Профиль  
                  
 
 Re: [MATLAB] fminsearch не по всем элементам матрицы-аргумента
Сообщение27.03.2021, 20:05 


10/03/16
4444
Aeroport
Diusha
Комбинации перебираются в ручную (т.е. нужную комбинацию пользователь задает ручками), или есть заранее заданный список?

 Профиль  
                  
 
 Re: [MATLAB] fminsearch не по всем элементам матрицы-аргумента
Сообщение27.03.2021, 20:32 


07/01/12
69
ozheredov в сообщении #1511673 писал(а):
Комбинации перебираются в ручную ... или есть заранее заданный список?

Заранее ничего нет. Комбинации перебираются программно в зависимости от входных данных.

 Профиль  
                  
 
 Re: [MATLAB] fminsearch не по всем элементам матрицы-аргумента
Сообщение27.03.2021, 22:57 
Заслуженный участник


12/07/07
4522
Во-первых, fminsearch находит минимум функции, заданной на некоторой области «непрерывно изменяющихся» переменных, например fminsearch(@(x) -exp(-x(1).^2-x(2).^2), [1,1]). А функция матричного аргумента — это матрица. (Не важно как это матрица определена: как поэлементное вычисление функции («векторизация»), или как определённым способом заданная функция всей матрицы.)
Во-вторых, если нужно найти индексы элементов матрицы с минимальным значением, то можно воспользоваться min. Если часть элементов нужно исключить из списка поиска минимума, то этим элементам можно присвоить NaN. Например, версия 6 или R2013b
Используется синтаксис Matlab M
>> A = [1, 2, NaN; NaN, 3, -1]
A =
     1     2   NaN
   NaN     3    -1
>> [ii, jj] = find(A==min(min(A)))
ii = 2
jj = 3

 Профиль  
                  
 
 Re: [MATLAB] fminsearch не по всем элементам матрицы-аргумента
Сообщение27.03.2021, 23:42 


10/03/16
4444
Aeroport
GAA в сообщении #1511707 писал(а):
А функция матричного аргумента — это матрица.

Почему? Детерминант -- функция матричного аргумента. Скаляр.

 Профиль  
                  
 
 Re: [MATLAB] fminsearch не по всем элементам матрицы-аргумента
Сообщение28.03.2021, 02:07 
Заслуженный участник


12/07/07
4522
Потому, что в Matlab функциями от матриц называются, как правило, функции возвращающие матрицу.
Впрочем, в чем состоит задача, боюсь, нужно формулировать TC.

 Профиль  
                  
 
 Re: [MATLAB] fminsearch не по всем элементам матрицы-аргумента
Сообщение28.03.2021, 02:27 


07/01/12
69
GAA в сообщении #1511707 писал(а):
Во-первых, fminsearch находит минимум функции, заданной на некоторой области «непрерывно изменяющихся» переменных

Абсолютно согласен.

GAA в сообщении #1511707 писал(а):
А функция матричного аргумента — это матрица.

А это неправда. Один пример Вам привели:
ozheredov в сообщении #1511712 писал(а):
Детерминант

Другой пример Вы привели сами:
GAA в сообщении #1511707 писал(а):
например fminsearch(@(x) -exp(-x(1).^2-x(2).^2), [1,1]).

Это функция от матрицы $1 \times 2$. А у меня размерность просто побольше.

GAA в сообщении #1511707 писал(а):
Во-вторых, если нужно найти индексы элементов матрицы с минимальным значением

Мне не нужно это. Мне нужно найти такие значения элементов матрицы, при которых функция принимает минимальное значение.

GAA в сообщении #1511707 писал(а):
Если часть элементов нужно исключить из списка поиска минимума, то этим элементам можно присвоить NaN.

Это не годится.
Мне вот что нужно. Например, исходно матрица с такими значениями:
2 3
5 7

Это стартовая точка (в Вашем примере стартовая точка – [1,1]).
Я хочу, чтобы 5 и 7 (например) остались неизменными, а вместо 2 и 3 нашлись такие числа, при которых (скалярное) значение функции минимально.

 Профиль  
                  
 
 Re: [MATLAB] fminsearch не по всем элементам матрицы-аргумента
Сообщение28.03.2021, 02:35 
Заслуженный участник


12/07/07
4522
Запишите, пожалуйста, вашу функцию или класс функций. Так проще будет что-то предложить.

 Профиль  
                  
 
 Re: [MATLAB] fminsearch не по всем элементам матрицы-аргумента
Сообщение28.03.2021, 02:51 


07/01/12
69
Код:
function f=map_p_f(xy,a,d)

x=xy(:,1)*a;
y=xy(:,2)*a;

n=length(d);
f=0;

for j=2:n
  for i=1:j
    f=f+(sqrt((x(i)-x(j))^2+(y(i)-y(j))^2)-d(i,j))^2;
  end
end

Правда, не понимаю, что это проясняет.

Минимизация по xy.

 Профиль  
                  
 
 Re: [MATLAB] fminsearch не по всем элементам матрицы-аргумента
Сообщение28.03.2021, 04:25 
Заслуженный участник


12/07/07
4522
Да, такая формулировка мало поясняет.
Пусть для простоты $n=2$, т.е. матрица имеет вид $\left( \begin{array}{cc}
x_1 & y_1 \\ 
x_2 & y_2 \end {array} \right)$. Пусть также $d_{12}>0$. Обозначим для краткости $d_{12} = R > 0$.
В данном частном случае нужно найти минимум $f (x_1,  y_1;x_2, y_2, R)= \left(\sqrt{(x_1-x_2)^2 + (y_1-y_2)^2} - R \right)^2$.(Запись означает, что $R$, $x_2$ и $y_2$ фиксированы.)
Квадрат будет минимален, если его аргумент равен нулю (основание степени равно нулю). Из этого следует, что $(x_1-x_2)^2 + (y_1-y_2)^2 = R^2$.
Минимум достигается на окружности с радиусом $R$ и центром в точке $(x_2, y_2)$. Функция поиска локального минимума тут, боюсь, неприменима. И вообще численные методы как-то тут не очень применимы.
Раз понятной формулировки задачи нет, то и предложить что-то мне, мягко говоря, затруднительно.

 Профиль  
                  
 
 Re: [MATLAB] fminsearch не по всем элементам матрицы-аргумента
Сообщение28.03.2021, 09:23 


07/01/12
69
GAA в сообщении #1511742 писал(а):
Пусть для простоты $n=2$.

На самом деле $n=$ несеолько десятков.

Попробую дать формулировку построже.

$I=\{1,...,n\}$ – множество индексов.

Функция:
$f(\{ x_k ,y_k \} _{k = 1}^n ; \,D) = \sum\limits_{i < j,\,i,j \in I} {\left( {\sqrt {(x_i  - x_j )^2  + (y_i  - y_j )^2 }  - d_{ij} } \right)^2 } $,
$D=\{d_{ij} \}, \, d_{ij}>0 , \, i,j \in I$.

Множество $I$ разбивается на 2 подмножества: $I=V \cup C$, $V \cap C = \emptyset$.
$C$ – множество таких индексов, что
$x_i=\operatorname{const}, \,y_i=\operatorname{const}\, \forall i \in C$;
$V$ – множество таких индексов, что $x_i, \,y_i$ – переменные $\forall i \in V$.

Эта разбивка происходит многократно и по-разному. Для каждой из нужных разбивок требуется найти

$\mathop {\arg \min }\limits_{\{ x_m ,y_m \} , \, m \in V} f(\{ x_k ,y_k \} _{k = 1}^n  ; \,D)$

Все слагаемые в $f$ не обязаны быть нулем, поскольку в разнык слагаемых могут участвовать одни и те же $x_i ,y_i$.

 Профиль  
                  
 
 Re: [MATLAB] fminsearch не по всем элементам матрицы-аргумента
Сообщение28.03.2021, 15:50 
Заслуженный участник


12/07/07
4522
[Так я и не понял ни требований, ни успехов, ни проблем. Последний раз напишу банальности.]
Формально ничего не мешает зафиксировать часть переменных. В простейших примерах всё работает
код: [ скачать ] [ спрятать ]
Используется синтаксис Matlab M
>> f = @(x) (x(1,1)-1)^2+(x(1,2)-2)^2 +(x(2,1)-3)^2 + (x(2,2)-4)^2;
>> fminsearch(f, [1,1; 1, 1])
ans = 1.0000    2.0000
      3.0000    4.0000
>> f = @(x) (x(1,1)-1)^2+(3-2)^2 +(x(2,1)-3)^2 + (x(2,2)-4)^2;
>> Z = fminsearch(f, [1,1; 1, 1])
Z = 1.0000   -2.7575
    3.0000    4.0000
>> f(Z)
ans = 1.0000
>> f = @(x) (x(1,1)-1)^2+(3-2)^2 +(4-3)^2 + (x(2,2)-4)^2;
>> Z = fminsearch(f, [1,1; 1, 1])
Z =
    1.0000    0.9164
    0.1612    4.0000
>> f(Z)
ans = 2.0000
 
Но увеличение размерности задачи, как правило, приводит к усложнению вычислений. Так что, лично я бы преобразовывал к одномерному массиву, а потом назад к матрице. Если последнее нужно.

 Профиль  
                  
 
 Re: [MATLAB] fminsearch не по всем элементам матрицы-аргумента
Сообщение28.03.2021, 16:20 


10/03/16
4444
Aeroport
Diusha в сообщении #1511671 писал(а):
Мой случай можно подогнать под эту «фишку», преобразовывая требуемую выжимку из матрицы x в отдельный массив, а затем обратно.

Верно ли я понял: у вас есть инжектор ВНУТРИ оптимизируемой функции

Используется синтаксис Matlab M
function MATRIX = MyInjector(argArray, constArray)

который распихивает аргументы argArray, по которым идет оптимизация, и константы constArray по нужным ячейкам матрицы? А уже матрица скармливается самой оптимизируемой функции, так?

 Профиль  
                  
 
 Re: [MATLAB] fminsearch не по всем элементам матрицы-аргумента
Сообщение28.03.2021, 20:41 


07/01/12
69
GAA в сообщении #1511844 писал(а):
Но увеличение размерности задачи, как правило, приводит к усложнению вычислений. Так что, лично я бы преобразовывал к одномерному массиву, а потом назад к матрице.

К усложнению вычислений приводит увеличение количества элементов массива, а не его размерность. Так что не важно, в каком виде массив представлен. fminsearch всё равно раборает с отдельными значениями.

GAA в сообщении #1511844 писал(а):
Так я и не понял ни требований, ни успехов, ни проблем.

Хорошо, давайте забудем про структуру массива, пусть он 1-мерный. Массив x из n элементов.
Есть непрерывная функция f от n аргументов, заведомо имеющая минимум.
В ходе прогона программы много раз потребуется минимизировать f (одну и ту же f), фиксируя разные наборы x-ов. Какие именно x-ы нужно зафиксировать на очередном шаге программы, заранее не известно, это решается программно на каждом шаге цикла.

GAA в сообщении #1511844 писал(а):
Формально ничего не мешает зафиксировать часть переменных.

Формально – да, а фактически как это сделать по-простому, я не знаю. В этом вопрос и состоит.

GAA в сообщении #1511844 писал(а):
Используется синтаксис Matlab M
f = @(x) (x(1,1)-1)^2+(x(1,2)-2)^2 +(x(2,1)-3)^2 + (x(2,2)-4)^2;
f = @(x) (x(1,1)-1)^2+(3-2)^2 +(x(2,1)-3)^2 + (x(2,2)-4)^2;
f = @(x) (x(1,1)-1)^2+(3-2)^2 +(4-3)^2 + (x(2,2)-4)^2;
 


Здесь Вы не зафиксировали часть переменных, а изменили функцию – вручную вместо переменной вписали константу.
Если бы мне требовалось 3 раза по-разному зафиксировать, я бы тоже так сделал. Но в моем случае речь идет о сотнях минимизаций. И при этом (еще раз) какие именно фиксировать в очередной раз – заранее никто не знает.

ozheredov в сообщении #1511849 писал(а):
Верно ли я понял: у вас есть инжектор ВНУТРИ оптимизируемой функции
...
который распихивает

Если я правильно догадываюсь, что Вы называете инжектором (не встречал использование этого слова в таком контексте), то нет. Никто ничего не распихивает.

Скажем так. Вот в ходе выполнения программы появился (не важно откуда) некий список
[2, 9, 25, 33, 56].
Это означает, что элементы массива x с указанными номерами мы провозглашаем константами, и fminsearch их трогать не должна, и при поиске минимума f менять все остальные элементы массива x, кроме указанных в списке. При этом при вычислении самого значения f все x-ы участвуют.
В следующий раз (не при следующем запуске программы, а на следующем шаге) список будет другой.

«Распихивать» можно. Видимо, так и придется делать. Это геморно, поэтому я и надеялся, что есть какие-то штатные средства.

 Профиль  
                  
 
 Re: [MATLAB] fminsearch не по всем элементам матрицы-аргумента
Сообщение28.03.2021, 21:36 
Заслуженный участник


12/07/07
4522
В начальном сообщении было написано, что фиксируются не строки/столбцы, а отдельные элементы
Diusha в сообщении #1511671 писал(а):
x(1,1), x(3,1) и x(5,2), а все остальные x(i,j) не трогаем; другой раз – x(4,1) и x(4,2) и т.п.
Потом разговор зашёл о строках
Diusha в сообщении #1511762 писал(а):
$I=\{1,...,n\}$ – множество индексов.

Функция:
$f(\{ x_k ,y_k \} _{k = 1}^n ; \,D) = \sum\limits_{i < j,\,i,j \in I} {\left( {\sqrt {(x_i  - x_j )^2  + (y_i  - y_j )^2 }  - d_{ij} } \right)^2 } $,
$D=\{d_{ij} \}, \, d_{ij}>0 , \, i,j \in I$.

Множество $I$ разбивается на 2 подмножества: $I=V \cup C$, $V \cap C = \emptyset$.
$C$ – множество таких индексов, что
$x_i=\operatorname{const}, \,y_i=\operatorname{const}\, \forall i \in C$;
$V$ – множество таких индексов, что $x_i, \,y_i$ – переменные $\forall i \in V$
А теперь вообще об одномерном массиве.
Diusha в сообщении #1511910 писал(а):
Формально – да, а фактически как это сделать по-простому, я не знаю. В этом вопрос и состоит.
Хорошо, когда это пишут в начальном сообщении.

Ничто не мешает руки заменить программной реализацией. Специально постарался повторить действия рук.
Пусть для простоты матрица 2x2 и фиксируем элементы строк. (Переделать под случай фиксации произвольной переменной не представляет никаких затруднений.) Пусть имеется матрица $I$, указывающая какие переменные какой строки надо фиксировать. Если в строке стоит true – то фиксация переменных этой строки . Это в форм. задачи отсутствовало. Что-то же надо предложить. Для быстроты это сойдёт и переделать можно под конкретную задачу, если понятно будет.

Используется синтаксис Matlab M
function s = GetFBody(I, X)
 s = '(x(1,1)-1)^2 + (x(2,1)-2)^2 + (x(1,2)-3)^2 + (x(2,2)-4)^2';
 S = {'x(1,1)', 'x(1,2)'; 'x(2,1)', 'x(2,2)'};
 for i = 1:2
   if I(i)
    s = strrep(s, S{i, 1}, num2str(X(i, 1), 15));
    s = strrep(s, S{i, 2}, num2str(X(i, 2), 15));
   end    
 end
end

Тест (сценарий) для функции
код: [ скачать ] [ спрятать ]
Используется синтаксис Matlab M
X = [2, 3; 4, 5];
disp('Case 1');
I =[false, false];
ss = GetFBody(I, X);
f = @(x) eval(ss);
Y = fminsearch(f, [1, 1; 1, 1]);
Y(I, :) = X(I, :)
f(Y)
disp('Case 2');
I =[false; true];
ss = GetFBody(I, X)
f = @(x) eval(ss);
Y = fminsearch(f, [1, 1; 1, 1]);
Y(I, :) = X(I,:)
f(Y)
disp('Case 3');
I =[true; false];
ss = GetFBody(I, X)
f = @(x) eval(ss);
Y = fminsearch(f, [1, 1; 1, 1]);
Y(I,:) = X(I,:)
f(Y)

Результат запуска сценария
Код:
Case 1
Y =
    1.0000    3.0000
    2.0000    4.0000
ans = 4.3761e-09

Case 2
ss = (x(1,1)-1)^2 + (4-2)^2 + (x(1,2)-3)^2 + (5-4)^2
Y =
    1.0000    3.0000
    4.0000    5.0000

ans = 5.0000

Case 3
ss = (2-1)^2 + (x(2,1)-2)^2 + (3-3)^2 + (x(2,2)-4)^2
Y =
    2.0000    3.0000
    2.0000    4.0000

ans = 1.0000


-- Вс 28.03.2021 20:45:53 --

Diusha в сообщении #1511910 писал(а):
К усложнению вычислений приводит увеличение количества элементов массива, а не его размерность. Так что не важно, в каком виде массив представлен. fminsearch всё равно раборает с отдельными значениями.
Я сначала думал объяснить, но потом понял бессмысленность объяснений очевидных геометрических вещей.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 22 ]  На страницу 1, 2  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: Dmitriy40


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group