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
3855
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
4438
Во-первых, 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
3855
Aeroport
GAA в сообщении #1511707 писал(а):
А функция матричного аргумента — это матрица.

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

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


12/07/07
4438
Потому, что в 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
4438
Запишите, пожалуйста, вашу функцию или класс функций. Так проще будет что-то предложить.

 Профиль  
                  
 
 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
4438
Да, такая формулировка мало поясняет.
Пусть для простоты $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
4438
[Так я и не понял ни требований, ни успехов, ни проблем. Последний раз напишу банальности.]
Формально ничего не мешает зафиксировать часть переменных. В простейших примерах всё работает
код: [ скачать ] [ спрятать ]
Используется синтаксис 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
3855
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
4438
В начальном сообщении было написано, что фиксируются не строки/столбцы, а отдельные элементы
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, Супермодераторы



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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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