LINUX.ORG.RU

[Ниасилил][ЧЯДНТ] Оптимизация

 ,


0

2

Вот допустим есть такая формула: http://ib1.keep4u.ru/b/2011/03/30/5c/5c8ab36a8ce7000351262e2ee0c7e3b6.jpg

Превращаем ее в толстую быдлофункцию:

from math import *

def mp(m1,m2):
    x=[]
    for i in range(len(m1)):
        x.append(m1[i]*m2[i])
        return x

def f(xn,dh,rb,rp):

    if sum(xn) != 1:
        return 0

    for i in xn:
        if i < 0:
            return 0

    s1 = map(lambda x:x**2,xn)
    s2 = mp(s1,rb)
    s3 = sqrt(float(sum(s2)))
    if s3 > rp:
        return 0

    return -sum(mp(xn,dh))

Потом пытаемся минимизировать:


# сперва смотрим че вообще выдает функция:
x0=[0.25,0.25,0.25,0.25]
rd=[ 0.0220669994648, 0.0264627345776, 0.0332991909211, 0.0276608158607, 0.0263295768645]
dh =[ 0.00677940378104, 0.00488035011562, 0.00114327432916, 0.00759421827662, 0.0122339011693]
print "Функция с параметрами выше: ", f(x0,dh,rd,0.15)

# теперь смотрим что выдала оптимизация:
from scipy.optimize import fmin
xopt = fmin(f, x0, args=(dh,rb,0.2),xtol=1e-8,disp=1,retall=1)
print xopt

И смотрим результат:

Функция с параметрами выше:  -0.00169485094526
Optimization terminated successfully.
         Current function value: -0.001695
         Iterations: 51
         Function evaluations: 287
выхлоп оптимизации: 
(array([ 0.25,  0.25,  0.25,  0.25]), [array([ 0.25,  0.25,  0.25,  0.25]), array([ 0.25,  0.25,  0.25,  0.25]), array([ 0.25,  0.25,  0.25,  0.25]), array([ 0.25,  0.25,  0.25,  0.25]), array([ 0.25,  0.25,  0.25,  0.25]), array([ 0.25,  0.25,  0.25,  0.25]), array([ 0.25,  0.25,  0.25,  0.25]), array([ 0.25,  0.25,  0.25,  0.25]), array([ 0.25,  0.25,  0.25,  0.25]), array([ 0.25,  0.25,  0.25,  0.25]), array([ 0.25,  0.25,  0.25,  0.25]), array([ 0.25,  0.25,  0.25,  0.25]), array([ 0.25,  0.25,  0.25,  0.25]), array([ 0.25,  0.25,  0.25,  0.25]), array([ 0.25,  0.25,  0.25,  0.25]), array([ 0.25,  0.25,  0.25,  0.25]), array([ 0.25,  0.25,  0.25,  0.25]), array([ 0.25,  0.25,  0.25,  0.25]), array([ 0.25,  0.25,  0.25,  0.25]), array([ 0.25,  0.25,  0.25,  0.25]), array([ 0.25,  0.25,  0.25,  0.25]), array([ 0.25,  0.25,  0.25,  0.25]), array([ 0.25,  0.25,  0.25,  0.25]), array([ 0.25,  0.25,  0.25,  0.25]), array([ 0.25,  0.25,  0.25,  0.25]), array([ 0.25,  0.25,  0.25,  0.25]), array([ 0.25,  0.25,  0.25,  0.25]), array([ 0.25,  0.25,  0.25,  0.25]), array([ 0.25,  0.25,  0.25,  0.25]), array([ 0.25,  0.25,  0.25,  0.25]), array([ 0.25,  0.25,  0.25,  0.25]), array([ 0.25,  0.25,  0.25,  0.25]), array([ 0.25,  0.25,  0.25,  0.25]), array([ 0.25,  0.25,  0.25,  0.25]), array([ 0.25,  0.25,  0.25,  0.25]), array([ 0.25,  0.25,  0.25,  0.25]), array([ 0.25,  0.25,  0.25,  0.25]), array([ 0.25,  0.25,  0.25,  0.25]), array([ 0.25,  0.25,  0.25,  0.25]), array([ 0.25,  0.25,  0.25,  0.25]), array([ 0.25,  0.25,  0.25,  0.25]), array([ 0.25,  0.25,  0.25,  0.25]), array([ 0.25,  0.25,  0.25,  0.25]), array([ 0.25,  0.25,  0.25,  0.25]), array([ 0.25,  0.25,  0.25,  0.25]), array([ 0.25,  0.25,  0.25,  0.25]), array([ 0.25,  0.25,  0.25,  0.25]), array([ 0.25,  0.25,  0.25,  0.25]), array([ 0.25,  0.25,  0.25,  0.25]), array([ 0.25,  0.25,  0.25,  0.25]), array([ 0.25,  0.25,  0.25,  0.25])])

