Conjugate gradient, BFGS و L-BFGS راه های پیچیده تر و سریع تری برای بهینه سازی $\theta$ به جای گرادیان کاهشی هستند.
پیشنهاد میشود که این الگوریتم های پیچیده را خودتان ننویسید (مگر اینکه در محاسبات عددی متخصص باشید)، و به جای آن از کتابخانه ها استفاده کنید، زیرا قبلا آزمایش شده اند و بسیار بهینه شده اند.
ابتدا لازم است تابعی بسازیم که دو مقدار زیر را با ورودی مقدار $\theta$ برگرداند:
$$ \begin{align*} & J(\theta) \newline & \dfrac{\partial}{\partial \theta_j}J(\theta)\end{align*} $$
تابعی مینویسیم که هر دو این مقادیر را بر گرداند:
function [jVal, gradient] = costFunction(theta)
;jVal = [...code to compute J(theta)...]
;gradient = [...code to compute derivative of J(theta)...]
end
سپس میتوانیم از الگوریتم بهینه سازی ()fminunc در اکتاو به همراه تابع ()optimset برای ساخت یک object شامل تنظیمات و گزینه هایی که میخواهیم به عنوان ورودی به تابع ()fminunc بدهیم.
;options = optimset('GradObj', 'on', 'MaxIter', 100)
;initialTheta = zeros(2,1)
;[optTheta, functionVal, exitFlag] = fminunc(@costFunction, initialTheta, options)
به عنوان ورودی به تابع ()fminunc:
تابع هزینه، بردار مقادیر تتا، و options را که از قبل درست کرده ایم میدهیم.