Чегойто оно нифига не оптимизирует? Есть конечно предположение, что градиентрый спуск (это и есть fmin) очень плохо переваривает возвращение нулей функции, но что тогда другое использовать?

★★★★★

Последнее исправление: Siado (всего исправлений: 1)

Не понял про что вопрос. Про математические методы вместо градиентного спуска или всё-таки про оптимизации?

anonymous
()
Ответ на: комментарий от anonymous

>математические методы вместо градиентного спуска или всё-таки про оптимизации

Дык одно и тоже не?

Siado ★★★★★
() автор топика
Ответ на: комментарий от aedeph

Вы в универе учились? У вас ВО есть?

anonymous
()
Ответ на: комментарий от anonymous

siado, залогинься.

ВО у меня есть. И даже был курс по методам оптимального управления в задачах математической физики.

aedeph
()
Ответ на: комментарий от Siado

Оптимизацией может быть
1) Ключики типа -O1 и т.п., от которых в некоторых случаях может меняться результат работы программы для существующего алгоритма.
2) Ускорение, повышение точности существующего алгоритма.
3) Оптимизация решения, то есть поиск другого более точного и/или быстрого алгоритма.



anonymous
()

Глупый вопрос - что это за язык? Градиентный спуск плохо переваривает наличие локальных минимумов, если память не изменяет. Как впрочем и большинство алгоритмов оптимизации. Вместо него можно использовать например полный перебор по сетке - будет жутко грузить все, но зависит от конкретной задачи и функции. Подробности нужны?

TheKnight ★★★
()

И еще - это если не ошибаюсь алгоритм обычного линейного спуска а не градиентного. Ссылка. А обычный спуск с локальными минимума и максимумами ну вообще плохо дружит...

TheKnight ★★★
()
Ответ на: комментарий от TheKnight

там в формуле область поиска это округлый кусок плоскости, а поиск экстремума - линейная функция. Так что экстремумы локальные и глобальные совпадают.

anonymous
()

Функция цели линейна, область допустимых значений - вроде бы выпукла. Никаких причин, чтобы градиентный спуск не работал, ищите ошибку в коде. Попробуйте применить fmin к простейшему примеру вроде минимизации x^2 на [-1,1].

amomymous ★★★
()
Ответ на: комментарий от anonymous

В вычислительной математике существует такая дисциплина «методы оптимизации», которая занимается как раз нахождением минимума (максимума) целевой функции при некоторых ограничениях. Так что из первого поста ясно, что не об оптимизации алгоритмов речь.

amomymous ★★★
()
Ответ на: комментарий от amomymous

>Попробуйте применить fmin к простейшему примеру вроде минимизации x^2 на [-1,1].

К простейшим применяется, проверено, все работает и на выходе дает массив оптимизированных переменных.

Siado ★★★★★
() автор топика

Я честно говоря не знаю как работает этот fmin, но я б ф-ю заданную таким кодом тоже соптимизировать не сумел. Оцените ка вероятность подбора таких х-в чтоб у Вас вылетел не ноль??? Вообще град спуском оптимизируются непрерынве ф-ии, а у Вас в 3D пр-ве заданна плоскость, вне ее Вы считаете ф-ю нулем - и как по Вашему алгоритм должен на этой пл-ти удерживаться? Выразите x1 через x2,x3, подставьте в целевую ф-ю, за пределами области определения можно возвращать нули как и делали, и оптимизируйте на здоровью ф-ю двух переменных - должно получится.

А так, если чуток подумать, то ответ можно на бумажке получить;-)

AIv ★★★★★
()
Ответ на: комментарий от AIv

>А так, если чуток подумать, то ответ можно на бумажке получить;-)

Можно, но долго )

подставьте в целевую ф-ю, за пределами области определения


Да, так пожалуй щас и попробую )

Siado ★★★★★
() автор топика
Ответ на: комментарий от Siado

> Можно, но долго )

???????????? я всегда думал, что теоретик - это тот кто считает интегралы на бумажке (я не теоретик, поэтому обычно лезу в Рыжика, не нахожу - пишу скрипт на питоне), но тут уж и не знаю как себя назвать... Выражаем x1 через х2, х3. С т.з. банальной эрудиции ясно что эсктремум будет где то на границе области задаваемой неравенством, решаем кв. уравнение отн x2, пдоставляем ответ в первую строчку, ищем макс.

Но если просто подумать, то скорей всего макс будет достигаться в окресностях x2=0 при макс возможном значении х1.

AIv ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.