Download as pdf or txt
Download as pdf or txt
You are on page 1of 233

Fonksiyonel Analiz ve Optimizasyon

Burak Bayramlı
Sayılar ve Kuramlar

https://burakbayramli.github.io/dersblog/sk/

Tüm Dosyalar, Kodlar

https://github.com/burakbayramli/classnotes
Ders 1
Önce Reel Analiz (Real Analysis) ile başlayalım. Fonksiyonel Analizdeki pek çok
kavram Reel Analiz ile benzer (ama daha geneldir).
Reel Çizgi
Reel sayıların olduğu küme R’ye geometrik bir açıdan “reel çizgi” ismi de verilir.
Reel çizgi üzerinde uzaklık kavramı, mesela iki nokta x, y arasında

d(x, y) = |x − y|

olarak gösterilebilir. Uzaklık fonksiyonu d’nin özellikleri şunlardır:


1. d(x, y) > 0. Her uzaklık ya sıfır, ya da pozitiftir.
2. d(x, y) = 0 eğer x = y ise.
3. d(x, y) = d(y, x)
4. d(x, y) 6 d(x, z) + d(z, y). Bu eşitsizliğe “üçgen eşitsizliği (triangle inequality)
ismi verilir.

Özet olarak söylenmeye çalışılan, x, y arasında üçüncü bir noktaya zıplanarak


gidiliyorsa, bu mesafeyi arttırır, ve bu artış en az x, y arasındaki mesafe kadardır.
Daha fazla da olabilir.
Diziler (Sequences)
Bir dizi aslında sadece bir listedir. Listede 1. eleman vardır, 2. eleman vardır, vs.
ve bu sonsuza kadar devam eder. Bu nokta önemli, matematikte sonlu / sınırlı
(finite) bir liste dizi değildir. Dizilerin önemli bir özelliği sonsuza kadar devam
etmeleridir.
Daha formel olarak bakarsak doğal sayıların, yani N kümesinin de tanımda bir rol
oynadığını görebiliriz. Listedeki her eleman dizideki sıra numarası ile etiketlenebilir,
1. elemanı “1”, 2. elemanı “2”, vs. olarak etiketleyebiliriz, o zaman bu açıdan
bakarsak bir dizinin, doğal sayılar ile başka bir küme arasındaki bir eşleşme olduğunu
da söyleyebiliriz. Bu eşleşme bir diğer tanımla bir fonksiyondur. Yani bir dizi
aslında bir fonksiyondur, yani

1
f:N→R

Dizimizi

f(1), f(2), f(3), ..., f(n), ..

olarak gösterebiliriz.
Yaklaşmak (Convergence)
Açık bir şekilde görüleceği üzere alttaki dizi

1 1 1
1, , , , ...
2 3 4

gittikçe 0 değerine doğru gidiyor. Bu dizi “sıfıra yakınsıyor (convergence)” de-


riz, ya da “dizinin limiti sıfır” deriz. Peki bu fikri nasıl daha açık, net olarak
tanımlayabiliriz?
Yaklaşan seriler 18. yüzyılda incelendi ve geliştirildi, fakat o zamanlarda bu tür
dizilerin tanımı hiçbir net olarak ortaya koyulmadı. Literatur taranırsa tanıma en
yakın olacak şey şöyledir:
“Bir dizi {sn } L sayısına yaklaşır, eğer bu dizideki terimler gittikçe L’e yakınlaşlıyorsa”.
Bu tanımın oldukça genel, kabaca olarak yapılmış olması bir yana, bazen bizi
yanlış yollara bile sürükleyebilir. Mesela şu diziyi ele alalım

.1, .01, .02, .001, .002, .0001, .0002, .00001, .00002, ...

Bu dizi muhakkak sıfıra “yakınlaşıyor”, fakat terimler düzenli bir şekilde sıfıra
yaklaşmıyorlar. Her ikinci adımda birazcık sapıyorlar. Ya da şu dizi

.1, .11, .111, .1111, .11111, .111111, ...

Bu dizi gittikçe .2’ye “yakınlaşıyor”, fakat bu dizinin .2’ye yaklaştığı iddia edile-
mez. Gerçek limit 1.9 olmalı, 2 değil. Ne olduğu belli olmayan bir “gittikçe
yaklaşma” tanımına değil, bizim aslında “gelişigüzel yakınlık (arbitrarily close)”
tanımına ihtiyacımız var.
Bu fikri en iyi yakalayabilen 1820’li yıllarda Augustin Cauchy oldu. Eşitsizlikleri
kullanarak “herhangi / gelişigüzel yakınlık” kavramını formüle eden bir tanım
bulmayı başardı. Bu şekilde limit kavramı gayet açık matematiksel eşitliszlikler
ile gösterilebildi.
Tanım: Bir Dizinin Limiti

2
{sn }’nin reel sayılardan müteşekkil bir dizi olduğunu düşünelim. {sn }’nin bir reel
sayı L’e yaklaştığını söyleriz, ve bunu

lim sn = L
n→∞

olarak belirtiriz. Ya da

sn → L olur, n → ∞ iken

eğer her  > 0 için öyle bir tam sayı N var ise, ki bu N şu şartlara uymalı

|sn − L| < 

n > N olduğu her zaman için.


Bir dizi yaklaşmıyorsa, ona uzaklaşan (divergent) dizi adı verilir. Bu her iki tür
ile aynı derecede ilgileniyoruz.
Not: Tanımda N’nin ’a bağlı olduğu görülüyor, eğer  çok ufak ise mesela,
o zaman N’in oldukça büyük olması gerekebilir. Bu açıdan bakılınca aslında
N’nin ’nun bir fonksiyonu olduğu söylenebilir. Bu durumu tam vurgulamak
için bazen N() yazmak daha iyi olabilir.
Not: Tanıma dikkat edersek, şartlara uyan bir N bulununca, o N değerinden daha
büyük herhangi bir N de kullanabiliriz. Yani üstteki tanım bize herhangi bir N
bulmamızı söyler, illa ki “en küçük” N’i bulmamız gerekmez.
Tanım bunu söylemiyor olsa bile ibarenin asıl gücü N’nin  ne kadar küçük olursa
olsun bulunabiliyor olmasıdır. Eğer  büyük bir sayı ise N’i bulmak kolay olur. Eğer
 = 0.1 için (ki bu sayı  türü sayılar için büyük sayılır) işleyen bir N bulursak,
aynı N daha büyük  değerleri için de işleyecektir.
Örnek
Üstteki tanımı kullanarak

n2 1
lim 2
=
n→∞ 2n + 1 2
olduğunu ispat edelim. Yanlız şunu belirtelim, üstteki tanım limitin 1/2 olacağını
hesaplamak tekniği olarak verilmiyor. İfade limit kavramına kesin bir tanım ge-
tiriyor ama o limiti hesaplamak için kesin bir metot sunmuyor. Neyse ki çoğumuz
bu hesabı yapmak için yeterince Calculus hatırlıyoruz, böylece limitin doğruluğunu
ispatlamadan önce ne olduğunu bulabiliriz.

n2 1 1
lim = lim =
n→∞ 2n2 + 1 n→∞ 2 + 1/n2 limn→∞ (2 + 1/n2 )

3
1 1
= =
2 + limn→∞ (1/n2 ) 2

Bu hesap, eğer tüm adımların doğruluğu ispatlanırsa, limitin ne olduğunun da


ispatı olabilirdi. Adımların doğruluğunu daha sonra göstereceğiz, böylece her
seferinde , N temelli argümanları kullanmamıza gerek kalmayacak. Şimdi , N
bazlı ispata gelelim,
Pozitif bir ’un verildiğini varsayalım. Öyle bir N (ya da N(), hangisini tercih
ederseniz) bulmamız gerekiyor ki, dizide N. terimden sonraki her eleman 1/2’ye
’dan daha yakın olsun, ve şu ifade doğru olsun

n2

1
2n2 + 1 − 2 < 

ki n = N, n = N + 1, n = N + 1, N + 2, .... Sonuçtan geriye doğru gidersek


işimiz kolaylaşır, yani verilen N için ’nun ne kadar büyük olması gerektiğini
hesaplarsak. Üstteki mutlak değer (absolute değer) işaretinin içine bakalım,

n2 1 2n2 2n2 + 1
− = −
2n2 + 1 2 2(2n2 + 1) 2(2n2 + 1)

2n2 − 2n2 − 1 −1
= 2
==
2(2n + 1) 2(2n2 + 1)

Tam değer alınınca

1
<
2(2n2 + 1)

olmalı, ya da

1
4n2 + 2 >

Dikkat, tersine çevirince küçüklük işareti büyüklük oldu.
Bu ifadeye uyan en küçük n, aradığımız N. O zaman
 
2 1 1
N > −2
4 

ifadesine uyan her tam sayı N bizim için uygun. İlla ki en küçük N olması gerek-
mez, en rahat olan N biraz büyükçe olabilir, mesela eğer sağ taraftaki 1/4 terim-
ine (sağ tarafta daha fazlası var, ama eksi işareti bu terimi daha küçültecek nasıl
olsa) eşit bir şeyleri sol tarafta istiyorsak, onun karesini N olarak kabul ederiz,

4
1
N> √
2 

deriz.
Bu örneğin bize verdiği asıl ders, aslında, tanımın bize limit teorisini geliştirmek
için teorik / kesin (rigourous) bir yöntem sunması ama bu limitlerin hesabını
yapmak için pratik bir yöntem olmaması. Bir limitin doğruluğunu hesaplamak
için nadiren böyle bir yönteme başvurulur.
Alt Dizinler (Subsequences)

1, −1, 2, −2, 3, −3, 4, −4, 5, −5, ...

şeklindeki bir dizinin içinde iki tane daha dizin olduğu görülebilir. Bunlardan
biri

1, 2, 3, 4, 5, ...

Diğeri

−1, −2, −3, −4, −5, ...

Bu dizin içinde dizin kavramını temsil etmek için “altdizin” kelimesini kullanacağız.
Çoğunlukla bir dizini incelemenin en iyi yolu onun altdızinlerine bakmaktır. Ama
altdizinlerin daha derli toplu bir tanımı ne olabilir acaba? Üstte kabaca yaptığımız
kavramın formel matematiksel bir tanımına ihtiyacımız var.
Tanım

s1 , s2 , s3 , s4 , ...

gibi herhangi bir dizini ele alalım. Altdizin ile

sn1 , sn2 , sn3 , sn4 , ...

demek istiyoruz ki

n1 < n2 < n3 < ...

olmalı, altdizinde kullanılan indekslerin her biri, bir öncekinden büyük olmalı.

1, 2, 3, 4, 5, ...

5
dizini,

1, −1, 2, −2, 3, −3, 4, −4, 5, −5, ...

dizinin altdizini çünkü orijinal dizinden çekip çıkartılan elemanların indekleri


n1 = 1, n2 = 3, n3 = 5 şeklinde.
Tekdüze (Monotonic) Altdizin Varlığı Teorisi
Tekdüzelik bir dizinin ya hep artması, ya da hep azalmasıdır. Bir artan, sonra
azalan bir dizin mesela tekdüze olmaz. Teori şu: Her dizin içinde bir tekdüze
altdızın vardır. Bu teoriyi ispatlamayacağız.
Bolzano-Weierstrass Teorisi
Her sınırlı (bounded) dizi içinde yakınsayan (convergent) bir altdizi vardır.
İspat
Üstteki Tekdüze Altdizin Varlığı Teorisine göre her dizin içinde tekdüze bir alt-
dizin vardır. Sınırlı bir dizin içinde bu tekdüze altdizin tabii ki sınırlı olacaktır,
yani bir değere yaklaşacaktır. İspat tamamlandı.
Limitlerin Sınırlı Olmaları Özelliği
Eğer bir dizi belli değerler arasındaki değerleri içeren bir küme ise, yani sınırlı bir
küme ise (bounded set), bu diziye sınırlı bir dizi denir (bounded sequence). Yani
dizi {sn } sınırlıdır, eğer M diye bir sayı var ise, ki dizideki her dizi için

|sn | 6 M

Teori
Her yakınsak (convergent) dizi sınırlıdır. Bu teorinin ispatını vermeyeceğiz, fakat
sınırlı olmayan bir dizinin limiti olamayacağı açıktır.
Cauchy Kriteri
Bir dizinin hangi özelliği onun yakınsaklığını karakterize eder? “Karakterize
eder” kelimeleriyle gerekli ve yeterli (necessary and sufficient) bir durum arıyoruz
ki bu durum gerçekleştiğinde dizinin yakınlaştığını bilelim.
Her türlü diziye uygulanabilen böyle bir karakterizasyon Cauchy tarafından keşfedildi.
Cauchy’nin bulduğu tanımın ilginç bir tarafı var, hiçbir nihai limit değerine refer-
ans yapmıyor. Sadece, son derece gevşek bir şekilde, bir dizinin terimleri bir-
biriyle rasgele (arbitrary) bağlamda, eninde sonunda (eventually) yaklaşırsa, o
dizinin yakınsayacağını söylüyor. Kriter söyle:
Bir dizi {sn } yakınsaktır, eğer, ve sadece eğer her  > 0 için bir tamsayı N var ise,
ki

6
|sn − sm | < 

n > N, m > M olmak kosuluyla.


İspat
Teorinin bu öğesi o kadar önemli ki kendine has yeni bir terminolojiyi hak ediyor.
Üstteki öğeye uyan her diziye Cauchy dizisi adı veriliyor. Yani teori “bir dizi
sadece ve sadece Cauchy dizisi ise yakınsaktır” diyor. Bu terminoloji daha ileri
matematikte (mesela temel alınan küme reel sayılar değil, daha çetrefil uzay-
lar olduğu zaman) geçerli olmayabilecektir, ama bu durumda da gerektirdiği ek
şartlar, ve ortaya koyduğu ifadenin kesinliği çok önemlidir.
İspat biraz uzun, ve Bolzano-Weierstrass teorisini gerektirecek. Bir yöndeki ispat
oldukça kolay. Farz edelim ki {sn } bir L sayısına yaklaşıyor. Diyelim ki  > 0. O
zaman bir tam sayı N olmalı ki


|sk − L| <
2

ki k > N. Eğer hem m hem n N’den büyüklerse,

 
|sn − sm | 6 |sn − L| + |L − sm | < + <
2 2

Üstteki ilk eşitsizlik / açılım üçgen eşitsizliğinden ortaya çıkıyor. Bu eşitsizlikten


ortaya çıkan iki yeni terimin hangi değerlere sahip olduğunu biliyoruz, yerlerine
koyunca  elde ediyoruz.
Cauchy dizilerinin üstteki ispatı aslında çok akıllıca; herhangi bir limit aranmıyor
sadece dizi, başka bir indis uzerinden, kendisi ile karşılaştırılıyor. Yani bir limite
yakınsak olup olmadığımızı değil, dizinin kendisine olan yakınsaklığını göstermeye
uğraşıyoruz.
Şimdi daha zor olan ikinci bölüme gelelim. Bu bölümün ispatı için, üç tane alt
bölüm lazım.
Önce her Cauchy dizisinin sınırlı olduğunu iddia ediyoruz. İspat için üstteki
sınırlı diziler hakkındaki teoriye başvururuz, her yakınsak dizi sınırlıdır, her Cauchy
dizisi bir değere yaklaştığına göre, o zaman her Cauchy dizisi sınırlıdır.
İkinci alt bölüm için yakınsak (sınırlı) {sn } dizisine Bolzano-Weierstrass teorisi
uygulayarak yakınsak bir alt dizin {snk } elde ediyoruz.
Üçüncü alt bölüm Cauchy dizilerinin doğal bir sonucu aslında. Eğer snk → L
olduğunu biliyorsak, ve {sn }’nin Cauchy olduğunu biliyorsak, o zaman sn → L
olduğunu gösterebiliriz.  > 0 olsun, ve N’i öyle seçelim ki, tüm n, m > N için

|sn − sm | < /2

7
Sonra K’yi öyle seçelim ki, her k > K için

|snk − L| < /2

olsun. Diyelim ki n > N. Şimdi m’i nk ’nin N’den büyük olan herhangi bir
değerine eşitleyelim ki k > K olsun. Bu değer için sm = snk ’dir.

|sn − L| > |sn − snk | + |snk − sn | < /2 + /2 = 

Birinci eşitsizlik, üçgen eşitsizliğinden geliyor. Daha sonra elde edilen terimlerin
bildiğimiz değerlerini yerine koyuyoruz, sn → L olduğunu görüyoruz (üstteki
formülün başı ve sonunu birleştirirsek, elde ettiğimiz sonuç). İspat tamamlandı.

8
Ders 2
Süreklilik
Tanım
S ⊂ R, f : S → R bir fonksiyon olsun, ve c ∈ S bir sayı olsun. “f’in c’de sürekli
olduğu” söylenir, şu durumda: Eğer her  > 0 için bir δ > 0 var ise, öyle ki ne
zaman x ∈ S ve |x − c| < δ işe, o zaman |f(x) − f(c)| <  doğrudur.
Eğer f : S → R her c ∈ S için doğru ise, yani bir c noktası değil tüm c’ler için
geçerli ise, o zaman f’in sürekli olduğunu söyleriz. Yani nokta belirtmeye ihtiyaç
kalmaz.
Üstteki tanım Analizde doğru anlaşılması gereken en önemli teorilerden biridir,
ve tam anlaması pek kolay olmayabilir. Dikkat edilirse δ, hem ’a hem de c’ye
bağlı. Yani her c ∈ S için aynı δ seçilmiyor.
Ayrıca sürekli fonksiyonların tanımının limitlerin tanımına benziyor olması raslantı
değil, sürekli fonksiyonların önemli bir özelliği zaten onların düzgün limitleri ol-
maları.

Tanımın işlemesinde mutlak değer (absolute value, || işareti) kritik bir rol oynuyor.
Grafiksel olarak şöyle gösterebiliriz. Bir fonksiyonun değerleri etrafında, yukarı,
aşağı olmak üzere  kadar bir pencere tanımlıyoruz (yeşil olarak görülen bölüm).
Şimdi örnekte c = 2 etrafında, yani x bazında öyle bir başka pencere tanımlayalım
ki, bu penceredeki değerler tamamen yeşil kısıma tekabül eden değerlerin içinde
kalsın. Bu şekilde tek bir pencere bulabildiğimiz anda iş tamamdır. Ve bunu tüm
 > 0 için yapabiliyorsak, o fonksiyon sürekli demektir.

Diğer yandan üstteki grafikte gösterilen

1

x < 5 2x
f(x) =
x > 5 3x

fonksiyonu sürekli değildir. Eğer c = 5 etrafında  = 4 alırsak mesela, bu pencer-


eye tekabül eden bir δ bulamayız. Fakat şu fonksiyon süreklidir.


x < 5 2x
f(x) =
x > 5 3x + 10

Fonksiyonun pürüzsüz (smooth) olmadığına dikkat, yani iki parçalı bir fonksiyon,
kesikli bir şekilde tanımlı, ama yine de sürekli.
Süreklilik için limitlere dayalı bir tanım daha açıklayıcı olabilir [1, sf. 125]. Bir iç
nokta (interior point) c için, y = f(x) o noktada sürekli denir eğer

lim = f(c)
x→c

ise. Yani bir noktadaki fonksiyon limiti eğer fonksiyonun o noktadaki değerine
eşit ise fonksiyon o noktada süreklidir.

Mesela üstteki parçalı fonksiyonda x = 3 noktasında süreklilik vardır (her ne


kadar kırılış varsa bile), çünkü o noktada

lim f(x) = f(3)


x→3

2
Eşit Süreklilik (Uniform Continuity)
Süreklilik tanımında δ’nin c noktasına bağlı olduğunu söylemiştik. Ama bazı
durumlarda δ’nin bağımsız olması daha faydalıdır.
Tanım
S ⊂ R, f : S → R bir fonksiyon olsun. Farz edelim ki her  > 0 için bir δ > 0
mevcut, ki x, c ∈ S ve |x − c| < δ olduğu zaman, |f(x) − f(c)| < . Bu durumlarda
fonksiyona eşit sürekli denir.
Eşit Sürekli bir fonksiyonun (normal) sürekli bir fonksiyon olacağını görmek zor
olmaz. Buradaki tek fark her seçilen  > 0 için öyle bir δ > 0 seçiyoruz ki bu δ
her c ∈ S için ise yarıyor. Yani bu yeni tanıma göre artık δ, c’ye bağlı değil, sadece
’a bağlı. Tanımın yapıldığı arka plan, bölge (domain) bir fark yaratacak. Daha
büyük bir kümede eşit sürekli olmayan bir fonksiyon, daha ufak bir küme içinde
eşit sürekli haline gelebilecek.
Lipschitz Sürekliliği
Tanım
f : S → R bir fonksiyon olsun, öyle ki S içindeki her x, y için bir K sayısı mevcut,
ve tüm bunlarla alttaki eşitsizlik doğru

|f(x) − f(y)| 6 K|x − y|

O zaman f’e Lipschitz Sürekli adı verilir.


Çok geniş bir fonksiyon kategorisi Lipschitz süreklidir.
Aslında Lipschitz fonksiyonları fonksiyonun türevi için bir üst limit tanımlar,
eğer üstteki ifadeyi şu şekilde yazarsak,

f(x) − f(y)
|x − y| 6 K

her x, y için üstteki hesabın daha az olacağı bir K vardır diyoruz ve bu K fonksiy-
onun her noktasında türevi için bir üst sınır olacaktır. Alttaki gibi bir resim
üzerinde anlatırsak,

3
söylediğimiz fonksiyonun hep beyaz koni dışında kalacağının garantisidir. O
koni dışında kalmak ta dolaylı olarak eğimin çok aşırı büyük olmaması anlamına
geliyor. Yani demek istiyoruz ki bu fonksiyon “patlamayacak”. Örnek olarak
sin(x2 ), ya da sin(1/x) Lipschitz değildir. Pek çok polinom, “normal” fonksiyon
Lipschitz’dir. İlla türevin mevcut olması bile gerekmez, mesela f(x) = |x|’in her
noktada türevi yoktur ama Lipschitz’dir/
Fakat dikkat edelim, aynen eşit süreklilikte olduğu gibi Lipschitz sürekliliğinde
de fonksiyonun tanımlandığı bölge (domain) çok önemlidir. Şimdi “sürekli” ke-
limesini kullanmamızın doğruluğunu kontrol edelim.
Teori
Her Lipschitz sürekli fonksiyon, aynı zamanda eşit sürekli bir fonksiyondur.
İspat
f : S → R olduğunu kabul edelim, ve öyle bir K sayısı olsun ki S içindeki her x
ve y için f(x) − f(y)| 6 K|x − y|. Bu Lipschitz süreklilik tanımının bir tekrarı. Bir
 > 0 seçelim. Sonra δ = /K alalım. |x − y| < δ olacak şekilde her x, y ∈ S için


|f(x) − f(y)| 6 K|x − y| < Kδ = K =
K
Birinci eşitsizlik Lipschitz tanımından geliyor. Bu eşitsizliğin sağ tarafında diğer
bildiklerimizi yerine koyunca,  elde ediyoruz.
Tamlık (Completeness)
Tanım
Bir metrik uzayı (X, d) tamdır (complete) eğer X alanındaki her Cauchy serisi (o
da X içinde olan) bir öğeye yaklaşıyor ise.
Üstteki tanımı önceki dersteki Cauchy tanımı ile birleştirirsek, R uzayının “tam”
olduğunu görebiliriz. Çünkü her Cauchy dizisinin R’de yakınlaştığını biliyoruz,
ayrıca bir bir reel sayıya yaklaşıldığını biliyoruz. Bu reel sayı L’in kendisi de zaten

4
R içinde olduğuna göre, R uzayı tamdır.
Inf ve Sup
Sup
Eğer S kümesi “yukarıdan sınırlanmış (bounded from above)” ise o zaman x ∈ S
için öyle bir y var demektir ki her x için x 6 y olsun. Yani S içindeki her değer bu
y değerinden küçük olsun. Bu x değerine S’in supremum’u da deniyor, ve sup(x)
x∈S
ya da sup{x : x ∈ S} olarak gösterilebiliyor.
Inf
Benzer şekilde kümenin en alt sınırı, yani infimum değeri inf (x) ya da inf{x : x ∈
x∈S
S} olarak gösteriliyor.
Eğer elimizde bir seri (sequence) var ise o zaman şartları biraz daha gevşetmek
iyidir, burada limit superior kavramı devreye girer. Inf ve sup değerleri altı /
üstü değer olamaz, ama limit superior öyle bir sayıdır ki onun sonrasında sonlu
(finite) / belli sayıda küme öğesi olmasına izin verilir. Limit superior aslında bir
serinin yakınsadığı (converge) değerden başkası değildir.
Bu kavramların minimum ve maksimum kavramlarından farkı ne? Inf ve sup bir
küme dışında da olabilirler. Bir kümenin minimal değeri muhakkak o küme içinde
olmalı ama öyle kümeler vardır ki minimal ya da maksimal değeri yoktur. Mesela
R+ yani sıfır hariç tüm pozitif reel sayıları düşünelim: minimumu nedir? Hangi
“çok küçük” değeri alırsak alalım, o değeri iki ile bölerek daha küçük bir değer
elde edebilirim, yani minimum yoktur. Fakat bu kümenin bir infimumu vardır,
sıfır değeri. Sıfır bu küme içinde değildir ama kümeyi sınırlayan bir değerdir.
Benzer örnek ters yönden supremum için de geçerli.

Formel olarak diyelim ki {xn } bir seri, ve diyelim ki bir reel sayı S var, ki bu reel
sayı şu şartları tatmin ediyor 1) Her  > 0 için bir N var, öyle ki her n > N için
xn < S +  ve 2) her  > 0 ve M > 0 için bir n > M var ki xn > S − . O zaman S
sayısına {xn } serisinin limit superior’u denir.
Bu tanımın söylemeye çalıştığı serinin yaklaştığı değerden sonra ve önce sonlu
büyüklükte bir pencere tanımlarsak bu pencere içinde sonlu sayıda eleman ola-

5
caktır (sonsuz değil). Bu pencerenin tanımlanabiliyor olması, onun makul bir
noktada olmasını gerektirir, ki bu nokta da yaklaşılan değerden başkası değildir.
Limit inferior bunun tersidir,

lim inf xn = − lim sup(−xn )

Vektör Uzayları
Her vektör uzayıyla ilintili olan bir tek sayı / skalar (scalar) kümesi vardır, ve bu
büyüklükler ile o uzayda çarpım işlemi tanımlanır. Soyut bağlamda çalışılanlar
için bu büyüklüklerin cebirsel bir alan (algebraiç field -bir soyut matematik kavramı-
) üyesi olması yeterlidir. Fakat bu notlarda kullanacağımız büyüklükler ya reel
sayılar, ya da kompleks sayılar olacak. Bu iki olasılık arasında hangisini kul-
landığımızı belli etmek için vektör uzayına “reel vektör uzayı” ya da “kompleks
vektörü uzayı” diyebiliriz. Odağımız ise çoğunlukla reel vektör uzayları ola-
cak, kompleks olanları nadir kullanacağız. Yani eğer uzayın şekli söylenmemişse,
onun reel olduğunu farz edin.
Tanım
Vektör uzayı X, “vektör” denen öğeleri içeren bir küme, artı iki operasyondan
oluşur. İlk operasyon toplama, diğeri çarpmadır. Toplama işlemi iki vektör x, y ∈
X’i bir diğer vektör x + y ∈ X ile bağdaştırır. Çarpma işlemi x ∈ X ve herhangi bir
sayı, skalar α ile vektör αx’i bağdaştırır.
θ sıfır vektörüdür.

0 x = θ, 1 x = x

[diğer önşartlar atlandı, sırabağımsızlık (commutative) kuralı, vs, toplam 7 tane]


Örnek
Mesela şöyle
Herhalde vektör uzaylarına verilecek en basit örnek reel sayılar kümesidir. Bu
durumda küme elemanları olan “vektörler” tek boyutludur. Vektörü uzayı (doğal
olarak) bir reel vektör uzayıdır, toplama, çarpma reel sayıların üzerinden tanımlıdır.
Sıfır vektörü θ, sıfır sayısıdır. Bu uzaya reel kordinat uzayı, ya da basit ifadeyle
“reel çizgi (real line)” adı da verilebilir, R1 , ya da R olarak gösterilir.
Kaynaklar
[1] Thomas, Thomas’ Calculus, 11th Edition
[2] Wikipedia, Lipschitz continuity https://en.wikipedia.org/wiki/Lipschitz_
continuity

6
Ders 3
Örnek
Bir önceki örneğin doğal bir uzantısı n-boyutlu reel kordinat uzayı olabilir. Bu
uzaydaki vektörler n-öğeli içinde n tane reel sayı olan bir dizidirler, ve vektörler
x = (ξ1 , ξ2 , ..., ξn ) formundadırlar. Reel tek sayı ξk ’ye vektörün k’inci elemanı
adı verilir. İki vektör, eğer tüm öğeleri birbirine eşit ise, eşittir. Sıfır vektörü
θ = (0, 0, ..., 0) şeklinde tanımlıdır.
n boyutlu reel kordinat uzayı Rn olarak tanımlanır. Buna tekabül eden n-öğeli
kompleks sayıların uzayı Cn ’dir.
Bu noktada aslında boyut kavramını devreye sokmak için biraz erken. Daha
ileriki derslerde boyut kavramının detaylı tanımı yapılacak, ve bu bahsettiğimiz
uzayların hakikaten n-boyutlu olduğu ispatlanacak.
Örnek
Sonsuz sayıda eleman, sonsuz öğeli dizi içeren vektörlerlerle ilginç bazı uzay-
lar inşa edilebiliyor, ki bu uzayda tipik bir vektör vektörler x = (ξ1 , ξ2 , ..., ξk , ...)
şeklinde oluyor. Diğer bir şekliyle x = {ξk }∞ k=1 . Toplama ve çıkartma önceden
olduğu gibi teker teker, sırası birbirine uyan öğeler arasında yapılıyor. Reel sayılardan
oluşan her türlü sonsuz dizilerin listesi bir vektör uzayı oluşturuyor. Bir dizi
{ξk }’ye sınırlı (bounded) denir, eğer her k için |ξk | < M olacak şekilde bir M
sabiti var ise. Sonsuz ve sınırlı (tanımını biraz önce yaptık) olan her dizi bir
vektör uzayı oluşturur, çünkü iki sınırlı dizinin birleşimi, ya da dizinin sayısal
çarpımı yine bir sınırlı dizi olacaktır.
Örnek
İçinde sonlu / belirli (finite) miktarda sıfıra eşit olmayan öğe içeren tüm dizilerin
birleşimi bir vektör uzayıdır (her vektör -dizi- içinde farklı miktarda sıfır olmayan
öğe olabilir). Bu uzaya sonlu sayıda sıfırı olmayan dizilerin uzayı ismi verilir.
Örnek
Sonsuz tane reel sayıdan oluşan ve hepsi de sıfıra yaklaşan dizilerin birleşimi bir
vektör uzayıdır, çünkü bu tür sıfıra yaklaşan iki dizinin toplamı da aynı şekilde
sıfıra yaklaşır. Böyle bir dizinin skalar ile ’çarpımı, yani katı yine sıfıra yaklaşır.
Örnek
Reel çizgi üzerinde bir [a, b] aralığı düşünün. Bu aralık üzerinde tanımlı tüm
sürekli fonksiyonlar bir vektör uzayı oluşturur. İki vektör x, y daha detaylı olarak
x(t), y(t) olarak kullanılıyor, ki t ∈ [a, b]. Eğer x = y ise x(t) = y(t) demektir.
(x + y)(t) = x(t) + y(t) ve (αx)(t) = αx(t) kullanılır. Sıfır vektörü θ bu aralıkta
sürekli sıfır değerinde olan vektördür. Bu uzaya [a,b] arasında reel değerli sürekli
fonksiyonlar uzayı denir.
[a, b] aralığında tanımlı tüm sürekli fonksiyonların vektör uzayı oluşturması mantıklı
değil mi? Çünkü bir fonksiyon verilen bir değer için bir başka değer üretmez mi?

1
O zaman bu değerleri [a, b] aralığına tekabül eder şekilde yanyana düşünürsek,
onlar da bir tür dizin oluştururlar. Dizinin içeriği tabii ki fonksiyonun ne olduğuna
göre değişecektir, ama içerik sonuçta belli bir sayı dizisidir. Ve tüm bu farklı
dizinleri düşünürsek, onlar bir vektör uzayı oluşturabilirler. Ayrıca tüm sürekli
fonksiyonlardan bahsediliyor, bu neredeyse tüm reel sayı dizileri demek gibi
bir şey, çünkü [a, b] aralığındaki her türlü fonksiyon uzaya dahil edilmiş. Her
türlü kıvrılan, bükülen, artan, azalan fonksiyonu düşünelim, bunların tamamı
muhakkak bir vektör uzayı tanımlayabilirler.
Şimdi birkaç vektör uzayını birleştirerek nasıl daha büyük bir tane yaratabileceğimizi
görelim.
Tanım
X, Y’nin aynı skalar alanı üzerinden tanımlı iki vektör uzayı olduğunu düşünelim.
X, Y’nin kartezyen çarpımı, ki bu X × Y olarak gösterilir, iki öğeli sıralanmış bir
dizi oluşturacaktır, yani (x, y), ki x ∈ X, y ∈ Y. X × Y üzerinde toplama ve skalar
çarpım (x1 , y1 ) + (x2 , y2 ) = (x1 + x2 , y1 + y2 ) ve α(x1 , y1 ) = (αx1 , αy1 ).
Üstteki tanımın bir vektör uzayı olmanın gerekliliklerini yerine getirdiği ortadadır.
Hatta bu tanım kolaylıkla n tane vektör uzayının kartezyen çarpımına genişletilebilir,
yani X1 , X2 , .., Xn . Bu çarpımı temsil etmek için Xn yazacağız.
Alt Uzaylar (Subspaces), Lineer Kombinasyonlar, ve Lineer Çeşitler (Linear Vari-
eties)
Tanım
M, X’in boş olmayan bir alt uzayıdır (subspace) eğer αx + βy formundaki her
vektör M içinde ise, ve x, y ∈ M olmak üzere.
Hiçbir alt uzayın boş olmadığını baştan kabul ettiğimize göre, içinde en az bir
x olmalıdır. Tanım itibariyle ayrıca 0x = θ’yi da içermelidir, o zaman her alt
uzay sıfır vektörünü de içerir. En basit alt uzay içinde sadece θ olan alt uzaydır.
Üç boyutlu uzayda orijinden geçen bir düzlem bir alt uzay oluşturur, orijinden
geçen bir çizgi aynı şekilde bir alt uzay oluşturur.
X’in tamamı da X’in (yani kendisinin) bir alt uzayıdır. Tüm uzaya eşit olmayan
bir alt uzaya düzgün (proper) alt uzay denir.
Her alt uzay kendi öğelerinin toplamlarını, ve katlarını içerdiği için aynı anda
bir uzayı tanımlayan 7 gerekliliği (axiom) otomatik olarak yerine getirmiş olur.
Zaten alt uzay derken “uzak” kelimesini kullanabilmemizin sebebi budur.
Diyelim ki X uzayı n öğeli dizinlerin (tuple) birleşimi. Bu dizinlerin bir kopyasını
düşünelim, tek farkla, 1. öğenin hep sıfır olsun. Bu bir alt uzaydır. 1/2 noktasında
sıfır olan [0, 1] üzerinde tanımlı sürekli fonksiyonlar, tüm sürekli fonksiyonların
bir alt uzayıdır.
İki alt uzayın evliliği (union, ∪ ile gösterilen) bir alt uzay olmayabilir. Bir düzlem
üzerinde mesela, aynı yönde gitmeyen (noncolinear) iki çizginin evliliği, bu iki

2
ayrı çizginin rasgele toplamlarını içermediği için alt uzay olma şartını yerine ge-
tirmez. Fakat “kümelerin toplamı” kavramından hareketle, iki alt uzay daha
büyük bir alt uzay olarak özel bir şekilde birleştirilebilir.
Tanım
Bir vektör uzayının S, T adlı iki alt kümesinin toplamı S + T olarak gösterilir, ve
her s + t formundaki tüm vektörleri içerir, ki s ∈ S, t ∈ T olmak üzere. Dikkat,
daha S, T ’nin alt uzay olduğunu söylemiyoruz, sadece küme diyoruz (şimdilik).

Üstteki resim toplam kavramını iki boyutlu uzayda (ki bu bir vektör uzayıdır)
gösteriyor. Vektör uzayı, S, T içindeki noktalara doğru işaret eden orijinden çıkan
iki vektörü görüyoruz. Toplam olarak, hakikaten S’teki noktanın / vektörün
mesela (3,1) olduğunu düşünsek, T ’deki noktanın / vektörün (1,3) olduğunu
düşünsek, onların toplamı olarak gösterilen nokta kabaca (4,4) gibi duruyor değil
mi? Şekil bu kavramı temsili olarak iyi göstermiş. Toplamın ayrıca daha büyük
bir küme olduğuna dikkat.
Teori
Diyelim ki M, N vektör uzayları X’in birer alt kümesi. O zaman bu kümelerin
toplamı M + N aynı şekilde X’in bir alt uzayıdır.
İspat
M + N’nin θ’yi içerdiği bariz. Devam edelim, x, y ∈ S + T için muhakkak

x = m1 + n1

y = m2 + n2

var demektir, ki m1 , m2 ∈ M, n1 , n2 ∈ N. Bu küme toplamı tanımından geliyor


zaten.
Şimdi x, y’yi ayrı ayrı rasgele sabitler α, β ile çarpalım.

αx = αm1 + αn1

3
βy = βm2 + βn2

Çarpımları toplayalım

αx + βy = αm1 + αn1 + βm2 + βn2

Eşitliğin sağını tekrar düzenleyelim

αx + βy = (αm1 + βm2 ) + (αn1 + βn2 )

αx + βy ile S + T içindeki x + y’nin herhangi bir şekildeki katını almış oluyoruz.


Ve geldiğimiz en son eşitlik gösteriyor ki αx + βy yine M, N içindeki vektörlerin
katları kullanılarak temsil edilebiliyor. Yani toplamdaki kat işlemini aynen alt
kümelere yansıtabiliyoruz / onların bazında yapabiliyoruz. O zaman alt kümeler
alt uzay olduğu için toplam da alt uzay demektir. İspat tamam.
İki boyutlu Öklit uzayında orijinden geçen ve aynı yönde olmayan iki çizginin
toplamı tüm uzaydır.
Tanım
Vektör uzayındaki vektörler x1 , x2 , .., xn ’in lineer kombinasyonu α1 x1 +α2 x2 +...+
αn xn olarak gösterilir.
Daha önce vektör toplamı iki tane vektörün toplamı olarak göstermiştik. Üstteki
gibi n tane toplam için (eski tanıma göre) toplam ikişer ikişer yapılmalı tabii. Ve
bunun doğal uzantısı olarak, alt uzaydaki vektörlerin lineer kombinasyonu yine
alt uzayda olacaktır. Ters yönden bakarsak, bir vektör uzayının herhangi bir alt
kümesinin lineer kombinasyonlarını kullanarak bir alt uzayı yaratabiliriz.
Tanım
Diyelim ki S vektör uzayı X’in bir alt kümesi. S tarafından üretilen alt uzay yani [S],
S’teki elemanların lineer kombinasyonu olan X’teki vektörlerden oluşur.

4
Ders 4
Dışbükeylik (Convexity) ve Koniler (Cones)
Bir lineer vektör uzayındaki K kümesi dişbukeydir (convex), eğer x1 , x2 ∈ K için
αx1 + (1 − α)x2 , 0 6 α 6 1 formundaki tüm noktalar da K içinde ise.
Matematiksel olarak α, 1 − α ile yapılmaya uğraşılan x1 , x2 “arasındaki” bir nok-
tayı temsil etmek. Eğer 0 6 α 6 1 ise, x1 , x2 ’yi sırasıyla α, 1 − α ile çarpıp
sonuçları toplamak “biraz x1 ’den, biraz x2 ’den almak” anlamına geliyor, bu da
tanım itibariyle her zaman x1 , x2 arasında bir yerde olmaktır. α 0 ile 1 arasındadır,
yani bir nevi yüzde hesabı yapılıyor, 0.2 oradan, 0.8 şuradan alınıyor. Hesabın bir
tür yüzde hesabı olması sebebiyle iki nokta arasında kalınması garanti edilmiş
oluyor.

Ve eğer bu “arada olmak” denklemi, kümedeki her noktanın her diğer noktayla
arasındaki, yani her α için hesaplanacak noktalar için de doğru ise, o zaman
hep aynı kümedeyi, “dışarı çıkmıyoruz” demektir ve bu dişbukeyliğin tanımıdır.
Görsel olarak ta kabaca bunu görmek mümkündür, dişbukey bir cisimde bir nok-
tadan diğerine düz çizgide giderken hep cisim içinde kalırız.
Teori
K, G bir vektör uzayında dışbükey olan iki küme olsun. O zaman
1) αK = {x : x = αk, k ∈ K} her α için dışbükeydir.
2) K + G dışbükeydir.
İspatlamadan bunun daha genel bir hali olan başka bir teoriye bakalım, onu is-
patlarsak üsttekini de ispatlamış olacağız.
Teori
C , içindeki tüm kümeleri dışbükey olan rasgele bir buket olsun. O zaman ∩K∈C K
aynı şekilde dişbukeydir.
Ispat
Diyelim ki C = ∩K∈C K. Eğer C boş ise, teori hemen ispatlamıştır. Diğer şartlar
için, farzedelim ki x1 , x2 ∈ C. O zaman x1 , x2 ∈ K demektir, çünkü C bir kesişim,
yani tüm K ∈ C içindeki aynı olan öğelerden müteşekkil. Her K’nin kendi başına
dışbükey olduğunu bildiğimize göre, o zaman C de dışbükey demektir.


1
Fonksiyonlarda Norm, İçsel Çarpım (Dot Product)
Bu kavramları lineer cebirde pek çok kez duyuyoruz. Mesela iki vektör a, b için
onların içsel çarpımı a · b, her iki vektörün tekabül eden öğelerinin çarpımı ve bu
sonuçların toplamı demektir. a = [a1 , a2 , ..] ve b = [b1 , b2 , ...] ise içsel çarpım,

X
N
a·b= ai b i
i=1

İç çarpımın sürekli ortamda olan fonksiyonlar için de bir karşılığı var. Eğer bir
vektörü bir fonksiyonun belli aralıklardan seçilmiş ayrıksal değerleri içeren bir
şey olarak düşünürsek, fonksiyon bir anlamda sonsuz değerdeki bir vektördür.
O zaman, elimizde f(x) ve g(x) var diyelim, bu “sonsuz vektörlerin” tekabül
eden değerlerinin çarpılıp toplanması nasıl yapılır? Entegral ile! O zaman f, g
arasındaki içsel çarpım [1, sf. 183],

Zb
f(x)g(x) dx
a

ki a, b uygun secilde seçilmiş alt ve üst sınırlar olacaktır.


Devam edersek, vektör normunu hatırlarsak, norm vektörün kendisiyle noktasal
çarpımıdır. O zaman fonksiyon için norm üstte gördüğümüz yeni yaklaşımı kul-
lanabilir, uzunluk aynı şekilde, mesela fonksiyon uzunluğu için ||f||

Zb
||f|| =
2
(f(x))2 dx
a

Mesela 0, 2π arasında sin x uzunluğu

Z 2π
||f|| =
2
(sin x)2 dx = π
0

Vektör dikgenliği ile fonksiyon dikgenliği yine aynı altyapıyı kullanacak, iki vektörün
dik olup olmadığını a · b sonucunun sıfır olup olmadığı ile anlayabiliyorduk.
Fonksiyon dikgenliği için entegral bazlı içsel çarpımı kullanacağız, mesela cos x
ile sin x dik midir?

Z 2π
sin x cos x dx = 0
0

Bu fonksiyonlar dikmiş demek ki.


Not: Birbirine dikgen olan fonksiyonlar, “bazlar”, Fourier serileri, ve pek çok
diğer hesapsal bilim yaklaşımında önemli bir rol oynarlar.

2
Norm Edilmiş Lineer Uzaylar
Soyut Analiz ve uygulamalarda ilgilenilen vektör uzaylarının 7 önşarttan daha
fazlasına ihtiyacı vardır. 7 önşart vektör uzaylarının sadece cebirsel özelliklerini
tanımlar: toplam, skalar çarpım, ve bunların değişik kombinasyonları. Eksik
olanlar topolojik olan özelliklerdir, yani açıklık (openness), kapalılık (closure),
yakınsaklık (convergence), ve bütünlük (completeness). Eğer uzayın içinde uzaklık
ölçümü tanımlanır ise, bu kavramlar kullanılabilir.
Tanım
Norm edilmiş bir lineer uzay X adındaki bir vektör uzayıdır, ki X içindeki her x
öğesini bir reel sayı ||x||’e eşleyen bir fonksiyon vardır, ve ||x||’e x’in norm’ü adı
verilir. Norm şu önşartları yerine getirmelidir.
1) ||x|| > 0, her x ∈ X için, ve ||x|| = 0, sadece ve sadece x = θ ise.
2) ||x + y|| 6 ||x|| + ||y|| her x, y ∈ X için (üçgensel eşitsizlik)
3) ||αx|| = |α| ||x||, her skalar α ve her x ∈ X için.
Norm kavramı uzaklık kavramının soyutlaştırılmış bir halinden ibaret aslında.
Reel analizdeki üçgensel eşitsizliğin karşılığı burada da görülüyor mesela. Neyse,
devam edelim, üstteki üçgensel eşitsizlik kuralının bir uzantısı / sonucu (lemma)
şu:
Teori
Norm edilmiş bir lineer uzayda

||x|| − ||y|| 6 ||x − y|| (1)

İspat

||x|| − ||y|| = ||x − y + y|| − ||y||

Üstte adece ||x|| içine −y + y ekliyoruz, yani aslında hiçbir şey değiştirmedik.
Şimdi eşitliğin sağındaki ilk terimi alıp ona üçgensel eşitliği uygularsak (norm
içindeki + işareti solu ve sağındaki grupları ayrı terimler olarak kabul etmemiz
gerekir)

||x − y + y|| − ||y|| 6 ||x − y|| + ||y|| − ||y||

elde ederiz. Biraz daha basitleştirince

||x|| − ||y|| 6 ||x − y||

3
Uygun bir norm bulunabilirse, daha önce gösterdiğimiz vektör uzayı örneklerinin
çoğunluğu norm edilebilen uzaya dönüştürülebilir.
Örnek 1
C[a, b] adı verilen norm edilmiş uzay, [a, b] reel aralığı, artı norm

||x|| = max |x(t)|


a6t6b

tanımından oluşur. Hatırlarsak bu uzay daha önce bir vektör uzayı olarak gösterilmişti.
Norm [a, b] aralığına bakıyor, her x(t) için mutlak değeri (absolute value) en
yüksek olan değeri alıp onu norm değeri ilan ediyor. Fonksiyon bir parabol ise,
parabolun tepe noktası o fonksiyon için norm kabul edilecek.
Şimdi teklif edilen norm’un 3 gerekli önşartı yerine getirip getirmediğine bakalım.
Bariz ki ||x|| > 0 çünkü norm kesin değer kullandık ve kesin değerler hep sıfırdan
büyük, ayrıca ||x|| sıfır olması için x(t)’nin her yerde sıfır olması lazım, fonksiyon
tek bir noktada sıfırdan azıcık daha büyük olsaydı, max hemen onu norm kabul
ederdi. Üçgensel eşitsizlik alttaki ilişkinin bir uzantısı zaten

max |x(t) + y(t)| 6 max[|x(t)| + |y(t)|] 6 max |x(t)| + max|y(t)|

Üstteki eşitsizlikler maksimum fonksiyonun özellikleri, ve bu özellikler onun


üçgensel eşitsizliği de yerine getirmesini sağlıyor.
En son olarak 3. önşart alttaki ilişkinin doğal sonucu olarak yerine getirilmiş
oluyor

max |αx(t)| = max |α||x(t)| = |α| max |x(t)|

Örnek
[a, b] aralığında tanımlı tüm sürekli fonksiyonların uzayı alttaki norm üzerinden
bir norm edilmiş uzaydır

Zb
||x|| = |x(t)| dt
a

Dikkat, bu norm edilmiş uzay C[a, b]’den farklıdır.


Örnek
Öklitsel
Pn n-uzayı ki En olarak temsil edilir, ve norm’u x = {ξ1 , ξ2 , .., ξn } için ||x|| =
( i=1 |ξi |2 )1/2 , bir norm edilmiş uzaydır.
Yakınsaklık (Convergence)

4
Çoğu zaman, istenen bir özelliğe sahip olan bir vektörün varlığını ispat ederken
belli bir limite yaklaşan bir vektör dizisi yaratmak yaygın bir tekniktir. Çoğu za-
man bu limitin istenen özelliğe sahip olduğu gösterilebilir. Bu sebeple yakınsaklık
kavramı Analizde çok önemli rol oynayan bir kavramdır.
Tanım
Norm edilmiş bir lineer uzayda sonsuz sayıda vektör içeren bir dizi {xn }’in x’e
yaklaştığı söylenir eğer {||xn − x||} reel sayılar dizisi sıfıra yaklaşıyorsa. Bu du-
rumda xn → x diyebiliriz.
Eğer xn → x, ||xn || → ||x|| olmalı, çünkü (1)’e göre

||xn || − ||x|| 6 ||xn − x||

ya da, terimlerin yeri değiştirilmiş halde

||x|| − ||xn || 6 ||x − xn ||

O zaman

||x|| − ||xn || 6 ||x − xn || → 0

olmalıdır.
Teori
Eğer bir dizi yaklaşıyorsa, limiti özgündür (unique).
İspat
Diyelim ki xn → x ve xn → y, yani xn apayrı iki limite yaklaşıyor (gibi) bir şey
ortaya attık. Peki o zaman ||x − y|| ne olur? Göreceğiz ki bu norm sıfıra gidecek
ve bu sebeple x, y’nin birbirinden farklı olamayacağını anlamış olacağız.

||x − y|| = ||x − xn + xn − y||

Üstte yine aynı numarayı kullandık, −xn +xn ekleyerek eşitlikte hiçbir şey değiştirmiyoruz,
ama daha fazla terim elde ederek şimdi üçgensel eşitsizliği kullanabileceğiz. +
işaretinin solundaki ve sağındaki blokları ayrı terimler gibi kabul edersek,

||x − xn + xn − y|| 6 ||x − xn || + ||xn − y||

ve

||x − xn || → 0

5
||xn − y|| → 0

olduğuna göre

||x − y|| → 0


Kaynaklar
[1] Strang, Lineer Algebra and Its Applications

6
Ders 5
Teori
Bir küme F kapalıdır (closed), eğer F içindeki her yakınsayan dizinin limiti yine F
içindeyse [ispat atlandı].
Tanım
Vektörü uzayı X’ten reel (ya da kompleks) skalar uzayına yapılan transformasy-
ona X üzerinde tanımlı bir fonksiyonel denir.
Dikkat fonksiyon değil, fonksiyonel. Fonksiyonelleri diğer daha genel trans-
formasyonlardan ayırtetmek için onlara notasyon olarak küçük harfler verilir,
mesela f, g gibi.
Norm edilmiş uzayda f(x) = ||x|| bir fonksiyonel örneğidir. Yani norm operatörünün
kendisi de bir fonksiyoneldir. Reel değerli fonksiyoneller optimizasyon teorisi
açısından çok önemlidir normal olarak çünkü optimizasyonun amacı bir fonksiy-
oneli minimize (ya da maksimize) edecek bir vektörü bulmaktır.
lp ve Lp Uzayları
Şimdi derslerin geri kalanında çok kullanacağımız, faydalı olacak bazı klasik
norm edilmiş uzayları görelim.
Tanım
0 < p < ∞ olacak şekilde p bir reel sayı olsun. lp uzayı {ξ1 , ξ2 , ...ξn } skalar
dizisidir, ki bu dizi şu şarta uymalıdır,

X

|ξi |p < ∞
i=1

p sayısı tanımlanan uzaya göre değişir, yani l3 olabilir, bir diğeri l5 , vs. Bu uzayın
normu nedir? Dikkat, üstteki bir norm değil, uzayı tanımlamak için kullandığımız
şartlardan biri. Norm,

X
∞ 1/p
||x||p = |ξi |
p

i=1

l∞ uzayı tüm sınırlı (bounded) dizileri içinde barındırır. p = ∞ kullanılması biraz


garip gelebilir, |ξi |’in hem ∞ ile katı alınacak, hem de tüm bu katların toplamı
sonsuzluktan küçük olacak!
l∞ içindeki bir öğe x = {ξi }’in normu

||x||∞ = sup |ξi |


i

1
Banach Uzayları
Tanım
Bir norm edilmiş uzayda {xn } dizisine Cauchy dizisi denmesinin şartı şudur: Eğer
m, n → ∞ iken ||xn − xm || → 0 doğru olmalıdır; mesela verilen  > 0 için öyle bir
N olmalıdır ki, her n, m > N için ||xn − xm || <  doğru olmalıdır.
Bir norm edilmiş uzayda her yaklaşan dizi Cauchy dizisidir. Eğer xn → x ise, o
zaman

||xn − xm || = ||xn − x + x − xm || 6 ||xn − x|| + ||x − xm || → 0

Fakat bu kuralın tersi her zaman doğru olmayabilir, yani her Cauchy dizisi yaklaşıksal
olmayabilir.
İçinde her Cauchy dizisinin yakınsayan olduğu norm edilmiş uzaylar analizde
özellikle ilgi görür, önemlidir, çünkü bu tür uzaylarda yaklaşıksal dizileri bulmak
/ göstermek için onların limitlerini bulmak gerekmez (sadece Cauchy olduklarını
göstermek yeter). Bu tür norm edilmiş uzaylara tam (complete) uzaylar denir.
Tanım
Norm edilmiş uzay X içindeki her Cauchy dizisinin X içinde bir limiti var ise, bu
uzaya tam denir. Tam olan bir norm edilmiş uzaya Banach Uzayı ismi verilir.
Uygulamalarda önümüze çıkan problemleri Banach uzayına olan yansımasını /
orada da aynen işleyecek bir versiyonunu / eşdeğerini yaratmak için oldukça
çaba sarfederiz. Bu problemleri diğer, çoğunlukla tam olmayan, uzaylardan çıkartmak
için çok uğraşırız, çünkü optimizasyon problemlerinde Banach uzaylarının bir
avantajı vardır; hedef fonsiyonunu maksimize edecek optimal vektörü bulmak
için çoğunlukla bir vektör dizisi yaratırız, ve bu dizideki her eleman bir öncekinden
daha iyi olur, ve o zaman aradığımız optimal vektör otomatik olarak bu dizinin
limiti olacaktır. Bu tekniğin ise yaraması için limiti hesaplayamıyor olsak bile, bu
dizinin yaklaştığını bir şekilde bilmemiz gerekir / bunu bize gösterecek bir test
gerekir. Yakınsaklık için Cauchy kriteri işte bunu sağlar, temel aldığımız uzay
tam ise, Cauchy dizisinin yaklaşacağından emin olabiliriz.
Şimdi tam olmayan bir norm edilmiş uzay görelim.
Örnek
X uzayı [0, 1] üzerinde tanımlı tüm sürekli fonsiyonlar olsun, ve norm kxk =
R1
0 |x(t)| dt. X’in tam olmadığını ispat için X içinde şöyle bir dizi yaratacağız,

2
 1 1

 0 06t6 −


2 n

n 1 1 1
xn (t) = nt − +1 − 6t6


2 2 n 2


 1
1 t> 2

Bu dizinin her elemanı bir sürekli fonsiyondur ve bu yüzden X’in bir üyesidir.

Bu dizi Cauchy midir? ||xn − xm ||’i hesaplayalım ve n, m → ∞ iken ne oluyor


ona bakalım. Aslında hesap için entegralleri cebirsel olarak hesaplamaya gerek
yok, entegral f’in altındaki alanı hesapladığına göre, görsel olarak düşünebiliriz.
Üstteki grafikte gördüğümüz gibi her n yeni bir fonsiyon yaratır. Fakat n, m
sonsuza gittikçe ikisi de basamak (step) fonsiyonu olmaya yaklaşacaktır, ve fark-
larının normu ||xn − xm || sıfıra yaklaşacaktır. Alan farkı için tam formül

1 1 1 1 1 1 11
· 1 · ( − am ) − · 1 · ( − an ) = −
2 2 2 2 2m 2n
Yani

3
1
||xn − xm || = |1/n − 1/m|
2

Grafikte sadece pozitif kısım gözüküyor çünkü unutmayalım, t değerleri [0, 1]


arasında geliyor, ve formüldeki tüm parçalar buna göre pozitif değerler üretiyorlar.
Teori
Bir Cauchy dizisi sınırlıdır
İspat
{xn } bir Cauchy dizisi diyelim, ve N öyle bir tam sayı olsun ki n > N için ||xn −
xN || < 1 doğru olacak. n > N için

||xn || = ||xn − xN + xN || 6 ||xN || + ||xn − xN || < ||xN || + 1


Örnek
C[0, 1] bir Banach uzayıdır. Daha önce bu uzayın tam olduğunu söylemiştik.
C[0, 1]’in tam olduğunu ispatlamak için C[0, 1] içindeki her Cauchy dizisinin bir
limiti olduğunu göstermek yeterlidir.
Diyelim ki {xn } C[0, 1] içinde bir Cauchy dizisi. Her sabit t ∈ [0, 1] için |xn (t) −
xm (t)| 6 ||xn − xm || → 0, o zaman {xn (t)} reel sayılardan oluşan bir Cauchy dizi-
sidir. Bu dizi doğal olarak reel sayılar uzayı R’dedir, ve R’nin tam olduğunu biliy-
oruz. O zaman bu dizinin yaklaştığı bir x(t) her zaman olacaktır, yani xn (t) →
x(t). Bunun sonucu olarak xn fonksiyonları da x’e yaklaşmalıdır.
Genel olarak tarif etmek gerekirse, xn dizisini R’deki bir başka dizi {xn (t)}’ye in-
dirgiyoruz, yani yansımasını yaratıyoruz, seçtiğimiz tek bir t üzerinden. Uzayı
değiştirmemizin avantajı şu, R’nin tam olduğunu biliyoruz. O zaman oraya in-
dirgediğimiz Cauchy dizisinin o uzayda muhakkak bir limiti olmalıdır. Şimdi,
R’den filmi geriye sarıyoruz, her t için “yukarı çıkarken” elimizdeki limitleri
toparlıyoruz, ve xn seviyesine getiriyoruz. Bunu tüm t’ler için yapabildiğimize
göre, o zaman tüm xn ’nin de bir limiti olmalıdır.

4
Ders 6
Hilbert Uzayları
Giriş
Her lise geometri öğrencisi bir noktadan bir çizgiye olan en kısa mesafenin o
çizgiye dik olan ikinci bir çizgiden geçtiğini bilir. Kabaca da hemen görülebilecek
akla yatkın bu basit sonuç, noktadan düzleme olan mesafeler için de kolayca
genelleştirilebilir. Daha da ileri gidip n-boyutlu Öklit uzaylarına genellemek
gerekirse, bir noktadan bir altuzaya gidecek en kısa vektör o altuzaya dikgen
(orthogonal) olmalıdır. Bu arada, bu son sonuç en kuvvetli, önemli optimizasyon
prensiplerinin biri olan Yansıtma Teorisi’nin özel şartlarından biridir.
Bu gözlemde kritik püf nokta dikgenliktir. Dikgenlik kavramı genel olarak norm
edilmiş uzaylarda mevcut değildir, ama Hilbert Uzaylarında mevcuttur. Hilbert
Uzayı norm edilmiş uzayların özel bir halidir, norm edilmiş uzaylardaki özelliklere
ek olarak bir de içsel çarpım (inner product) işlemi tanımlar, bu işlem anali-
tik geometrideki iki vektörün noktasal çarpımına (dot product) eşdeğerdir, iki
vektörün içsel çarpımı sıfır ise o vektörlerin dikgen olduğu söylenebilir.
İçsel çarpım ile kuşanmış Hilbert Uzayları iki ve üç boyutlardaki geometrik buluşları
genellememizi sağlayacak yapısal bir cevher sağlar bize, sonuç olarak pek çok
analitik çözümün Hilbert Uzaylarında karşılığı vardır; Ortonormal bazlar, Fourier
Serileri, en az kareler minimizasyonu gibi kavramlarının hepsi Hilbert Uzayında
da kullanılabilirler.
Ön-Hilbert Uzayları (Pre-Hilbert Spaces)
Ön-Hilbert Uzayı bir lineer vektör uzayı X ile, X × X üzerinde tanımlanmış bir iç
çarpım işleminin beraberliğidir. Yani X’teki her elemanın bir diğeri (ve kendisi)
ile eşleşmesi üzerinde tanımlı bir iç çarpım işlemi vardır, ki bu işlem x, y ∈ X,
(x|y) olarak gösterilir, ve çarpımın sonucu bir skalar (mesela bir tek sayı) ola-
caktır.
(x|x) büyüklüğü ||x|| olarak gösterilir, norm operatörü tanıdık geldi herhalde,
p

zaten birazdan yapacağımız ilk işlerden biri bu büyüklüğün hakikaten bir norma
eşit olduğunu göstermek.
Önşartlar
1. (x|y) = (y|x)
2. (x + y|z) = (x|z) + (y|z)
3. (λx|y) = λ(x|y)
Cauchy-Schwarz Eşitsizliği
Bir iç çarpım uzayında (inner product space)r x, y için |(x|y)| 6 kxkkyk olmalı. Bu
küçüktür ya da eşittir ifadesindeki eşitlik kısmı sadece x = λy ise, ya da y = θ ise
doğru.

1
İspat
y = θ için eşitlik kısmı basitçe doğrulanabilir. O zaman diğer şartları kontrol
etmek için y 6= θ alalım. Bir skalar olan her λ değeri için

0 6 (x − λy|x − λy)

Belirlenen şartlara göre bu eşitsizlik doğru olmalı. Sadece doğru olduğunu bildiğimiz
bir ifadeyi yazdık o kadar. Bir nevi oltayı attık, bekliyoruz. Sonra üstteki ifadeye
2. önşartı uyguluyoruz

6 (x|x − λy) − (λy|x − λy)

Bu iki terim üzerinde yine 2. önşartı ayrı ayrı kullanıyoruz


 
6 (x|x) − (λy|x) − (x|λy) − (λy|λy)

6 (x|x) − (λy|x) − (x|λy) + (λy|λy)

İçinde λ olan tüm terimler üzerinde 3. önşartı uyguluyoruz

6 (x|x) − λ(y|x) − λ(x|y) + |λ|2 (y|y)

Şimdi λ = (x|y)/(y|y) farz ediyoruz. λ her şey olabileceğine göre bu belirlediğimiz


şey de olabilir. Yerine koyunca,

(x|y)(y|x) (x|y)(x|y) |(x|y)|2


6 (x|x) − − + (y|y)
(y|y) (y|y) |(y|y)|2

1. önşartı kullanarak üstteki üçüncü terimin işaretini değiştirelim

(x|y)(y|x) (x|y)(y|x) |(x|y)|2 


 
6 (x|x) − +  + (y|y)
(y|y)  (y|y) |(y|y)|

 2

|(x|y)|2
6 (x|x) −
(y|y)

Ya da

|(x|y)| 6 (x|x)(y|y) = ||x||||y||


p

2
Teori
Bir Ön-Hilbert uzayı X’te ||x|| =
p
(x|x) bir normdur.
İspat
Norm için tüm tanımlar zaten ortaya çıktı, tek eksik üçgensel eşitsizlik tanımı.
Herhangi bir x, y ∈ X için

||x + y||2 = (x + y|x + y)

= (x|x + y) + (y|x + y)

= (x|x) + (y|x) + (x|y) + (y|y)

= (x|x) + 2|(x|y)| + (y|y)

Şimdi norm ifadesini kullanalım

= ||x||2 + 2|(x|y)| + ||y||2

Sağdan ikinci terimde Cauchy-Schwarz teorisini uygulayalım

6 ||x||2 + 2||x||||y|| + ||y||2

İşaretin eşitlikten eşitsizliğe döndüğüne dikkat. ||x||||y|| kullanarak (x|y)’tan daha


büyük olan bir büyüklük kullanmaya başlamış olduk, bu yüzden eşitliğin sağ
tarafı, sol tarafından büyük hale geldi. Gruplarsak

6 (||x|| + ||y||)2

Yani

||x + y||2 6 (||x|| + ||y||)2

Karekök alırsak

||x + y|| 6 ||x|| + ||y||

Bu üçgensel eşitsizliğin ta kendisidir.




3
Tanım
Tam olan bir Ön-Hilbert uzayı Hilbert Uzayı olarak adlandırılır.
Hilbert Uzayı o zaman normu etkileyen / belirleyenbir iç çarpım işlemi tanımlamış
bir Banach uzayıdır. En , l2 , L2 [a, b] uzaylarının hepsi Hilbert uzaylarıdır. İç çarpımlar
bu arada altta gösterilen süreklilik özelliğine sahiptir.
Teori
İç Çarpımların Sürekliliği: Diyelim ki bir Ön-Hilbert uzayında xn → x ve yn → y.
O zaman (xn |yn ) → (x|y).
İspat
{xn } serisi yakınsayan olduğuna göre, sınırlı (bounded) olmak zorundadır; mesela
diyelim ki ||xn || 6 M. Şimdi,

|(xn |yn ) − (x|y)|

hesabını yapalım. İfadenin içine (xn |y) artı ve eksi işaretleriyle koyalım,

= |(xn |yn ) − (xn |y) + (xn |y) + (x|y)|

Üstteki ilk ve son iki terimi gruplayalım, 2. önşartı tersten uyguluyoruz yani,

= |(xn |yn − y) + (y|xn − x)|

Üstteki mutlak değeri ortasından parçalayacağız. Ufak not, mutlak değer op-
erasyonu için de üçgensel eşitsizlik geçerlidir, yani

|a + b| 6 |a| + |b|

O zaman

6 |(xn |yn − y)| + |(y|xn − x)|

Her iki terim üzerinde ayrı ayrı Cauchy-Schwarz eşitsizliğini uygularsak,

6 ||xn |||yn − y)|| + ||y||||xn − x||

||xn || sınırlı olduğuna göre,

|(xn |yn ) − (x|y)| 6 M||yn − y)|| + ||y||||xn − x|| → 0

4
Eşitsizliğin sağı sıfıra gidiyor, çünkü M sabit, ispatın başında xn → x ve yn → y
farzettik, o zaman üstteki farklar sıfıra gider.


5
Dışbükey Optimizasyonuna (Convex Optimization) Giriş
Yapay öğrenme (machine learning) ve optimizasyonda sürekli optimizasyonu
görürüz. Diğer disiplenlerde de görülür tabii ama bu ikisi benim ana konu-
larım o yüzden o konulardan bu derste daha fazla bahsedeceğiz. Derste be-
lirli bir amaç için gereken optimizasyon problemini çözmekten çok optimizasyon
mekanizmasının detaylarını inceleyeceğiz. Optimallik şartlarına bakmak, varılan
çözümün niteliğine bakmak bu detaylardan bazıları.
Şimdi aklınıza gelen bazı optimizasyon örneklerini verin bana [öğrenciler söylüyor]
1) Regresyon - En Az Kareler. Evet. Hata karelerinin toplamı minimize edilir
burada, bir hedef y vardır, onu bir formül üzerinden katsayıları olan bir denklem
vardır, ve model uyum iyiliğini hata kare toplamı üzerinden ölçeriz.

X
min (yi − xTi β)2
β

Başka ne tür regresyon şekilleri var?


2) Regülarize Edilmiş Regresyon - Lasso. Burada yine hata karelerin toplamı var,
ama üstüne katsayıların L1 norm’unu minimize etmeye çalışırız. Yani

X
min (yi − xTi β)2 oyle ki
β
X
|β| 6 t

3) En Az Mutlak Sapma Regresyonu (Least Absolute Deviations) - bu da benden.


Bu tür regresyon ile kare yerine mutlak değer operasyonu kullanılıyor [1, 14:35].

X
min |yi − xTi β|
β

BU tür regresyon ile aykırı (outlier) değerlere daha az önem verilmiş olur. Fakat
mutlak değer hesabı kullanınca optimizasyon zorlaşıyor çünkü üstteki formül
artık pürüzsüz değil.
4) Sınıflama - Lojistik Regresyon. LR ile yi ikisel olur, 0 ya da 1. LR formülizasyonu
normal regresyona benziyor,
5) Bilgisayar Bilim - Seyahet Eden Satış Görevlisi Problemi (TSP), Planlama, Ayrıksal
Optimizasyon. Bu ders bloklarının sonunda Tam Sayı Programlama (İnteğer
Programming) konusuna bakacağız, bu tür konulara orada daha çok yaklaşmış
olacağız.
6) İstastistik - Maksimum Olurluk. MO istatistikte pek çok yaptığımız işin mi-
henk taşıdır. Hatta LR, En Az Kareler, vs aslinda MO’nun özel, spesifik halleridir.
Burada vurgu içbükey olurluk elde etmek, ki bir içbükey fonksiyonu maksimize
etmiş olalım, bu bir dışbükey fonksiyonu minimize etmek ile aynı şey.

1
Böyle devam edebilirdik, optimizasyon örnekleri sayfalar doldurabilirdik. Opti-
mizasyon her yerde. Ama belki de neyin optimizasyon olmadığına da bakmak
iyi olur. Mesela istatistikte optimizasyon olmayan problemler nedir?
Hipotez test etmek, p-değerleri. Ya da takviyelemek (boosting), önemli bir konu
ama optimizasyon değil. Rasgele Ormanlar (Random Forests), değil. Önyükleyiciler
(bootstrap), çapraz-sağlama (cross-validation), yine değil [1, 22:09].
Ve iddiam şu ki optimizasyon olmayan konular hakkında olanlara kıyasla daha
fazla teorik bilgimiz var. Üstteki teknikler çoğunlukla prosedürsel. Ama mesela
Lasso diyelim, bu bir dışbükey optimizasyonun çıktısı olduğu için optimalite
şartları üzerinden onun çözümünün özellikleri hakkında konuşmak kolaylaşıyor.
Peki biz niye bu dersteki konuyu öğrenmek isteriz, isteyebiliriz? Sonuçta Lasso’yu
birisi bulmuş onun kodunu çağırırız, iş biter. Üç sebep var. Birincisi farklı algo-
ritmalar duruma göre daha iyi performans gösterebilir, durum derken veriden
bahsediyorum. Bu sebeple her algoritmanin özünü anlamak çok önemli. İkincisi
herhangi bir alandaki problemi çözen optimizasyonun temelini bilmek bize alan
hakkında ek görüş kazandırabilir.
Üçüncü sebep optimizasyon hızlı hareket eden bir alan, eğlenceli! Mesela opti-
mizasyon alanındaki NIPS Çalıştayına (Workshop) bakarsanız, her sene değişiyor!
Birkaç sene önce dışbükey olmayan optimizasyon büyük konuydu, tabii o zaman
bu dersi işlerken utanır gibi oluyorduk çünkü bizim konu dışbükey optimiza-
syon ve yapay öğrenimdeki en büyük konferansta dışbükey olmayan konular
işleniyor.. Fakat o zamanki odağın sebebi o zamanlarda bir sürü yeni dışbükey ol-
mayan ve yakınsadığı ispat edilen metotların bulunmuş olmasıydı. Ama bir son-
raki sene rasgele (stochastic) optimizasyon geri dönüş yapmıştı, rasgele gradyan
inişi vs. Böyle her sene değişim oluyor, bu güzel bir şey demek ki hala ilerleme
için oldukça alan var.
Ornekler
Bu orneklerin cogu tam varyasyon gurultu yoketmek (denoising) etrafinda, bunun
bir diger ismi kaynasmis (fused) lasso. Elimizde iki boyutlu izgara halinde bir
veri var, bir goruntu, i, j kordinatlarinda bir renk degeri var, 3 ile 7 arasindaki
renkler.

En soldaki gerçek resim. Ortadaki ise onun gürültülü hali, bizim elimizdeki veri

2
bu diyelim. Görüntüyü y vektörü olarak temil edeceğiz, bu tek boyutlu ama
düşünün ki görüntüdeki iki boyutu alıp düzleştirdik, tek vektör yaptık, alt alta
satır satırları yanyana koyduk mesela, vs. Bu resim hakkında şunu biliyoruz,
görüntü parçasal olarak sabit, yani yanyana hücreler birbirinden çok farklı değil.
Bazı yerlerde olabilir mesela mavi arka plandan kırmızı objeye geçiş yapılan yer-
lerde, ama diğer yerlerde benzerlik var. Biz gürültülü resimden gürültüsüz resmi
çıkartmak istiyoruz.
Gürültü yoketme alanında pek çok yöntem var. Fakat gürültü yoketme problem-
ine optimizasyon açısından yaklaşabiliriz. Mesela, hedef kriteri şu haldeki bir
optimizasyon problemi,

1X X
n
minn (yi − βi )2 + λ |βi − βj |
β∈R 2
i=1 (i,j)∈E)

İlk terimde aradığımız ideal resim ile gerçek resim arasındaki karesel kayıp hesabı
var, yani her hücredeki θi ’in olabildiği kadar yi verisine yakın olmasını istiyoruz.
İkinci terimdeki λ bizim dışarıdan atadığımız bir parametre, iki terim arasındaki
dengeyi kuruyor. Bu parametrenin çarptığı ikinci terim bir ceza terimi. Yanyana
olan her i, j’ye bakıyor, sağda solda altta üstte olsun, bu hücrelerin renk farkını
cezalandırıyor, yani farkın daha az olmasını zorluyor çünkü resimde genel olarak
bir süreklilik olmasını istiyoruz. Oldukça sofistike bir işlem aslında, ama opti-
mizasyon formülasyonu açısından oldukca basit. İki terim var, o kadar.
Çözüm resimde en sağdaki resimde görülüyor. λ = 25 seçtim onun için, ve
çözdüm. λ’yi arttırdıkça resmin daha kaba görüntülü olmaya başladığını görebilirdiniz,
mesela kırmızı ile pembe bölgeler birbiri içine geçmeye başlayabilirdi. λ = ∞
için ne olur? Her şey tek bir renk olur, o renk y’nin ortalaması olurdu. λ = 0 için
gürültülü verinin aynısını elde ederiz.
Çözümü nasıl elde ettim? Üstteki sonucu ADMM ile elde ettim. Bu ders bloğunun
sonunda bu algoritmayi göreceğiz. Bu problemde ADMM’in spesifik bir ver-
siyonunu kullandım, bu versiyonun bu problemde iyi işleyeceğini biliyordum.
300x200 boyutunda bir resimdi, 20 döngü sonrası sonucu elde ettim, her döngüde
lineer zaman harcadı. Tüm işleyişi bir saniyenin ufak bir parçasıydı.
Proksimal gradyan inişi ile 1000 kere döndük, sonuç fena değil ama bazı renkler
tam birleşmedi. Eğer 10000 kere döndürseydim ADMM sonucuna yaklaşırdı. Bu
metot ile de her döngüde lineer zaman harcanıyor, ama algoritmanın tamamı
daha yavaş yakınsadı. Yani, amaç için doğru araç diyemeyiz.
Sonra kordina iniş adında çok popüler bir diğer metot işlettim, 10000 kere döndü,
adımlar lineer zaman, ama yakınsama olmadı. Hatta sonuç oldukca kötüydü.
Kesinlikle amaç için yanlış araç. Yani iyi ile kötü metot arasında boyutsal fark
var (order of magnitude), işlem hızı bakımından 1, 2, daha kötü değil, 10, 100 kat
daha kötüden bahsediyoruz, ve kalite iyi değil.
Bu arada kordinat inişini öğrenince üstteki kriteri nasıl kullandığım kafa karıştırabilir,

3
cevap algoritmayi kriterin ikizi üzeride işlettim. Dersimizde ilerledikçe bunun
anlamını öğreneceğiz. Bir problemin ikizini almak ve bu ikize algoritmaları nasıl
uygulanacağını görmek.. bunları hep göreceğiz.
Mesajım ne? ADMM her yerde çok iyi işler demek mi? Hayır. ADMM bazı
yerlerde daha kötü işler. Diğer yerlerde proksimal gradyan daha iyidir. Bu se-
beple tüm seçenek yelpazesinin bilmek, her algoritmanin özelliklerini anlamak
faydalıdır.
Bir diger ornek [1, 42:53]. Tam varyasyon gurultu yoketme yapiliyor yine ama
burada iki boyuta bakmak yerine tek boyuta bakiyoruz, yani bazi acilardan bu
problem daha kolay. Veri yine y1 , .., yn ama duzlestirilmis goruntu yerine tek bir
eksende veri. Ayrica verinin ortalamasi parcasal sabit, yani tek duz cizgi.

1 X
n−1
2
min (yi − θi ) + λ |θi − θi+1 |
θ 2
i=1

Burada ceza teriminde yanyana olan iki θ’nin farkini cezalandiriyoruz, yani yanyana
verinin benzer olmasini istiyoruz.

Veriye bakarsak iki bolge var, bir bolgede ortalama sabit digerinde de (baska)
bir sabit. Ama algoritma bunu bilmiyor tabii onu kesfetmesi gerekecek. Eger λ
buyukse global ortalama ortaya cikiyor, tek cizgi. Goruntu orneginde soyledigimiz
oluyor yani ama tek boyutta. λ kuculdukce farkli ortalama bloklarinin ortaya
cikmasini sagliyoruz. Ortadaki sonuc oldukca iyi. 3. resimde λ biraz daha ku-
cultuldu, burada bakiyoruz algoritma basta ufak bir blok daha yaratmayi secti.
Bloklarin arasindaki noktaya “degisim noktasi (changepoints)” denir.
Bir değişim noktası elde edince, şimdi kendimize bir istatistiki soru sorabiliriz.
Bu değişim noktalarının istatistiki önemi (significance) nedir? Görsel olarak ben
bakınca diyorum ki 3. resimde sağdaki değişim noktası önemli ama o baştaki
ufak değişim değil. O yapma (spurious) bir değişim herhalde. Tabii λ’yi daha da
ufaltsam daha da fazla uyduruk değişim noktaları elde ederdim. Optimizasyon
probleminin özü böyle, ayar değişkeni λ elde edilen sonuçlara, neye ne kadar
ağırlık verildiğini kontrol ediyor. Fakat istatistiki öneme dönersek bu tür soruları
sadece tam varyasyonu iyi anladığımız takdirde cevaplandırabiliriz.

4
Çünkü istatistiki önem hesabı için mesela 1. blok ile 2. bloktaki noktaların orta-
lamasının farkına bakılır, ve bir Normal dağılım referans alınarak sıfır hipotezi
test edilir, ve bu hipotez neredeyse her seferinde rededilecektir (yani test bloklar
farklıdır diyor ama biz olmadığını görüyoruz). Niye böyle oldu? Çünkü opti-
mizasyonun kriterine bakarsak biz orada aktif olarak ortalama farkını fazlalaştırmaya
uğraşıyoruz. Ve tabii ki uğraştığımız şeyi test edince farklılık olduğunu buluy-
oruz. Bu doğru değil! Eğer optimizasyonun ne yaptığını bilmesek bu sonuca
varamazdık.
Devam edelim; Bu dersin merkezi kavramı dışbükeylik. Tarihsel olarak ilk başta
lineer programlar vardı, çok ciddi bir şekilde araştırıldı bu konu, koca dersler bu
konuya harcandı. O zamanlar düşünülüyordu ki lineer olan ve olmayan ayrımı
optimizasyonda en önemli ayrımdır. Bir tarafta çözebildiğimiz LP’ler var, diğer
tarafta daha zor, çözülmez LP olmayan problemler.
Ama sonradan anlaşıldı ki bazı LP olmayan problemler aslında o kadar çözülemez
değil. Mesela biraz önceki 1D lasso problemi LP değil ama çözülebiliyor. Ama
tabii bazı LP olmayan ve çok çetin problemler de var.. Devam eden araştırmayla
ortaya çıktı ki esas ayrım LP/olmayan değil, dışbükey / olmayan arasında. Çünkü
dışbükey problemler ve olmayan problemler çok çok farklı mahlukatlar. Dişbukey
problemlerde genel algoritmalardan bahsedebiliyoruz, bu algoritmalar bazı şartlarda
iyi, kötü işleyebilir ama hepsinin ispatlanabilir yakınsanabilirliği var. Elimizde
KKT optimallik şartları ve ikizlik gibi teorik araçlar var bu sayede dışbükeylikte
elde edilen sonuçların özelliğini anlamamıza yardım ediyor.
Teoriye giriş yapalım artık.
Dışbukey Kümeler ve Fonksiyonlar
Dışbukey küme C ⊆ Rn , öyle ki

5
x, y ∈ C ⇒ tx + (1 − t)y ∈ C, ∀0 6 t 6 1

Yani dışbükey küme C de seceğim herhangi iki nokta arasında çekeceğim düz
çizgi o küme içinde kalmalıdır [1, 1:00:24].

Üstteki resimde soldaki küme dışbükey değil, sağdaki dışbükey.


Dışbükey fonksiyon f : Rn → R, ki dom (f) ⊆ Rn dışbükey olacak şekilde, ve

f(tx + (1 − t)y) 6 tf(x) + (1 − t)f(y), 0 6 t 6 1 için.

Üstteki diyor ki dışbükey fonksiyonun tanım kümesi, alanı dışbükey küme ol-
malı, ki Rn öyledir, ve bu fonksiyonu herhangi iki noktada hesaplayınca elde
ettiğim değer o iki nokta arasında çektiğim düz çizgi altında kalmalı.

Tipik problem

min f(x), öyle ki


x∈D

gi (x) 6 0, i = 1, .., m
hj (x) 6 0, j = 1, .., r

ki D her f, g, h fonksiyonunun ortak tanım kümesi. Dişbukey optimizasyon prob-


leminde f, g dışbükey ve h ilgin (affine) olmalıdır. f, g üzerinden gösterilen şartlara
uyan değerler olurlu (feasible) değerler olarak bilinir.
Dişbukey problemler için yerel minimum [1, 1:06:03] global minimumdur. Yani
tek başına diğerlerinden izole bir yerel minima diye bir şey yoktur. Bu demek-
tir ki eğer optimizasyon sırasında bir alt noktaya varırsanız, bu nokta global
çözümdür.

6
Formel şekilde, bir x noktası yerel minimumdur, eğer

f(x) 6 f(y) ||x − y||2 6 ρ ve her olurlu y icin

doğru ise, yani alt noktadayım ve ρ büyüklüğünde bir top içinde olurlu değerler
üzerinden etrafa bakınca f(x)’den daha ufak bir değer görmüyorum.
Dişbukey problemlerde

f(x) 6 f(y) her olurlu y icin

ifadesi doğrudur, yani ρ sonsuzluktur. Minimuma geldik, ne kadar uzağa bakarsak


bakalım, sonsuz büyüklükte top içinde her yerde en minimum biziz.
İspatlayalım. Bunu çelişki ile ispat üzerinden yapacağız. Diyelim ki elimizde
olurlu bir nokta z var, yani ∃z ∈ D ve öyle ki f(z) < f(x). Bu z noktası x’den daha
minimal. O zaman ||z − x||2 > ρ olmali, yerel optimal x’in etrafındaki ρ topunun
dışındayım.
Şimdi x ve z arasındaki y noktalarına bakalım,

y = tx + (1 − t)z, 06t61

y hakkında neler biliyoruz?


- y ∈ D? y ortak küme içinde mi? x, y küme içinde onların kesiştiği y kümesi tabi
ki D içinde.
- y olurlu mu? Evet.

gi (tx + (1 − t)z) 6 tgi (x) + (1 − t)gi (z)

60

Ayrıca, bunu ödev olarak kontrol edin,

hi (tx + (1 − t)z) = 0

çünkü h lineer.
Yani y olurlu, her kısıtlamaya uygun.
Ayrıca yeterince büyük (1’e yakın) t için

||x − y||2 6 ρ

7
demek istiyoruz ki x’den z’ye bir çizgi çekiyorum ve yeterince z’ye yakın bir
notkada ρ topunun dışına çıkmış oluyorum.

Güzel. Top içinde olurlu bir noktam var, tanım kümesi içinde, y de orada. f(y)
hakkında ne söyleyebilirim?

f(tx + (1 − t)z)

f dışbükey değil mi? O zaman üsttekini dışbükeylik üzerinden açarsam,

6 tf(x) + (1 − t)f(z)

Ve biliyorum ki f(z) < f(x), yani harfiyen küçüklük var, çünkü daha önce söylemiştik,
x global minimum değil, kriterler ışığında z ondan daha iyi. Ayrıca üstte “yeter-
ince büyük t” dedik, bunun için, topun dışına çıkıyoruz, z’ye yakınız ama tam z
değiliz. O zaman üstteki formül

< f(x)

olacaktır. Şimdi çelişkiye geldik, top içinde öyle bir y noktası bulduk bu nokta
harfiyen f(x)’den küçük ama bunu yapınca yerel minimum / optimumluk faraziyesini
ihlal etmiş olduk.
Kaynaklar
[1] Tibshirani, Convex Optimization, Lecture Video 7, https://www.youtube.
com/channel/UCIvaLZcfz3ikJ1cD-zMpIXg

8
Lineer Programlama ve Simplex
LP, Operasyonel Araştırma konusunun mihenk taşlarından biridir, ve bu alanda
George Dantzig simplex buluşu ile lineer optimizasyon alanında çığır açmıştır.
Lineer programlama ile çözülebilen problemlerde bir hedef fonksiyonu vardır,
tüm değişkenler artı değerdedir, ve sınırlama (constraint) ifadeleri vardır, bu
ifadeler a1 x1 + a2 x2 + ... + an xn 6 b şeklinde olurlar, ki b > 0 olacak şekilde.
Örnek
6000 akrelik (1 akre 0.4 hektara eşdeğer) bir tarlada ya mısır ya da soya ekebiliriz.
Mısırın her akresi için 9 galon (1 galon 3.78 litre) gübre, ve 3/4 saatlik işçilik
gerekli. Her akre soya için 3 galon gübre ve 1 saat işçilik gerekli. Çiftçinin elinde
40500 galonluk gübre, ve en fazla 5250 saatlik iş gücü var. Eğer mısır için galon
başına 60 lira, soya için 40 lira para kazanılıyorsa, tarlada ne kadar mısır ve soya
ekilmelidir ki kazanç maksimize edilsin [3, sf. 306]?
Eğer x mısır y soya miktarı ise,

maksimize et 60x + 40y, öyle ki


x + y 6 6000
9x + 3y 6 40500
3
x + y 6 5250
4
Daha fazla ilerlemeden önce bazı numaralar: bugünlerde bu tür problemler bil-
gisayar üzerinden çözülüyor, ve her çözüm paketi girdileri farklı şekilde isteye-
bilir. Kimisi maksimizasyon değil minimizasyon çözmek için yazılmıştır mesela.
Dert değil, bir maksimizasyon problemini minimizasyona çevirmek için hedef
fonksiyonunu eksi ile çarpmak yeterli (ya da minimizasyonu maksimizasyon
yapmak için, ters yönde). O zaman −60x − 40y ifadesini minimize de edebilirdik.
Pay bırakma değişkenleri (slack variables): Küçüktür büyüktür işaretlerini eşitlik
ifadelerine çevirmek istiyorsak, bunun için pay bırakma / gevşeklik değişkenleri
kullanabiliriz. Mesela

x + y 6 6000

ifadesini

x + y + s1 = 6000

olacak şekilde değiştirebiliriz, ki s1 > 0. Pay bırakma kelimesinin nereden geldiğini


görebiliyoruz burada, sanki s1 , x + y değeri ve 6000 değeri arasında bir “pay
bırakıyor”, bir gevşeklik olmasını sağlıyor. Eğer x + y en fazla 6000 olabilirse
o zaman x + y ile 6000 arasındaki fark kadar bir bölgede bir başka değişken

1
tanımlanabilir, ve bu değişkenin herhangi bir değere sahip olmasına izin verilir,
yeter ki x + y + s1 6000’e eşit olsun.
Küçüktür ya da eşittir ifadelerini böyle çevirebiliriz. Büyüktür ya da eşittir ifadeleri
için,

x+y>c

−x − y 6 −c

−x − y + s1 = −c

x + y − s1 = c

Yani büyüklük ifadelerini negatif pay bırakma değişkenleri ile eşitliğe çevirebiliriz.
Aynı şekilde diğer eşitsizlikleri değiştiririz, tabii her değişim için ayrı bir pay
bırakma değişkeni gerekir, s2 , s3 , .. böyle devam eder.
Hedef fonksiyonu da ufak bir değişim üzerinden aynı sınırlamalar listesine dahil
edilebilir, P = 60x + 40y hedefi −60x − 40y + P = 0 olarak değiştirilir.
Tüm denklem sistemi şöyle,

Bu sistemi matris üzerinden göstermek daha kolay,

Çözümün genel stratejisi şudur: matris üzerinde satır bazlı değişim yaparak (ki
bu tür değişimlerin lineer denklem sisteminde değişiklik yaratmadığını biliy-
oruz) matrisin x, y değişkenlerinin olduğu bölgede sadece 1, 0 değerleri kalacak
hale getir. Ardından x, y çözümünü matrisin en sağ kolonundan oku.
Değişimleri yaparken tabii ki maksimizasyon amacına en hızlı erişecek şekilde
bu değişimleri yapmak isteriz.

2
En son satır hedef fonksiyonuna tekabül ediyor, ve amacımız maksimizasyon
olduğu için, maksimizasyona en hızlı şekilde erişmenin en iyi yolu en son satırda
değeri en küçük (en negatif) olan değeri değiştirmek. Bu kolonu pivot kolonu
olarak seçeriz.
Bu kolondaki hangi öğeyi seçeceğiz? Onun için o kolondaki her ögeyi matrisin en
sağındaki kolonda ona tekabül eden öğeye bölerek sonuca bakarız. Bu sonuçların
içinde hangisi daha küçük ise o hücre pivot ögesi haline gelir. Bu seçim, ve sebe-
pleri hakkında daha teorik detaylar [6, sf. 382]’da bulunabilir.

Pivot ögesi 9’u 1 haline getirmek ve o kolonda diğer tüm değerleri sıfırlamak için
satır operasyonları yaparız (Ri i’inci satır anlamında).

Bu şekilde A matrisini B’ye dönüştürdük. Şimdi aynı algoritmaya devam edelim.


En negatif değer hangisi? -20 değeri,

3
Böylece C matrisine eriştik. Amaçladığımız gibi x, y bölgesinde 1 ve 0 değerleri
var, bu noktada hedef fonksiyonun optimal değeri 315,000 (sağ alt köşe), ve y =
2250, x = 3750 bu optimal değer anındaki x, y değerleri. Demek ki çiftçinin tar-
lasının 3750 akresinde mısır, 2250 akresinde soya ekmesi onun için en kazançlısı
olacak.
Algoritma en alt satırda hiç negatif değer kalmayıncaya kadar devam eder.
Not: Her problem üstteki gibi acısız çözülemeyebilir; birden fazla, ya da hiç
çözüm olmadığı durumlar vardır, bu gibi farklı şartlar için [3]’e danışılabilir.
En iyisi tabii ki tüm bu hesapları ve şartları gözönüne alabilen bir optimizasyon
yazılımını kullanmak. Altta bunun örneğini göreceğiz.
Berlin’e Hava İkmali (Berlin Airlift)
Simplex, 2. Dünya Savaşı sırasında Berlin’e Hava İkmali adlı yardım operasy-
onunda yoğun bir şekilde kullanıldı. 24 Haziran 1948’te Sovyetler Birliği Doğu
Almanya’dan Berlin’e giden tüm kara ve deniz yollarını tıkadı. Bu yüzden Berlin’de
yaşayan 2 milyon insana yiyecek, giyim, vb. eşyaları nakil edebilmek için Amerikalı
ve İngiliz uçaklarından oluşan dev bir nakliyat operasyonu planlandı. Elde sınırlı
miktarda uçak, kargo kapasitesi vardı ve diğer bazı kısıtlamalar (constraints) da
göz önüne alınarak, durum bir lineer programa verildi ve optimal seferler plan-
landı. Simplex metodunun muciti George Dantzig bu problem üzerinde bizzat
uğraştı.
Bu problemin tam tanımı halen yayınlanmış değil, fakat esasına en yakın olan bir
örnek [5, sf. 20]’de bulunabilir. Bir diğeri, [4] baz alınarak, şöyle: Değişkenler 3
tip uçağın kaç tanesinin yiyecek ve kömür için kullanılacağı, yani 6 değişken var,
bunlar 1. tip uçak yiyecek için x1f , kömür için x1c diye gidiyor, diğerleri x2f , x2c ,
x3f , x3c .
Kısıtlamalar şöyle; 1500 tondan daha fazla yiyecek, 3500 tondan daha fazla kömür
lazım. 1. tip uçaktan en fazla 10 tane kullanabiliriz, 2. tipten en fazla 22 tane, 3.
tipten 10 tane.
Hedef fonksiyonu bir minimizasyon, bir masraf fonksiyonu bu, yani en az mas-
rafı olacak şekilde hedefe ulaşmak istiyoruz, hepsini bir arada gösterelim,

minimize et 1000x1f + 1000x1c + 2000x2f + 2000x2c + 1200x3f + 1200x3c , öyle ki


100x1f + 200x2f + 150x3f > 1500
100x1c + 200x2c + 150x3c > 3500

4
x1f + x1c 6 10
x2f + x2c 6 22
x3f + x3c 6 10

Basitleştirme amaçlı olarak x1f , x1c , .. yerine x1 , x2 , .. kullanalım, yani düz sayı
bazlı indisler olsun.
Bu problemde hem daha küçüktür, hem daha büyüktür türünden eşitsizliklerin
karışık şekilde kullanıldığını görüyoruz. Eşitsizliklerin hepsini pay bırakma değişkenleri
üzerinden eşitliklere çevireceğimiz için bu dert değil.
Bu problemi çözerken scipy.optimize adlı bir kütüphane çağrısı kullanacağız.
Bu çağrı minimizasyon yapar (yani maksimizasyon problemlerinin hedefi eksi
ile çarpılarak tersine çevirilmelidir) ve girdi olarak hem eşitsizlik, hem eşitlik
şartlarını alabilir, biz A_eq, b_eq parametreleri üzerinden ikincisini kullanacağız.

from scipy.optimize import linprog


import numpy as np

A = np.array([[-100.,0,-200.,0,-150.,0.,-1.,0,0,0,0],
[0,-100.,0,-200.,0,-150.,0,-1.,0,0,0],
[1.,1.,0,0,0,0,0,0,1.,0,0],
[0,0,1.,1.,0,0,0,0,0,1.,0],
[0,0,0,0,1.,1.,0,0,0,0,1.]])

b = np.array([-1500., -3500., 10., 22., 10.])

c = np.array([1000., 1000., 2000., 2000., 1200., 1200.,0,0,0,0,0])

res = linprog(-c, A_eq=A, b_eq=b, options={"disp": True})

print (res)
Optimization terminated successfully.
Current function value: -50000.000000
Iterations: 7
fun: -50000.0
message: 'Optimization terminated successfully.'
nit: 7
slack: array([], dtype=float64)
status: 0
success: True
x: array([ 0. , 10. , 7.5, 12.5, 0. , 0. , 0. ,
0. , 0. , 2. , 10. ])

Sonuç ilginç, 3. tip uçaktan hiç seçim yapılmamış. Bu mantıklı aslında çünkü
3. tip uçağın işletim masrafı 1.’den daha fazla ve bu uçaklardan elimizde 1. tip
kadar var.
Bir numara: pay bırakma değişkenlerinin ana matris içinde sadece köşegen üzerinde
değerlerinin olduğu dikkati çekmiş olabilir. Bu matrisi daha hızlı bir şekilde, ayrı
yaratıp soldaki diğer kısma eklesek kodlama daha hızlı olmaz mı? Evet; pay
bırakma değişkenlerini bir vektörde tutup bir birim matrisi ile çarparsak

5
svec = [-1,-1,1,1,1]
print np.eye(5,5) * svec

[[-1. -0. 0. 0. 0.]


[-0. -1. 0. 0. 0.]
[-0. -0. 1. 0. 0.]
[-0. -0. 0. 1. 0.]
[-0. -0. 0. 0. 1.]]

sağdaki kısmı elde ederiz. Şimdi soldaki kısma hstack ile “yapıştıralım”,

A = np.array([[-100.,0,-200.,0,-150.,0.],
[0,-100.,0,-200.,0,-150.],
[1.,1.,0,0,0,0],
[0,0,1.,1.,0,0],
[0,0,0,0,1.,1.]])

print np.hstack((A, np.eye(5,5)*svec))

[[-100. 0. -200. 0. -150. 0. -1. -0. 0. 0. 0.]


[ 0. -100. 0. -200. 0. -150. -0. -1. 0. 0. 0.]
[ 1. 1. 0. 0. 0. 0. -0. -0. 1. 0. 0.]
[ 0. 0. 1. 1. 0. 0. -0. -0. 0. 1. 0.]
[ 0. 0. 0. 0. 1. 1. -0. -0. 0. 0. 1.]]

İkmal Problemi, Tekrar


Bu ikmal probleminin bir degisik tanımı daha var, bu halini de dahil ettik, belki
bilgilendirici olur.
Bir Amerikalı uçağın kargo kapasitesi 30,000 feet3 , İngiliz uçağının kargo kapa-
sitesi 20,0000 feet3 idi. Sovyetlerin engellemelerini etkili bir şekilde aşabilmek için
müttefik güçler taşıdıkları yükü maksimize etmek zorundaydılar. Diğer kısıtlamalar
şöyleydi: En fazla 44 uçak kullanılabilecekti. Daha büyük Amerikan uçaklarını
uçurmak için 16 kişilik bir ekip gerekiyordu, İngiliz uçakları için 8 kişi gerekiy-
ordu. Kullanılabilecek elde olan ekipler toplam 512 kişiydi. Amerikan uçağının
her uçuşunun masrafı $9000, İngiliz uçağın $5000 idi. Ve nihayetinde haftalık
masraf toplam olarak $300,000’i geçemeyecekti.

maksimize et 30000x + 20000y, öyle ki


x + y 6 44
16x + 8y 6 512
9000x + 5000y 6 300000

from scipy.optimize import linprog


import numpy as np

A = np.array([[1., 1., 1., 0., 0.],


[16., 8., 0., 1., 0.],
[9000., 5000., 0., 0., 1.]])

6
b = np.array([44., 512., 300000.])
c = np.array([30000., 20000., 0., 0., 0.])
res = linprog(-c, A_ub=A_ub, A_eq=A, b_eq=b, options={"disp": True})
print (res)

Optimization terminated successfully.


Current function value: -1080000.000000
Iterations: 3
fun: -1080000.0
message: 'Optimization terminated successfully.'
nit: 3
slack: array([], dtype=float64)
status: 0
success: True
x: array([ 20., 24., 0., 0., 0.])

ekrana gelecek. Yani hesap (cost) adı verilen hedef fonksiyonu kargo büyüklüğünün
1080000.0 olduğu noktada maksimize oldu (haftada en fazla bu kadar kargo taşınabilecek),
ve bu optimal nokta için x = 20, y = 24 olmalı. Demek ki optimal bir Berlin ikmal
operasyonu için 20 Amerikalı, ve 24 İngiliz uçağı kullanmak gerekiyor.
Dantzig hakkında da ilginç hikayelerden biri: Doktorasını yaptığı sırada öğrenciyken
bir istatistik dersine geç girer. Hoca, tahtaya bazı problemler yazmıştır, Dantzig
bu problemleri ödev problemi olarak not eder. Ödevler Dantzig’i çok zorlar, an-
cak birkaç hafta sonra çözebilir, ödevleri hocasının masasına bırakır, ve olayı un-
utur. Fakat birkaç gün sonra hocasının heyecanla evine geldiğini görür, hocası
ona o problemlerin ödev sorusu değil, istatistikin en çetin, halen çözülememiş
problemlerinden ikisi olduğunu o zaman söyler! Yani Dantzig farkında olmadan
kısa zaman içinde aslında ciddi bir tez araştırması yapmıştır!
Bu hikayede ilginç psikolojik bir boyut var. Dantzig problemi “bir ödev olarak
verildiği için çözmesi beklendiğini” düşündüğü için mi çözmüştür? Belki de.
Bu hikaye Manuel Blum’un doktora hakkında söylediklerini çağrıştırıyor (bkz.
Doktora Derecesi yazısı).

7
Karesel Programlama (Quadratic Programming -QP-)
İçinde eşitsizlikleri de barındıran ve karesel olan bir matematiksel sistemi çözmek
için karesel programlama tekniklerini kullanabiliriz. Problemler şu şekilde ver-
ilir:

1 T
x Qx + pT x fonksiyonunu minimize et
2

şu koşullara uymak şartıyla (subject to)

Gx 6 h (eşitsizlik koşulu)

Ax = b (eşitlik koşulu)

Küçük harfli gösterilen değişkenler vektördür, büyük harfler ise bir matrisi temsil
ederler. x içinde diğer bilinmeyenler x1 , x2 , .. olarak vardır, bulmak istediğimiz
değerler buradadır.
Somut örnek olarak şuna bakalım:

2x21 + x22 + x1 x2 + x1 + x2 fonksiyonunu minimize et

koşullar:

x1 > 0, x2 > 0 (eşitsizlik koşulları)

x1 + x2 = 1 (eşitlik koşulu)

Fakat bu formül şu anda matris formunda değil. Matris formuna geçmek için
iki aşama var. Önce x değişkenlerinin birbiri ve kendileri ile çarpım durumlarını
halledelim. Öyle bir Q matrisi bulmalıyız ki, altta boş olan Q matrisinin değerleri
doldurulup, çarpım yapıldığında x değişkenlerinin tüm çarpım ilişkilerini bul-
sun. Çarpım ilişkileri nelerdir? Formülün 2x21 + x22 + x1 x2 kısmıdır.

  
  .. .. x1
x1 x2
.. .. x2

Q matrisinin 1, 2, .. gibi kordinatları x1 , x2 , ..’ye tekabül ediyor olacaklar. (1,1) ko-


rdinatları x1 ’in kendisi ile çarpımını, x21 ’i temsil eder, (1,2) ise x1 x2 ’yi temsil eder,
vs. O zaman (1,1) için 2 sayısını veriririz, çünkü x21 ’nin başında 2 değeri var. (2,2)
için 1 değeri lazım çünkü x22 ’nin başında sayı yok (yani ’1’ değeri var).

8
(1,2) ve (2,1) ilginç çünkü ikisi de aslında x1 x2 ’i temsil ediyorlar çünkü x1 x2 =
x2 x1 . O zaman (1,2) ve (2,1) için 0.5 değeri verirsek, 0.5x1 x2 + 0.5x2 x1 ’i kısaltıp
x1 x2 haline getirebiliriz. Sonuç

 
2 0.5
Q=
0.5 1

Kontrol edelim:

  
  2 0.5 x1
x1 x2
0.5 1 x2
 
  x1
= 2x1 + 0.5x2 0.5x1 + x2
x2

= 2x21 + 0.5x2 x1 + 0.5x1 x2 + x22

= 2x21 + x1 x2 + x22

p vektörü ise, her terimin, tek başına ana formüle nasıl ekleneceğini kontrol ediyor.
 T  
Elimizde x1 +x2 olduğuna göre p = [1, 1] yeterli olacaktır, bakalım: 1 1 x1 x2 =
x1 + x2 .
Şimdi eşitsizlik koşulları. Bizden istenen x1 > 0 ve x2 > 0 şartlarını Gx 6 0
formunda temsil etmemiz. Burada önemli nokta matris formuna geçerken bir
yandan da > işaretini tersine döndürmemiz, yani 6 yapmamız. Bu çok dert değil,
değişkeni −1 ile çarparsak işareti tersine döndürebiliriz çünkü x1 6 0 ile −x1 > 0
aynıdır. O zaman Gx şöyle olacak:

    
−1 0 x1 0
6
0 −1 x2 0
   
−x1 0
6
−x2 0

Eşitlik koşulları
Eşitlik koşulları için problemimizin istediklerini
 Ax = b formuna uydurmamız
lazım. x1 + x2 ’yi nasıl forma sokarız? A = 1 1 , b = 1 ile

 
x1
[1, 1] =1
x2

9
x1 + x2 = 1

CVXOPT
Bu paket ile karesel denklemleri minimizasyon / maksimizasyon bağlamında
çözmek mümkündür. Üstte bulduğumuz değerleri altta görebiliyoruz. Q eşitliğinde
2 ile çarpım var, bunun sebebi karesel denklem formunun başında 12 çarpımı ol-
ması, böylece bu iki çarpım birbirini dengeliyor.

from cvxopt import matrix


from cvxopt import solvers
Q = 2*matrix([ [2, .5], [.5, 1] ])
p = matrix([1.0, 1.0])
G = matrix([[-1.0,0.0],[0.0,-1.0]])
h = matrix([0.0,0.0])
A = matrix([1.0, 1.0], (1,2))
b = matrix(1.0)
sol=solvers.qp(Q, p, G, h, A, b)
print sol['x']

pcost dcost gap pres dres


0: 1.8889e+00 7.7778e-01 1e+00 2e-16 2e+00
1: 1.8769e+00 1.8320e+00 4e-02 0e+00 6e-02
2: 1.8750e+00 1.8739e+00 1e-03 1e-16 5e-04
3: 1.8750e+00 1.8750e+00 1e-05 6e-17 5e-06
4: 1.8750e+00 1.8750e+00 1e-07 2e-16 5e-08
Optimal solution found.
[ 2.50e-01]
[ 7.50e-01]

Bazı notlar: A matrisi yaratılırken (1,2) kullanımı görülüyor, bu matrisin boyut-


larını tanımlamak için. Cvxopt paketi bu arada Numpy formatı değil kendi ma-
tris, vektör objelerini kullanıyor, ama ikisi arasında gidip gelmek mümkün.
Kaynaklar
[2] Blondel, https://gist.github.com/mblondel/586753
[3] Reynolds, Mathematical Applications for the Management, Life, and Social Sciences
[4] Dantzig, Wolfe, The Generalized Simplex Method for Minimizing a Linear Form
under Linear Inequality Restraints, https://www.cs.virginia.edu/˜evans/
greatworks/LP_handout.pdf
[5] Padberg, Linear Optimization and Extensions
[6] Strang, Linear Algebra and It’s Applications, 4th Edition

10
Lineer Programlar, Örnekler
Bir lineer program (LP),

min cT x öyle ki
x

Dx 6 d
Ax = b

formundaki problemlerdir. Atama problemleri, nakliyat (transportation) prob-


lemleri hep LP olarak çözülebilir.
Örnekler
Bir atama problemi gorelim. Ufak [1, sf. 29] örneğinden hareket edelim, elimizde
üç tane işçi A, B, C var, ve üç tane iş 1,2,3 var. Her işçinin her işi ne kadar sürede
yaptığı alttaki tabloda. Satırlar işçi, kolonlar iş,

C = [[17,10,12],[9,8,10], [14,4,7]]
C = np.array(C)
print (C)

[[17 10 12]
[ 9 8 10]
[14 4 7]]

Problemin yapısı alttaki ağ ile gösterilebilir,

Karar değişkenleri xA1 , xA2 , .. şeklinde olacak. o zaman bedel

17xA1 + 10xA2 + 12xA3 + 9xB1 + 8xB2 + 10xB3 + 14xC1 + 4xC2 + 7xC3

Önemli bir nokta her işin sadece bir kişiye verilmesi. Bunu mesela A için

xA1 + xA2 + xA3 = 1

kısıtlaması ile hallederiz, B,C için benzer durum.

1
Her isin tek kisiye verilmesi icin, mesela 1 icin

xA1 + xB1 + xC1 = 1

kısıtlaması, 2,3 için benzer şekilde halledilir. Tüm bu kısıtlamaları matris for-
munda vermek için, alttaki gibi bir matris yaratılabilir,

Notasyon x11 diyor bizim örnek için xA1 diye düşünülebilir. Bu matrisi LP çözümüne
Ax = b kısıtlaması olarak verebiliriz, Ax çarpımını takip edersek bu çarpımın
belli x’ler üzerinde toplama yaptığını görüyoruz, mesela ilk satır sol üst blok
xA1 + xB1 + xC1 toplamını yapıyor ve ona tekabül eden kısma b içinde 1 verirsek,
LP mekanizması bu kısıtlamaya göre gerisini halleder.
Kodda yapalım,

n = 3
X = np.zeros((2*n,n**2))
X[0,0:n] = np.ones((1,n))
X[1,n:n+n] = np.ones((1,n))
X[2,2*n:2*n+n] = np.ones((1,n))
X[3:6,0:3] = np.eye(n,n)
X[3:6,3:6] = np.eye(n,n)
X[3:6,6:9] = np.eye(n,n)
print (X)

[[1. 1. 1. 0. 0. 0. 0. 0. 0.]
[0. 0. 0. 1. 1. 1. 0. 0. 0.]
[0. 0. 0. 0. 0. 0. 1. 1. 1.]
[1. 0. 0. 1. 0. 0. 1. 0. 0.]
[0. 1. 0. 0. 1. 0. 0. 1. 0.]
[0. 0. 1. 0. 0. 1. 0. 0. 1.]]

print (C.flatten())

[17 10 12 9 8 10 14 4 7]

Şimdi LP çağrısı,

b = [1, 1, 1, 1, 1, 1]

from scipy.optimize import linprog

2
res = linprog(C.flatten(), A_eq=X, b_eq=b)
res = np.round(res.x)
print (res)

[0. 0. 1. 1. 0. 0. 0. 1. 0.]

Yani xA3 , xB1 , xC2 ataması yapıldı. Doğrulamasını yapalım,

row_ind, col_ind = linear_sum_assignment(C)


print (col_ind)
print (row_ind)
print (C[row_ind, col_ind].sum())

[2 0 1]
[0 1 2]
25

Aynı sonucu aldık.


Kaynaklar
[1] Hebborn, Decision Mathematics, https://www.pearsonschoolsandfecolleges.
co.uk/Secondary/Mathematics/16plus/HeinemannModularMathematicsForEdexcel
Samples/Samplematerial/Chapter2.pdf
[2] Burkard, Assignment Problems

3
En Dik İniş (Steepest Descent)
Daha önce gradyan inişi konusunda işlediğimiz üzere bir f fonksiyonu için hesa-
planan −∇f(x) gradyanı x noktasında fonksiyon için en yüksek iniş (descent)
olacak yönü gösteriyordu [1, sf. 151]. Fakat dikkat, yön kelimesini kullandık,
o yönde ne kadar adım atılacağını belirtmedik. Gradyanın temel hesabı türeve
dayalı olduğu için ve türev hesapladığı noktaya yakın bir yerde doğru bir yaklaşıklama
olacağı için o yönde atılan adımın büyüklüğüne göre minimizasyon iyi ya da
kötü sonuçlar verebilir. Bu sebeple gradyan inişi algoritmaları, ki

xx+1 = xk + αk ∇f(xk )

ile kodlanırlar, çoğunlukla ufak ve pek çok adım atarlar, yani αk sabitleri ufak
seçilir. En Dik İniş (SD) algoritmasi bu noktada bir ilerleme. Her α, yani αk öyle
seçilir ki φ(α) ≡ f(xk − α∇f(xk )) kesinlikle minimize edilsin / belli bir yöndeki
en minimum noktaya vardıracak büyüklükte adım atılsın. Ya da

αk = arg min f(xk − α∇f(xk ))


α>0

Yani gradyanın işaret ettiği yönde bir tür “arama” yapmış oluyoruz, adım büyüklüğünü
öyle seçiyoruz ki fonksiyon o yönde o kadar adım atıldığında en fazla inişi gerçekleştirmiş
olsun. Bu sebeple bu metota çizgi araması (line search) metotu deniyor.
Tabii arama derken akla ikinci bir döngü içinde yine ufak ufak adımlar atarak
çizgi üzerinde gelinen yere bakıp büyüklük hesabını böyle yapmak gelebilir, bu
sonuçsal olarak, kabaca doğru, ama asıl adım hesabı bazı cebirsel temellerle, ya
da onu çözen yaklaşıksal şekilde yapılıyor.
En basiti atılan adım α’yi pür cebirsel olarak çözmek, altta bir örnek [3, sf. 101].
Soru
f(x) = 9x21 + 4x1 x2 + 7x22 fonksiyonunun optimal noktasını bul.
Çözüm
Gradyanın öğeleri
∂f ∂f
∂x1
= 18x1 + 4x2 ve ∂x 2
= 4x1 + 14x2 . Şimdi SD yöntemini uygulayalım, başlangıç
noktası x = [ 1 1 ] olsun. Bu durumda f(x0 ) = 20, ve ∇f(x0 ) = [ 22 18 ]T .
0 T

Adım denklemine göre,

x1 = x0 − α0 ∇f(x0 )

ya da

1
     
x1 1 22
= α0
x2 1 18

Şimdi öyle bir α0 seçmeliyiz ki f(x1 ) minimum olsun. Üstteki değerlerin bize
verdiği x1 ve x2 değerleri (ki α0 bazlı olacaklar) ana formüle yeni x olarak sokarsak,
αo bazlı bir denklem edeceğiz,

f(α0 ) = 20 − 808α0 + 8208(α0 )2

df(α0 )
dα0
= 0 üzerinden α0 ’nun optimum değeri 0.05’tır. Yani adımı şu şekilde at-
malıyız,

     
1 x1 1 22
x = = 0.05
x2 1 18

ki bu hesap bize f(x1 ) = 0.12 verir. Bu şekilde özyineli döngüye devam edersek
nihai optimum noktayı buluruz.
Sekant Yöntemi
Basit cebirsel numaralar ile üstte adımı bulduk. Daha çetrefil durumlar için sekant
yöntemini kullanabiliriz. Bu yöntemi [2]’de işledik, ayrıca bkz [1, sf. 120]. Sonuçta
aradığımız d yönündeki minimum

φk (α) = f(xk + αdk )

değerini bulmaktır. Üstteki formülün α üzerinden türevi

T
φk0 (α) = dk ∇f(xk + αdk )

O zaman minimum α icin

T
0 = dk ∇f(xk + αdk )

denklemini çözen α gerekli. Bu bir kök bulma problemi ve sekant yöntemini


kullanabiliriz.

def linesearch_secant(grad, d, x):


epsilon=10**(-8)
max = 500
alpha_curr=0
alpha=10**-8
dphi_zero=np.dot(np.array(grad(x)).T,d)

dphi_curr=dphi_zero

2
i=0;
while np.abs(dphi_curr)>epsilon*np.abs(dphi_zero):
alpha_old=alpha_curr
alpha_curr=alpha
dphi_old=dphi_curr
dphi_curr=np.dot(np.array(grad(x+alpha_curr*d)).T,d)
alpha=(dphi_curr*alpha_old-dphi_old*alpha_curr)/(dphi_curr-dphi_old);
i += 1
if (i >= max) and (np.abs(dphi_curr)>epsilon*np.abs(dphi_zero)):
print('Line search terminating with number of iterations:')
print(i)
print(alpha)
break

return alpha

Örnek
f(x1 , x2 , x3 ) = (x1 − 4)4 + (x2 − 3)2 + 4(x3 + 5)4 fonksiyonunun minimize edicisini
bul.
 T
Başlangıç noktamız 4 2 −1 olacak.
Üstteki fonksiyonun gradyanı

 T
∇f(x) = 4(x1 − 4)3 2(x2 − 3) 16(x3 + 5)3

Kod olarak,

def g(x): return np.array([4*(x[0]-4)**3, 2*(x[1]-3), 16*(x[2]+5)**3])

x1 hesaplamak için

α0 = arg min f(x0 − α∇f(x0 ))


α>0

lazım, tam açılmış haliyle,

= arg min(0 + (2 + 2α − 3)2 + 4(−1 − 1024α + 5)4


α>0

Ama üstteki cebirle boğuşmaya gerek yok, gradyan fonksiyonu ve gidiş yönü
üzerinden kök bulup bize döndürecek üstteki çizgi araması kodunu kullanabili-
riz,

x0 = np.array([4,2,-1])
print (g(x0))
d0 = -g(x0)
alpha0 = linesearch_secant(g, d0, x0)
alpha0 = np.round(alpha0, 5)

3
print ('alpha0 =',alpha0)
x1 = x0 - alpha0*g(x0)
print ('x1',x1)

[ 0 -2 1024]
alpha0 = 0.00397
x1 [ 4. 2.00794 -5.06528]

Arka arkaya iki adım daha atarsak,

print ('g1',g(x1))
d1 = -g(x1)
alpha1 = linesearch_secant(g, d1, x1)
print (alpha1)
x2 = x1 - alpha1*g(x1)
print ('x2',x2)
print ('\n')
print ('g2',g(x2))
d2 = -g(x2)
alpha3 = linesearch_secant(g, d2, x2)
print (alpha3)
x3 = x2 - alpha3*g(x2)
print ('x3',x3)

g1 [ 0. -1.98412 -0.00445103]
0.5000022675782785
x2 [ 4. 3.0000045 -5.06305448]

g2 [ 0.00000000e+00 8.99829483e-06 -4.01113920e-03]


14.894217818923421
x3 [ 4. 2.99987048 -5.00331169]

Optimal noktaya erişmiş olduk.


Duruş Şartları
Optimizasyonda minimum varlığı için birinci-derecen gerekli şart (first-order nec-
essary condition -FONC-) minimumda ∇f(x) = 0 olması. Eğer böyle bir noktaya
erişmişsek, diyelim xk için ∇f(xk ) = 0 olmuş, bu nokta FONC’yi tatmin eder
çünkü o zaman xk+1 = xk olur, ve minimumdayız demektir. Bu teorik bilgiyi
algoritmamızın ne zaman duracağını anlaması için bir şart olarak kullanamaz
mıyız?
Ne yazık ki sayısal hesaplarda, yani pratikte ∇f(xk ) = 0 hesabı nadiren ortaya
çıkar. Bir çözüm gradyanın normu ||∇f(x)|| sıfır olmasına bakmak.
Ya da |f(xk+1 )−f(xk )| mutlak değerine bakmak, yani hedef fonksiyonun iki nokta
arasındaki farkının mutlak değerine, bu değer eğer daha önceden belirlenmiş bir
eşik değeri ’un altına düşmüşse durmak. Aynı şeyi xn+1 ve xn değerlerinin ken-
disi için de yapabiliriz.
Fakat bu yöntemler ölçek açısından problemli olabilir. Mesela 1 ve 1000 arasında
gidip gelen f(x)’lerle 0 ve 1 arasında gidip gelen f(x)’lerin kullanacağı  farklı

4
olabilir. Bir tanesi için  = 100 iyidir, diğeri için belki  = 0.001. Bu sebeple izafi
bir hesap daha faydalı olur, mesela

|f(xk+1 − f(xk ))|


<
|f(xk )|

ya da

||xk+1 − xk ||
<
||xk ||

Üstteki yaklaşım “ölçekten bağımsız” olduğu için daha tercih edilir yaklaşım, bir
problemden diğerine geçtiğimizde farklı bir  kullanmamız gerekmez.
Uygulama
Gradyan İnişi ve Model Uydurmak
Pek çok farklı probleme çözüm sağlayan bir teknik gradyan inişidir. Ne yazık ki
bilgisayar bilim lisans seviyesinde bu teknik genellikle öğretilmiyor. Bu yazıda
Gİ’nin hepimizin bildiği bir problemi, lineer regresyonu çözmek için nasıl kul-
lanılacağını anlatacağım [1].
Teorik seviyede Gİ bir fonksiyonu minimize etmeye yarar. Elde bazı parametreler
üzerinden tanımlı bir fonksiyon vardır, ve Gİ bir başlangıç değerinden başlayarak
azar azar o parametreleri değiştirerek fonksiyonun minimal olduğu yeri bulmaya
uğraşır. Bu azar azar, adım atılarak yapılan minimizasyon Calculus sayesindedir,
fonksiyonun gradyanının negatif yönünde adım atılarak mümkün olur. Bazen bu
matematiksel açıklamanın pratik kullanımı nasıl olur görmek zor oluyor; Örnek
olarak bir veriye lineer bir çizgi / model uyduralım.
Basit bir tanım yaparsak lineer regresyonun amacı eldeki bir veri kümesine düz
çizgi uydurmaktır. Veri alttaki gibi olabilir,

points = np.genfromtxt("data.csv", delimiter=",")


plt.scatter(points[:,0],points[:,1])
plt.savefig('vision_90fitting_04.png')

5
Üstteki veriyi düz çizgi olarak modellemek istiyoruz, bunun için lise matematiğinden
bilinen y = mx+b formülünü kullanacağız, m eğim (slope), b ise kesi (intercept),
yani y-ekseninin kesildiği yer. Veriye uyan en iyi çizgiyi bulmak demek en iyi
m, b değerlerini bulmak demek.
Bunu yapmanının standart yolu bir hata fonksiyonu tanımlamak (bazen bedel
fonksiyonu da deniyor). Hata fonksiyonu bir çizginin ne kadar “iyi” olduğunu
ölçebilen bir fonksiyondur, bir m, b çiftini alacak, veriye bakacak, ve bize uyu-
mun ne kadar iyi olduğunu bir hata değeri üzerinden raporlayacak. Hata değeri
hesabı için elimizdeki verideki tüm x, y değerlerine bakacağız, ve bunu yaparken
her veri y değeri ile, yine veri x’i üzerinden hesapladığımız mx+b değeri arasındaki
farka bakacağız; daha doğrusu farkın karesini alacağız, ve her veri noktası için
hesaplanan tüm bu kare hesaplarını toplayacağız. Kare alınıyor, çünkü bu hatayı
pozitif hale çevirmemizi sağlıyor, bir diğer fayda tabii kare fonksiyonun türevi
alınabilir olması (kıyasla mutlak değer fonksiyonu işleri daha karıştırırdı). Poz-
itif bir hata yeterli, çünkü hata yapılmışsa alttan mı üstten mi olduğu bizi il-
gilendirmiyor. Hata E hesabı şöyle,
Matematiksel olarak

1 X
N
E(m,b) = (yi − (mxi + b))2
N i=1

# y = mx + b
# m is slope, b is y-intercept
def compute_error_for_line_given_points(b, m, points):
totalError = 0
for i in range(0, len(points)):
x = points[i, 0]
y = points[i, 1]
totalError += (y - (m * x + b)) ** 2
return totalError / float(len(points))

Veriye daha iyi uyan çizgiler (ki “daha iyi”nin ne olduğu hata fonksiyonumuz
üzerinden tanımlı) daha az hata değerleri anlamına gelecektir. O zaman, eğer

6
hata fonksiyonunu minimize edersek, veriye uyan iyi çizgiyi bulacağız demektir.
Hata fonksiyonumuz iki parametreli olduğu için onu iki boyutlu bir yüzey olarak
grafikleyebiliriz,

Bu iki boyutlu yüzey üzerindeki her nokta değişik bir çizgiyi temsil ediyor. Yüzeyin
alt düzlemden olan yüksekliği o çizgiye tekabül eden hata. Gördüğümüz gibi
bazı çizgiler bazılarından daha az hataya sahip (yani veriye daha iyi uymuş).
Gradyan inişi ile arama yaptığımız zaman bu yüzeyin herhangi bir noktasından
başlayacağız, ve yokuş aşağı inerek hatası en az olan çizgiyi bulacağız.
Hata fonksiyonu üzerinde Gİ işletmek için önce fonksiyonun gradyanını hesapla-
mamız lazım. Gradyan bizim için nerede olursak olalım her zaman dip noktasını
gösteren bir pusula görevini görüyor. Gradyan hesabı için hata fonksiyonunun
türevi alınmalı. Hata fonksiyonunun m, b adında iki tane parametresi olduğuna
göre bu iki parametrenin her biri için ayrı ayrı kısmi türev almamız lazım. Bu
türevler,

2 X
N
∂E
= −xi (yi − (mxi + b))
∂m N i=1

2 X
N
∂E
= −(yi − (mxi + b))
∂b N i=1

Artık Gİ işletmek için gerekli tüm araçlara sahibiz. Aramayı herhangi bir m, b
noktasından (herhangi bir çizgi) başlatırız, ve Gİ yokuş aşağı en iyi çizgi parame-
trelerine doğru gider. Her döngü m, b değerlerini bu inişe göre günceller (dikkat
inen parametreler değil, hatada inilirken bu inişe tekabül eden m, b değerleri), ki
bu sayede döngünün bir sonraki adımındaki hata bir öncekine göre azalmış olur.
Matematiğe biraz daha yakından bakalım [2]. Türev almak, türeve göre adım
atmak bir fonksiyonunun minimum noktasını bulmamızı nasıl sağlıyor? Basit
bir fonksiyon f(x)’i düşünelim,

7
Gradyan, ya da belli bir x noktasındaki değişim oranı y/ x ile yaklaşıksallanabilir
(çoğunlukla literatur ∆ sembolünü kullanır, [2] kullanmış, önemli değil). Ya da
bu yaklaşıksallığı şöyle yazabiliriz,

∂f y f(x + x) − f(x)
= lim = lim
∂x →0 x →0 x

ki bu ifade f(x)’in x’e göre kısmi türevi olarak bilinir. Üstteki yöntem ile sembolik
olarak pek çok ifadenin türevini almayı biliyoruz, mesela ax2 için 2ax, vs.
Şimdi elimizde bir f(x) olduğunu düşünelim, ve x’i öyle bir şekilde değiştirmek
istiyoruz ki f(x) minimize olsun. Ne yapacağımız f(x)’in gradyanının ne olduğuna
bağlı. Üç tane mümkün durum var:
∂f
Eğer ∂x
> 0 ise x artarken f(x) artar, o zaman x’i azaltmalıyız.
∂f
Eğer ∂x
< 0 ise x artarken f(x) azalır, o zaman x’i arttırmalıyız.
∂f
Eğer ∂x = 0 ise f(x) ya minimum ya da maksimum noktasındadır, o zaman x’i
olduğu gibi bırakmalıyız.
Özet olarak x’i alttaki miktar kadar azaltırsak f(x)’i de azaltabiliriz,

∂f
x = xyeni − xeski = −η
∂x
ki η ufak bir pozitif sabittir, x’i değiştirirken bu atılan adımın büyüklüğünü dışarıdan
∂f
ayarlayabilmemizi sağlar, değişimin hangi yönde olacağını ∂x belirtiyor zaten.
Bu formülü ardı ardına kullanırsak, f(x) yavaş yavaş minimum noktasına doğru
“inecektir”, bu yönteme gradyan inişi minimizasyonu adı verilmesinin sebebi de
budur.
Örneğimize dönelim,

def step_gradient(b_current, m_current, points, eta):


b_gradient = 0
m_gradient = 0
N = float(len(points))
for i in range(0, len(points)):
x = points[i, 0]
y = points[i, 1]

8
b_gradient += -(2/N) * (y - ((m_current * x) + b_current))
m_gradient += -(2/N) * x * (y - ((m_current * x) + b_current))
new_b = b_current - (eta * b_gradient)
new_m = m_current - (eta * m_gradient)
return [new_b, new_m]

eta = 0.0001
initial_b = 0 # initial y-intercept guess
initial_m = 0 # initial slope guess
num_iterations = 8
print "Starting gradient descent at b = {0}, m = {1}, error = {2}".format(initial_b, i
print "Running..."
b = initial_b
m = initial_m
xx = np.linspace(np.min(points[:,0]),np.max(points[:,0]), 100)
for i in range(num_iterations):
b, m = step_gradient(b, m, np.array(points), eta)
if i % 2 == 0:
print i, b,m
yy = m * xx + b
plt.scatter(points[:,0],points[:,1])
plt.hold(True)
plt.scatter(xx,yy)
plt.hold(False)
plt.savefig('grad_desc_%d' % i)
print "After {0} iterations b = {1}, m = {2}, error = {3}".format(num_iterations, b, m

Starting gradient descent at b = 0, m = 0, error = 5565.10783448


Running...
0 0.0145470101107 0.737070297359
2 0.0255792243213 1.29225466491
4 0.0284450719817 1.43194723238
6 0.029256114126 1.46709461772
After 8 iterations b = 0.0294319691638, m = 1.47298329822, error = 112.737981876

9
Optimal m, b değerleri bulundu. m = −1, b = 0’da başladık ve optimal sonucu
bulduk. Değişken eta (yani η) adım büyüklüğü demiştik, dikkat eğer adım çok
büyük seçilirse minimum “atlanabilir”, yani varış noktası kaçırılabilir. Eğer η
çok küçük ise minimuma erişmek için çok vakit geçebilir. Ayrıca Gİ’nin doğru
işlediğini anlamanın iyi yollarından birisi her döngüde hatanın azalıp azalmadığına
bakmaktır.
Bu basit bir örnekti, fakat bir bedel fonksiyonunu minimize edecek parametre
değişimlerini yapma kavramı yüksek dereceli polinomlarda, ya da diğer Yapay
Öğrenim problemlerinde de işe yarıyor.
Gİ ile akılda tutulması gereken bazı konular:
1) Dışbükeylik (Convexity): Üstteki problemde sadece bir tane minimum vardı,
hata yüzeyi dışbükeydi. Nereden başlarsak başlayalım, adım atarak minimuma
erişecektik. Çoğunlukla durum böyle olmaz. Bazı problemlerde yerel minimumda
takılı kalmak mümkün olabiliyor, bu problemleri aşmak için farklı çözümler var,
mesela Rasgele Gradyan İnişi (Stochastic Gradient Descent) kullanmak gibi.
2) Performans: Örnekte basit bir Gİ yaklaşımı kullandık, çizgi arama (line search)
gibi yaklaşımlarla döngü sayısının azaltmak mümkün olabiliyor.
3) Yakınsama (Convergence): Aramanın bittiğinin kararlaştırılmasını kodlamadık,
bu çoğunlukla hata döngüsündeki değişimlere bakılarak yapılır; eğer hatadaki
değişim belli bir eşik değerinden daha küçük ise, gradyanın sıfır olduğu yere
yaklaşılmış demektir, ve arama durdurulabilir.
Not: Lineer regresyon tabii ki direk, tek bir adımda çözülebilen bir problem. Gİ’yi
burada bir örnek amaçlı kullandık.
Kaynaklar
[1] Zak, An Introduction to Optimization, 4th Edition
[2] Bayramli, Diferansiyel Denklemler, Kök Bulmak, Karesel Formül (Root Finding,
Quadratic Formula)

10
[3] Dutta, Optimization in Chemical Engineering

11
Newton’un Metodu (Newton’s Method)
Kısıtlanmamış bir pürüzsüz optimizasyon problemini düşünelim [6, 6:00],

min f(x)

Baktığımız f’in iki kez türevi alınabilir olduğunu düşünelim. Hatırlarsak gradyan
inişi nasıl işliyordu? Alttaki gibi,

xk = xk−1 − tk · ∇f(xk−1 ), k = 1, 2, ...

Bir başlangıç x(0) ∈ Rn seçiliyor ve üstteki ardı ardına işletiliyor, her adımda
negatif gradyan yönünde tk boyunda adım atılıyor.
Kıyasla Newton metotu alttakini işletir,

−1
xk = xk−1 − ∇2 f(x(k−1) ) ∇f(xk−1 ), k = 1, 2, ...

ki ∇2 f(x(k−1) ) f’in x(k−1) noktasındaki Hessian’ı. Yani tk boyunda eksi gradyan


yönünde gitmek yerine gradyanin “negatif Hessian’ı yönünde” gideceğiz. Dikkat
edersek bu yöntemde adım büyüklüğü kavramı yok, seçilen yönde tam bir adım
atılıyor.
Newton metotunu nasıl yorumlamak gerekir? Gradyan inişini hatırlarsak, bir
fonksiyon f’i alalım, ve onu x noktasında karesel olarak yaklaşıklamasını alıyorduk,

]
1
Hessian nerede? Aslında var, ama birim matris 2t I olarak alındı. Alttaki res-
imde Newton metotu için yaratılan yaklaşıklamayı görüyoruz, bu büyük ihti-
malle daha iyi bir yaklaşıklama olacak çünkü karesel açılımda daha fazla bilgi
kullanıyor, bu sefer formülde ∇2 f(x) ile Hessian da var.

1
Bu yeni yaklaşıklama üzerinden x − (∇2 f(x))−1 ∇f(x) ile adım atınca belki yeşil
okla gösterilen yere geleceğiz, bu daha iyi bir nokta olabilecek. Atılan adım
formülünün resimdeki karesel formun minimize edicisi olduğunu görmek zor
değil.
Gradyan inişi ve Newton metotu adımları arasındaki farkı görmek için örnek bir
fonksiyona bakalım, f(x) = (10x21 + x22 )/2 + 5 log(1 + e−x1 −x2 ). Fonksiyonu kontur
grafiğini basınca alttaki gibi çıkıyor,

Siyah çizgi gradyan inişi, mavi Newton. Aynı yerden başlattım, ve gördüğümüz
gibi minimal noktaya doğru çok farklı yollar takip ediyorlar. Karşılaştırması ko-
lay olsun diye her iki tarafta atılan adım büyüklüklerini aynı tutmaya uğraştım.
Graydan inişinin attığı adımların yönünün niye böyle olduğu gayet bariz, tüm
adımlar görüldüğü gibi o noktadaki kontura dikgen, ki bu gradyanın tanımıdır
zaten, bir noktadaki gradyan oradaki konturun teğetine diktir / normaldir.

2
Newton tamamen farklı bir şekilde gidiyor. Resimde tüm adımlar tek bir çizgide
gibi duruyor ama aslında değil, başka bir yerden başlatsaydım bazen zigzaglı bile
gidilebileceğini görürdük [6, 13:40]. Newton’un adımlarını yorumlamanın görsel
olarak zihinde hayal etmenin iyi bir yolu onun her adımda bir küre, bir balon
yarattığını düşünmek, ve o balonun gradyanina göre adım atmak.
Dersin geri kalanında Newton metotunda geriye çizgisel iz sürme (backtracking)
yöntemini göreceğiz, ki “Newton metotu” denince aslında bu çeşitten bahsedilir,
üstteki bahsettiğimize “pür Newton” adı veriliyor. Sonra bazı yakınsama özelliklerine
bakacağız, ardından Newton metotunun bir çeşidi, eşitlik kısıtlamalı Newton
metotunu göreceğiz. Eğer zaman kalırsa Newton-umsu (quasi-Newton) metot-
lara da bakmak istiyorum.
Newton metotuna bakmanın bir diğer yolu nedir? Onun her adımda bir karesel
açılımı minimize ettiğini biliyoruz. Bir diğeri [6, 17:04] birinci derece optimalite
şartını lineerize etmek. Biz x’teyiz diyelim, öyle bir yön v arıyoruz ki o yönde bir
adım atınca gradyan sıfır hale gelsin, ∇f(x + v) = 0. Bu genel bir ifade değil mi,
ayrıca v bağlamında lineer, x sabit. Şimdi bu gradyanin lineer yaklaşıklamasını
yaparsak doğal olarak Hessian’lı ifadeye eriseceğiz,

0 = ∇f(x + v) ≈ ∇f(x) + ∇2 f(x)v

Ve üstteki formülü v için çözersek, bu bizi tekrar daha önce gösterdiğimiz New-
−1
ton adımına götürüyor, v = − ∇2 f(x) ∇f(x)
Bu metotun tarihi bir arka planı da var, İsaac Newton bizim bugün Newton
metotu dediğimiz yöntemi minimizasyon için değil, kök bulmak için keşfetti.
Düşündü ki gayrı-lineer bir denklemin çözümlerini bulmak istiyorsan böyle bir
metot gerekli. Tek boyutta düşünelim, mesela bir g var, onun köklerini bulmak is-
tiyoruz, o zaman Newton metotu kullan. Hatta genel fonksiyonlar için bile değil,
polinomlar için bu yöntemi bulmuştu. Rhapson, bir diğer bilimci, aynı şekilde,
aynı metotu düşündü. O sebeple bu metota bazen Newton-Rhapson adı ver-
ildiğini de görebilirsiniz. Çok sonraları bilimciler bu metotu minimizasyon için
kullanmayı akıl etti, gradyanı sıfıra eşitliyerek. Bu kullanım çoğunlukla Simp-
son’a atfedilir.
Devam edelim, Newton adımının önemli bir özelliği onun ılgın değişmezliği
(affine invariance). Bu ne demek? Bir lineer transformasyona bakalım. Diyelim
ki f, x üzerinden Newton adımı hesaplıyorken ben gelip diyorum ki “x üzerinde
değil yeni bir değişken y üzerinden bunu yapmanı istiyorum” ve formül x = Ay,
ve g(y) = f(Ay). O zaman g üzerinde Newton adımları neye benzer?

y+ = y − (∇2 g(y))−1 ∇g(y)

= y − (AT ∇2 f(Ay)A)−1 AT ∇f(Ay)

3
= y − A−1 (∇2 f(Ay))−1 f(Ay)

Eğer üsttekini A ile çarparsam, ki solda Ay+ elde edebileyim,

Ay+ = Ay − (∇2 f(Ay))−1 f(Ay)

ki

Ay+ = Ay −(∇2 f( Ay ))−1 f( Ay )


|{z} |{z} |{z} |{z}
x+ x x x

x’e göre atmış olacağımız adıma eriştik yani [6, 22:30].


Bu demektir ki lineer ölçeklemeden bağımsız davranabiliyoruz. Mesela size bir
problem verdim, Hessian’ı hesapsal bağlamda uygunsuz (poorly conditioned)
ama bir lineer transformasyon uygularsam iyi hale gelecek, o zaman prensipsel
olarak ilk ya da transform edilmiş problem üzerinde Newton işletmeniz bir fark
yaratmaz. Dikkat, bu durum gradyan inişi için geçerli değildir.
Newton azalışı (decrement)
Yeni bir kavram bu, Newton azalışı. Bu kavram bize Newton adımını yorum-
lamada bir açı daha kazandırıyor, ayrıca birazdan geriye çizgisel iz sürmeden
bahsederken, ve duruş kriterini hesaplamada da yardımcı oluyor.
[atlandı]
Geriye çizgisel iz sürmek
Eğer pür Newton adımı atarsak başladığımız noktaya göre uzaksama (diverge)
mümkündür, yani optimal noktadan uzaklaşabiliriz. Newton metotunun çok
hızlı bir yakınsama oranı vardır, ama belirttiğimiz bu durumlarda aynı şekilde
çok hızlı bir şekilde de uzaksayabilir. Yani başladığımız noktaya göre Newton
metotu ya çok iyi, ya da çok kötüdür. O sebeple araştırmacılar pratik uygula-
malarda muhakkak geriye çizgisel iz sürme yönteminin Newton’la beraber kul-
lanırlar. Pür Newton metotunu olduğu gibi kullanan neredeyse kimse tanımıyorum.
Gradyan inişi de benzer şekilde kullanılır, hatta bu iki yöntemi aslında aynı altyapı
odaklı görebiliriz.
İz sürme yöntemi adım büyüklüğü t’yi hesaplamak için kullanılır, pür metot
t = 1 kullanıyor tabii ki. Arama algoritması iki parametreyi baz alır, α, β. Bu
parametreler için iyi işleyen bazı değerler mesela 0 < α < 1/2 ve 0 < β < 1. Her
adımda t = 1 ile başlarız, ve

f(x + tv) > f(x) + αt∇f(x)T v

koşuluna bakarız. Soldaki Newton adımı, sağdaki o yönde ama daha ufak, αt
kadar ufak bir lineer yaklaşıklama, ara değerleme (interpolation). Yani t’nin bir

4
kısmı kadar, α kısmı kadar yönde bir ilerleme kaydedip etmeyeceğimize bakıyoruz,
eğer üstteki şart doğruysa o t’yi adım olarak seçiyoruz. Yoksa t = βt ile t’yi
küçültüp alt döngüde aynı işlemi bir daha tekrarlıyoruz.
Newton yönteminin çok hızlı yakınsadığını söylemiştik, arama adımını hesaba
katınca bile bu doğru. Peki hiç dezavantajı yok mu? Bir tane var, eğer Hessian
yoğun (dense) matris ise o zaman temel lineer cebir’e göre tersini hesaplamak ne
kadar yük getirir? O(n3 ) değil mi? Bu ağır bir yük olabilir.
[yakınsama analizi atlandı]
Şimdi Newton’un yöntemini birinci derece yöntemlerle (gradyan inişi gibi) karşılaştıralım.

• Bellek: her adımda Newton yöntemi O(n2 ) yer tutar, çünkü Hessian n ×
n boyutunda, kıyasla her gradyan adımı O(n) yer tutar, çünkü n boyutlu
gradyan var.

• Hesap: her adıma O(n3 ) hızında, eğer yoğun n × n boyutunda bir lineer
sistemi çözmek gerekiyorsa. Ama her gradyan iniş adımı O(n) hızında
işler, çünkü n boyutlu bir vektörü topluyoruz, ölçekliyoruz, basit işlemler
yapıyoruz yani.

• Geriye iz sürme: her iki yöntem için de O(n) hızında işler.

• Uyumlama, transformasyon: Newton yöntemi problemin mevcut haline


çok bağımlı değil, eğer transforme edersek eşit bir başka problem elde ediy-
oruz, ve Newton onu da çözüyor. Gradyan inişi problem çeşidine göre hızlı
bir şekilde dejenere olabilir, sonuca varamayabilir.

• Kırılganlık: Newton yönteminin hatalar, sayısal hesap problemlerine biraz


daha hassas olduğu söylenebilir, gradyan inişi daha sağlamdır.

O zaman Newton yöntemini hangi durumlarda kullanmak iyidir? Eğer Hessian


seyrek ve bir iç yapıya sahip ise o zaman o lineer sistemi çözmek hızlı olur, bu
durumda Newton yöntemi kullanmak uygundur. Yapıya sahip ile ne demek is-
tiyorum? Mesela bantlı bir matris var ise. Bantlı matris köşegende bir veya daha
fazla çapraz satır olduğu durumlardır, bir şerit, bir “bant” vardır, alttaki gibi,

5
Bu durumda bellek ve hesapsal yük her adım için O(n) olacaktır.
Yapıya sahip Hessian’lar alttaki gibi durumlarda ortaya çıkabilir,

• Eğer g(β) = f(Xβ) ise o zaman ∇2 g(β) = XT ∇2 f(Xβ)X olur. Yani eğer X
bir yapıya sahip tahmin edici matris ise ve ∇2 f köşegen ise o zaman ∇2 g
yapıya sahiptir.

• Amacımız f(β) + g(Dβ)’yi minimize etmek, ∇2 köşegen, g pürüzsüz değil,


ve D yapıya sahip bir ceza matrisi, o zaman Lagrange ikiz fonksiyonu −f∗ (−DT u)−

g
P(−u). Çoğunlukla bu durumlarda ∇2 f∗ köşegen olur (mesela f(β) =
p
i=1 fi (βi ) ise bu durumda ikizdeki Hessian yapıya sahiptir.

Eşitlik kısıtlamalı Newton yöntemi


Şu formdaki bir problem düşünelim,

min f(x) öyle ki Ax = b


x

Bu tür problemleri çözmek için elimizde aşağı yukarı üç yöntem var.
1) Eşitlik sınırlamalarını yoket. Problemi A’nin sıfır uzayı bağlamında tekrar
parametrize et, yani x = My + xo yap, M, A’nin sıfır uzayını kapsar, ve Ax0 =
b’dir. Çözümü y bağlamında yap.
Bu fena bir çözüm değil, ama A’nin sıfır uzayını kapsayan bir M bulmamızı
gerektiriyor. Ayrıca problemde yapı varsa bunu bozmuş olabiliriz, seyrek Hes-
sian elimizde olabilir ama değişim sonrası Hessian yoğun olabilir.
2) İkizi türet. Daha önce gördük ki bu tür problemlerde ikizi hesaplarken eşitlik
sınırı kritere dahil ediliyordu. Ama bu da her zaman kolay değildir.
3) Eşitlik kısıtlamalı Newton yöntemi. Çoğu durumda en direk yaklaşım budur.
Bu yöntemde x(0) ile başlarız, ki Ax(0) = b olacak şekilde, ve

x+ = x + tv

adımı atarız, ama normal Hessian’lı karesel açılımı minimize etmek yerine yeni
bir sınırlama ekleyeceğiz, her Newton adımının saygı göstermesi gereken Az = 0
şartı koyacağız,

1
v = arg min ∇f(x)T (z − x) + (z − x)T ∇2 f(x)(z − x)
Az=0 2

Böylece her adımda kısıtlanmış bölge içinde kalmış olacağız. Üstteki eşitlik şartını
KKT dersimizde görmüştük, bu hesap tek bir lineer sistemi çözmeye indirgenebiliy-
ordu. Lineer sistemi tekrar altta veriyorum,

6
∇2 f(x) AT
    
v −∇f(x)
=
A 0 w 0

Bu lineer sistemi v için çözersek bu bize eşitlikle sınırlanmış Newton adımını


verecektir. Eşitliğin solundaki matris çoğunlukla seyrek ve yapıya sahiptir, çünkü
∇2 f(x) Hessian’ı içindeki seyreklik ve yapı aynen orada da mevcuttur, ve A’lar
blok halinde belli yerdeler, vs. Ayrıca Boyd [7, 1:04:00]’da benzer bir anlatım var.
Alternatif Anlatım
Newton birazdan bahsedeceğimiz yöntemi tek boyutlu problemler için kullandı
[2]. Rhapson adlı bilimci yöntemi çok boyutlu problemler için genişletti. Biz bu
yönteme optimizasyon çerçevesinde bakacağız. Konunun tarihinden biraz bah-
setmek istiyorum, bu dersi öğretmeye başladığımda 1986 senesiydi, Newton’un
metodunu nasıl gördüğümüz o zamandan beri değişime uğradı, o zamanlar son
başvurulan metot diye öğretiliyordu, çünkü kullanmak için “büyük” bir denklem
sistemi çözmek gerekiyordu, 500 x 500 bir sistem mesela. Bugüne gelelim New-
ton metotu artık ilk başvurulan metot haline geldi, 50,000 x 50,000 boyutlarında
bir sistem çözmek “yetiyor” ve böyle bir sistem artık idare edilebilen bir boyut
haline geldi. Yani hesapsal kapasite Newton metodunun optimizasyon alanında
oynadığı rolü tamamen değiştirdi.
Diğer bir faktör ileride öğreneceğimiz iç nokta (interior-point) metotlarının New-
ton’un metodunu kullanıyor olmaları. İç nokta metotları içbükey optimizasyonda
çok popüler, onlar için Newton metotu gerekiyor, bu da onun popülaritesini
arttırıyor.
NM nedir? Elimde bir kısıtlanmamış (unconstrained) problemim var diyelim,

min f(x), öyle ki x ∈ X = Rn

Bir Taylor açılımı yapabiliriz,

1
f(x) ≈ f(x̄) + ∇f(x̄)T (x − x̄) + (x − x̄)T F(x − x̄)
2

ki F Hessian matrisi. Üstteki formüle h(x) diyelim. Böylece bir karesel model
ortaya çıkartmış oldum, formülün sağ tarafındaki çarpım onu karesel yapıyor,
ve şimdi onu kesin olarak çözmek istiyorum. Bunu nasıl yaparım? Formülün
gradyanını sıfıra eşitleyebilirim. Üstteki fonksiyonun x’teki gradyanı nedir?
Gradyanı x’e göre aldığımızı unutmayalım, h(x)’in ikinci terimi ∇f(x̄)T bir sabit
sayı, ikinci gradyan alınırken sıfırlanır, ve tüm ikinci terim sıfırlanır. Üçüncü
T
terimin gradyanını almak bir nevi ∂(x∂xAx) almak gibi [1], F belli bir noktadaki
ikinci türev matrisi olduğu için A gibi bir sabit matris kabul edilebilir, A simetrik
olunca gradyan 2Ax sonucunu veriyordu, F simetrik, o zaman üçüncü terimde F
kalır, 2 ve 1/2 birbirini iptal eder, sonuç

7
∇h(x̄) = ∇f(x̄) + F(x̄)(x − x̄)

İki üstteki karesel yaklaşıksal ifadenin gradyanı bu işte. Onu sıfıra eşitleriz ve
çözeriz. F tersi alinabilir bir matristir, o zaman

∇h(x̄) = ∇f(x̄) + F(x̄)(x − x̄) = 0

(x − x̄) = −F−1 ∇f(x̄)

Üstteki ifadeye d diyebilirim, ve bu d benim Newton yönüm olarak görülebilir,


yön derken optimizasyon bağlamında minimuma giden yön.
Bu bizi gayet basit 4 adımlık bir algoritmaya taşıyor,
0) x0 verildi, bu başlangıç noktası, k = 0 yap.
1) dk = −F(xk )−1 ∇f(xk ). Eğer dk = 0 ise dur.
2) αk = 1 adım boyu seç
3) xk+1 = xk + αk dk , k = k + 1 yap, ve 1. adıma geri dön.
Bu metodun önemli bir özelliğinin her adımda sadece bir lineer sistemi çözmek
olduğunu görüyoruz (tersini alma işlemi). Bir lineer sistemi çözmek kolay mıdır?
Sisteme göre değişir, 100 x 100 sistem, problem yok. 10,000 x 10,000 yoğun bir sis-
tem var ise (seyrek matrisle temsil edilen lineer sisteme nazaran) işimiz daha zor
olacaktır. Bu tür sistemlerde Gaussian eliminasyon işlemeyebilir, bir tür özyineli
metot gerekli. Demek istediğim Newton yönteminin darboğazı bir lineer den-
klem sistemini her seferinde sıfırdan başlayarak çözmek, ve bunu her döngüde
yapmak.
Fakat bu çözümün bize pek çok şey kazandırdığını da görmek lazım; bahsedilen
sistemi çözmek bize pek çok bilgi kazandırıyor çünkü çözülen problem içinde
1. ve 2. türev bilgisi var. Bu bilgi minimizasyon açısından daha akıllıca adım
atılabilmesini sağlıyor.
Metot Hessian’ın her adımda tersi alınabilir olduğunu farzediyor, bu her za-
man doğru olmayabilir. O sebeple bunun doğru olduğu türden problemler ile
uğraşacağız, ya da Hessian’ın tersi alınabilir olmasını sağlayan mekanizmaları
göreceğiz. F’nin özünü bozmadan değiştirerek tersi alınabilir olmasını sağlayan
yöntemler var.
Ayrıca hedef her adımda fonksiyonunu oluşturduğumda bu fonksiyonun azalma
garantisi yok. Öyle ya akıllı bir algoritmanin her adımda hedef fonksiyonumu
daha iyiye götürdüğümü düşünebilirdim, ama şu anda kadar gördüklerimiz ışığında,
bunun garantisi yok. Bu konuya sonra değineceğiz.
Bir diğer nokta 2. adımın çizgi arama ile genişletilebilmesi [bu konuya altta baska
kaynaklardan deginiyoruz]

8
NY’nin en çekici tarafı, eğer yakınsama (convergence) mümkün ise bu yakınsamanın
çok hızlı bir şekilde olması, ki bu iyi. Bu konuya gelmeden metodun bazı ek
özelliklerini görelim.
Terminoloji: bir matrise SPD denir eger matris simetrik, pozitif kesin ise (simetric
positive-definite).
Teklif (Proposition) 1:
Eğer F(x) SPD ise d 6= 0, o zaman d x̄ noktasında bir iniş yönüne işaret eder. İniş
yönü olması demek, eğer makul ufak bir adım çerçevesinde gidilen noktada f’in
değerinin o an olduğumuz noktadan daha az olması demektir.
Nasıl ispatlarım? Önceki dersten hatırlarsak, eğer yönüm gradyan ile negatif iç
çarpıma sahip ise, o zaman yönüm kesinlikle bir iniş yönüydü.
Teori
Diyelim ki f(x) fonksiyonu x̄ noktasında türevi alınabilir halde [2, sf. 9]. Eğer
elimizde ∇f(x̄)T d < 0 sonucunu veren bir d vektörü var ise, öyle ki her yeterince
küçük λ > 0 için f(x̄ + λd) < f(x̄) olacak şekilde, o zaman d bir iniş yönüdür.
İspat
Taylor açılımı ile yönsel türev tanımına bakarsak,

f(x̄ + λd) = f(x̄) + λ∇f(x̄)T d + λ||d||α(x̄, λd)

öyle ki α(x̄, λd) → 0, λ → 0 olurken. Not: Norm içeren üçüncü terimdeki


λ||d||α(x̄, λd) ifadesi Taylor serisinin artıklı tanımından geliyor. Detaylar için [3,
sf. 360]’a bakılabilir.
Üstteki ifadeyi tekrar düzenlersek,

f(x̄ + λd) − f(x̄)


= ∇f(x̄)T + ||d||α(x̄, λd)
λ

∇f(x̄)T d < 0 olduğuna göre (aradığımız şart bu) o zaman, ve α(x̄, λd) → 0, λ → 0
iken, her yeterince küçük λ > 0 için f(x̄ + λd) − f(x̄) < 0 olmalıdır, yani her
hangi bir yönde atılan adım bir önceki f değerinden bizi daha ufak bir f değerine
götürmelidir.
Ana Teklif’e dönelim. Newton adımınıdaki SPD F için 0 < dT ∇f olduğunu
göstermemiz lazım (ki böylece iniş yönü olduğunu ispatlayabilelim, bir önceki
teori),

d = −F−1 ∇f(x̄)

demiştik, her iki tarafı ∇f(x) ile çarpalım,

9
d∇f(x) = −∇f(x)F−1 ∇f(x)

Eşitliğin sağ tarafındaki ifade hangi şartlarda eksi olur? Eğer F matrisi pozitif
kesin ise değil mi? Genel matrislerden hatırlarsak, matris A ve bir vektör için
v eğer A pozitif kesin ise vT Av > 0. Daha önce F’nin pozitif kesin olduğunu
söylemiştik, o zaman bir şekilde eğer F pozitif kesin olmasının sadece ve sadece
F’nin tersinin pozitif kesin olmasına bağlı olduğuna gösterebilirsem amacıma
ulaşabilirim.
Bunu yapmak aslında pek zor değil. Biliyorum ki F(x) SPD. Simdi herhangi bir
vektor v icin

0 < vT F(x)−1 v

ifadeyi şöyle genişletelim, F(x)F(x)−1 eklemek hiçbir şeyi değiştirmez çünkü bu


çarpım birim matristir,

vT F(x)−1 v = vT F(x)−1 F(x)F(x)−1 v > 0

Genişlemiş ifadenin harfiyen pozitif olduğunu biliyorum, iki üstteki tanımdan.


Ama şimdi üstteki ifadeye farklı bir şekilde bakarsak,

vT F(x)−1 v = vT F(x)−1 F(x) F(x)−1 v > 0


| {z } | {z }

İşaretlenen bölümlerin birer vektör olduğunu görebiliriz, bu durumda vT Av > 0


pozitif kesinlik formülü farklı bir v için hala geçerlidir, o zaman ortadaki A, bu
durumda F(x) pozitif kesin olmalıdır.
Örnek 1
f(x) = 7x − ln(x) olsun. O zaman ∇f(x) = 7 − x1 ve F(x) = f 00 (x) = x12 . Bu
fonksiyonun özgün global minimumunun x∗ = 1/7 = 1.428.. olduğunu kontrol
etmek zor değil. x noktasındaki Newton yönü

f 0 (x)
 
2 1
−1
d = −F(x) ∇f(x) = − 00 = −x 7 − = x − 7x2
f (x) x

Newton yöntemi {xk } serisini üretecek, öyle ki

xk+1 = xk + (xk − 7(xk )2 ) = 2xk − 7(xk )2

Altta farklı başlangıç noktalarına göre üretilen serileri görüyoruz. Yakınsamanın


hangi değere doğru olduğu bariz, ve global minimum da o değer zaten.

10
import pandas as pd
pd.set_option('display.notebook_repr_html', False)
pd.set_option('display.max_columns', 20)
pd.set_option('display.max_rows', 30)
pd.set_option('display.width', 82)
pd.set_option('precision', 6)

df = pd.DataFrame(index=np.arange(11))

def calculate_newton_ex1(x):
arr = []
for i in range(11):
arr.append(x)
x = 2*x - 7*x**2
if (x > 1e100): x = np.inf
if (x < -1e100): x = -np.inf
return arr

df['1'] = calculate_newton_ex1(1.0)
df['2'] = calculate_newton_ex1(0.0)
df['3'] = calculate_newton_ex1(0.1)
df['4'] = calculate_newton_ex1(0.01)

print (df)

1 2 3 4
0 1.000000e+00 0.0 0.100000 0.010000
1 -5.000000e+00 0.0 0.130000 0.019300
2 -1.850000e+02 0.0 0.141700 0.035993
3 -2.399450e+05 0.0 0.142848 0.062917
4 -4.030157e+11 0.0 0.142857 0.098124
5 -1.136952e+24 0.0 0.142857 0.128850
6 -9.048612e+48 0.0 0.142857 0.141484
7 -5.731417e+98 0.0 0.142857 0.142844
8 -inf 0.0 0.142857 0.142857
9 -inf 0.0 0.142857 0.142857
10 -inf 0.0 0.142857 0.142857

Örnek 2
Bu örnekte iki değişkenli bir fonksiyon görelim. Global minimum (1/3, 1/3).
Bakalım bu değeri bulabilecek miyiz?
f(x) = − ln(1 − x1 − x2 ) − ln x1 − ln x2

 1 1 
1−x1 −x2
− x1
∇f(x) = 1 1
1−x1 −x2
− x2

( 1−x11 −x2 )2 − ( x11 )2 ( 1−x11 −x2 )2


 
F(x) =
( 1−x11 −x2 )2 ( 1−x11 −x2 )2 − ( x12 )2

import numpy.linalg as lin


df = pd.DataFrame(index=np.arange(11))

11
def calculate_newton_ex2(x):
arr = []
for i in range(8):
arr.append(x)
x1,x2 = x[0],x[1]
F = [[(1.0/(1.0-x1-x2))**2 + (1.0/x1)**2.0, (1.0/(1.0-x1-x2))**2.0],
[(1.0/(1.0-x1-x2))**2, (1.0/(1.0-x1-x2))**2.0 + (1.0/x2)**2.0]]
F = np.array(F)

Df = [[1.0/(1.0-x1-x2) - (1.0/x1)], [1.0/(1.0-x1-x2)-(1.0/x2)]]


Df = np.array(Df)

d = np.dot(-lin.inv(F),Df)
x = x + d.flatten()

return np.array(arr)

res = calculate_newton_ex2([0.85,0.05])
print (res)

[[0.85 0.05 ]
[0.717 0.097]
[0.513 0.176]
[0.352 0.273]
[0.338 0.326]
[0.333 0.333]
[0.333 0.333]
[0.333 0.333]]

[diğer yakınsama konusu atlandı]


Dikkat edilirse şimdiye kadar dışbükeylik (convexity) farzını yapmadık, sadece
Hessian matrinin tersi alınabilir olduğunu farzettik.
Devam edersek, özyineli şekilde güncelememizi yaparken Hessian’ın eşsiz olduğu
bazı noktalara gelmiş olabiliriz. Bu olduğunda çoğu yazılım bu durumu yakalay-
acak şekilde yazılmıştır, “yeterince eşsiz” Hessian matrislere önceden tanımlı
ufak bir  çarpı birim matrisi kadar bir ekleme yaparlar, böylece tersin alınamama
durumundan kurtulunmuş olur. Bu metotlara Newton-umsu (quasi-Newton)
ismi de veriliyor.
Eskiden Newton-umsu metotlar koca bir araştırma sahasıydı. Benim bildiğim
kadarıyla tarihte 15 sene kadar geriye gidersek, üstteki görüldüğü gibi her adımda
büyük bir denklem sistemi çözmek istemiyoruz, x noktasındayım, Hessian işliyorum,
Newton yönümü buluyorum, adım atıyorum, yeni bir noktadayım. Newton-
umsu metotlarda bu yeni noktada sil baştan bir Hessian işlemek yerine bir önceki
adımdaki işlenen Hessian sonuçlarını, bir şekilde, az ek işlem yaparak sonraki
adımda kullanmaya uğraşıyorlar. Aslında pek çok farklı Newton-umsu metot
var, hepsi farklı şekilde Newton metotundan farklı (!)
[teori 1.1 ispatı atlandı]
Newton metodunun eğer başlangıç noktası nihai minimuma yakınsa iyi yakınsaklık

12
özellikleri var. Fakat eğer sonuca uzaktan bir yerden başlamışsak yakınsaklık
garantisi yok. Geldiğimiz yeni noktada Hessian eşsiz olabilir. Bu sebeple metot
sürekli iniş özelliğine (descent property) sahip olmayacaktır, yani f(xx+1 ) > f(xk )
olabilir, ve yakınsaklık garantisi bu durumda kaybolur [4, sf. 167]. Fakat bu al-
goritmayı biraz değiştirerek sürekli iniş özelliğine sahip olmasını sağlayabiliriz.
Teori
x1 , x2 , ... ya da kısaca {xk } Newton’un metodu tarafından üretilmiş f(x) hedef
fonksiyonunu minimize etme amaçlı bir çözüm dizisi olsun. Eğer Hessian F(x)k
pozitif kesin ise ve gradyan gk = ∇f(xk ) 6= 0 ise, o zaman çözüm yönü

dk = −F(xk )−1 gk = xk+1 − xk

bir iniş yönüdür, ki bu ifadeyle kastedilen bir ᾱ > 0 kesinlikle vardır öyle ki her
α ∈ (0, ᾱ) için

f(xk + αdk ) < f(xk )

ifadesi doğrudur.
İspat
φ(α) diye yeni bir eşitlik yaratalım,

φ(α) = f(xk + αdk )

Üstteki formülün türevini alalım. Zincirleme Kuralını kullanarak,

φ(α) 0 = f(xk + αdk )dk

elde ederiz. Şimdi φ(0) 0 ne oluyor ona bakalım,

φ(0) 0 = ∇f(xk )dk = −gTk F(xk )−1 gk < 0

−gTk F(xk )−1 gk ifadesinin sıfırdan küçük olduğunu biliyoruz çünkü F(xk )−1 poz-
itif kesin, ve gk 6= 0. O zaman diyebiliriz ki bir ᾱ > 0 mevcuttur öyle ki her
α ∈ (0, ᾱ) için φ(α) < φ(0). Bu da demektir ki her α ∈ (0, ᾱ) için

φ(α) < φ(0) = f(xk + αxk ) < f(xk )

İspat tamamlandı.
Üstteki gördüklerimiz dk yönünde bir arama yaparsak, muhakkak bir minimum
bulacağımızı söylüyor. Eğer her geldiğimiz noktada, bir sonraki gidiş noktasını

13
hesap için bu minimum yeri ararsak, sürekli iniş özelliğine kavuşmuş olacağız,
ve böylece Newton metodunu kurtarmış olacağız. Demek ki Newton metotunu
şu şekilde değiştirmemiz gerekiyor,

xk+1 = xk − αk F(xk )−1 gk

ki

αk = arg min f(xk − αF(xk )−1 gk )


α>0

Yani döngünün her adımında −F(xk )−1 gk yönünde bir arama gerçekleştiriyoruz,
o yöndeki en fazla azalmayı buluyoruz, ve αk adımını o büyüklükte seçiyoruz.
Ve üstteki teori sayesinde gk 6= 0 olduğu sürece

f(xk+1 ) < f(xk )

sürekli iniş özelliğinin mevcut olduğundan emin oluyoruz.


Örnek
Newton metodunu bir örnek üzerinde görelim, fonksiyon [8, 10-9]’dan geliyor,

f(x1 , x2 ) = ex1 +3x2 −0.1 + ex1 −3x2 −0.1 + e−x1 −0.1

Hessian ve gradyan hesaplarını otomatik türev üzerinden yapacağız.

import autograd.numpy as anp


import numpy.linalg as lin
import autograd

def f(x):
x1,x2=x
return anp.exp(x1 + 3.0*x2 - 0.1) + anp.exp( x1 - 3.0*x2 - 0.1 ) + anp.exp(-x1-0.1

alpha = 0.1
beta = 0.7
eps = 0.001
x0 = np.array([-1.1, 1.0])
x = x0
hist = []
for i in range(10):
h = autograd.hessian(f)
g = autograd.grad(f)
v = np.dot(-lin.inv(h(x)),g(x))
lamsq = np.dot(np.dot(g(x).T,lin.inv(h(x))),g(x))
hist.append(x)
if lamsq/2 <= eps:
print ('done')

14
break
t = 1.0
while f(x+t*v) >= f(x)+alpha*t*np.dot(g(x).T,v): t = t*beta
x = x + t*v
h = np.array(hist)
h = np.reshape(h,(len(h),2))
print (h)

done
[[-1.10000000e+00 1.00000000e+00]
[-1.43075233e-01 3.50917569e-01]
[-1.09323466e-01 8.11516892e-02]
[-3.28295993e-01 1.89932171e-02]
[-3.45760583e-01 3.51878538e-04]]

from mpl_toolkits.mplot3d import Axes3D

def f2(x1,x2):
return f([x1,x2])

D = 50
x = np.linspace(-2.0,1.0,D)
y = np.linspace(-1.0,1.0,D)

xx,yy = np.meshgrid(x,y)
zz = f2(xx,yy)

contours = [1,2,3,4,5,6]
cs=plt.contour(xx,yy,zz,contours)
plt.plot(h[:,0],h[:,1],'rd')
plt.plot(h[:,0],h[:,1])
plt.savefig('boyd-1092.png')

fig = plt.figure()
ax = fig.gca(projection='3d')
surf = ax.plot_surface(xx, yy, zz)
plt.savefig('boyd-1091.png')

Kaynaklar

15
[1] Bayramlı, Çok Boyutlu Calculus, Vektör Calculus, Kurallar, Matris Türevleri
[2] Freund, MIT OCW Nonlinear Programming Lecture, https://ocw.mit.edu/
courses/sloan-school-of-management/15-084j-nonlinear-programming-
spring-2004/
[3] Miller, Numerical Analysis for Scientists and Engineers
[4] Zak, An Introduction to Optimization, 4th Edition
[6] Tibshirani, Convex Optimization, Lecture Video 14, https://www.youtube.
com/channel/UCIvaLZcfz3ikJ1cD-zMpIXg
[7], Boyd, Convex Optimization I, Video Lecture 16
[8], Boyd, Convex Optimization I, Lecture Notes

16
Genel Optimizasyon, Paketler, Autograd
Otomatik türevin nasıl işlediğini [1] yazısında gördük. Programlama dilinde
yazılmış, içinde if, case, hatta döngüler bile içerebilen herhangi bir kod parçasının
türevini alabilmemizi sağlayan otomatik türev almak pek çok alanda işimize yarar.
Optimizasyon alanı bunların başında geliyor. Düşünürsek, eğer sembolik olarak
türev alması çok çetrefil bir durum varsa, tasaya gerek yok; bir fonksiyonu kod-
layabildiğimiz anda onun türevini de alabiliriz demektir.
Autograd
Çok boyutlu bir fonksiyonun gradyani ve Hessian’ı,

from autograd import grad, hessian

def objective(X):
x, y, z = X
return x**2 + y**2 + z**2

x,y,z = 1.0,1.0,1.0

h = hessian(objective, 0)
res = h(np.array([x, y, z]))
print (res)

g = grad(objective, 0)
res = g(np.array([x, y, z]))
print (res)

[[2. 0. 0.]
[0. 2. 0.]
[0. 0. 2.]]
[2. 2. 2.]

Ya da
Hessian
Mesela f(x1 , x2 ) = x32 + x32 + x21 x22 gibi bir fonksiyon var diyelim. Belli bir noktadaki
Hessian

 ∂f ∂f 
∂x1 x1 ∂x1 x2
H= ∂f ∂f
∂x2 x1 ∂x2 x2

hesaplatmak için autograd.hessian kullanırız,

import autograd

def f(x):
x1,x2=x[0],x[1]
return x1**3 + x2**3 + (x1**2)*(x2**2)

print

1
xx = np.array([1.0,1.0])
h = autograd.hessian(f)
print (h(xx))

[[8. 4.]
[4. 8.]]

Şimdi bazı genel optimizasyon konularını işleyelim.


Sınırlanmamış optimizasyonda (unconstrained optimization) f(x) fonksiyonunu
minimum değerde tutacak x değerini bulmaya uğraşıyoruz, ki x tek boyutlu
skalar, ya da çok boyutlu x ∈ Rn olabilir. Yani yapmaya uğraştığımız

min f(x)
x

işlemi. Peki minimumu nasıl tanımlarız? Bir nokta x∗ global minimize edicidir
eğer tüm x’ler için f(x∗ ) 6 f(x) ise, ki x ∈ Rn , en azından x modelleyeni ilgilendi-
ren tüm küme öğeleri için.
Fakat çoğu zaman bir global f’i kullanmak mümkün olmayabilir, fonksiyon çok
çetrefil, çok boyutlu, bilinmez durumdadır, ve elimizde sadece yerel bilgi vardır.
Bu durumda üstteki tanımı “bir N bölgesi içinde” olacak şekilde değiştiririz ki
bölge, x∗ etrafındaki, yakınındaki bölgedir.
Üstteki tanımı okuyunca x∗ ’in yerel minimum olup olmadığını anlamanın tek
yolunun yakındaki diğer tüm noktalara teker teker bakmak olduğu anlamı çıkabilir,
fakat eğer f pürüzsüz bir fonksiyon ise yerel minimumu doğrulamanın çok daha
hızlı bir yöntemi vardır. Hatta ve hatta eğer fonksiyon f iki kez türevi alınabilir
haldeyse x∗ ’in yerel minimum olduğunu ispatlamak daha kolaylaşır, ∇f(x∗ ) ve
Hessian ∇2 f(x∗ )’e bakarak bunu yapabiliriz.
Minimallik için 1. ve 2. derece şartlar var. 1. derece gerekli şart (ama yeterli
değil) ∇f = 0 olması. Bu standard Calculus’tan bildiğimiz bir şey, minimum
ya da maksimumda birinci türev sıfırdır. Ama türevin sıfır olup minimum ya da
maksimum olmadığı durum da olabilir, mesela f(x) = x3 . f 0 (0) = 0’dir fakat x = 0
ne maksimum ne de minimumdur. Daha iyi bir termioloji ∇f = 0 noktalarını
kritik nokta olarak tanımlamaktır. x = 0 noktasında bir değişim oluyor, bu değişim
kritik bir değişim, her ne kadar minimum ya da maksimum olmasa da.

x = np.linspace(-3,3,100)
plt.plot(x,x**3)
plt.grid(True)
plt.savefig('func_40_autograd_01.png')

2
Bir kritik noktanın yerel maksimum ya da yerel minimum olup olmadığını anla-
mak için fonksiyonun ikinci türevine bakabiliriz. Bir f : Rn → R var ve x∗ nok-
tasının kritik nokta olduğunu düşünelim, yani ∇f(x∗ ) = 0. Şimdi çok ufak bir h
adımı için f(x∗ + h)’a ne olduğuna bakalım. Burada Taylor açılımı kullanabiliriz
[2],

1
f(x + h∗ ) = f(x∗ ) + ∇f(x∗ )h + hT f(x∗ )∇2 (x∗ )f(x∗ )h + O(3)
2

∇2 (x∗ ) bir matristır içinde f’nin ikinci derece türevleri vardır [6]. Şimdi, kritik
noktada olduğumuz için ∇f(x∗ ) = 0, ve O(3) terimlerini iptal edersek, üstteki

1
f(x∗ + h∗ ) − f(x∗ ) = hT ∇2 (x∗ )h + O(3)
2

haline gelir. Simdi “bir noktanın mesela yerel maksimum olması” sözünü f(x∗ +
h∗ ) − f(x∗ ) < 0 ile ifade edebiliriz, çünkü x∗ etrafındaki tüm x’lerin f’in daha
az değerlerinden olma şartını aramış oluyoruz (adım atılıyor, çıkartma yapılıyor,
sonuç sıfırdan küçük). Tabii bu “tüm” söylemi yaklaşıksal, o sebeple minimum-
luk ifadesi yerel.
Devam edersek f(x∗ + h∗ ) − f(x∗ ) < 0 olması şartı aynı zamanda 21 hT ∇2 (x∗ )h < 0
anlamına gelir, bu da ∇2 (x∗ ) negatif kesin demektir. Çünkü A simetrik bir matris
olduğu zaman
xT Ax < 0 ise matris negatif kesin
xT Ax 6 0 ise matris negatif yarı-kesin (negatif semi-definite)
xT Ax > 0 ise matris pozitif kesin
xT Ax > 0 ise matris pozitif yarı-kesin (positive semi-definite)
Gradyan Inisi
Optimizasyonun mekaniğine gelelim. Diyelim ki basit, tek boyutlu bir f(x) = x2

3
fonksiyonumuz var. Tek boyutlu bu ortamda bir noktadan başlayıp gradyanın (1.
türev) işaret ettiği yönde ufak bir adım atmak bizi minimuma daha yaklaştırır, ve
bunu ardı ardına yaparak yerel bir minimuma erisebiliriz. Örnek f(x) dışbükey
(convex) olduğu için bu bizi global minimuma götürür [3]. Formül

xi+1 = xi + α∇f(xi )

Başlangıç x0 herhangi bir nokta, üstteki formülle adım ata ata ilerliyoruz, adım
boyutunu bizim tanımladığımız bir α sabitiyle ayarlayabiliyoruz.

import autograd

def fun(x):
return x**2

def grad_desc(x, fun, alpha=0.1, max_iter=100):


xs = np.zeros(1 + max_iter)
xs[0] = x
grad = autograd.grad(fun)

for step in range(max_iter):


x = x - alpha * grad(x)
xs[step + 1] = x

\includegraphics[height=6cm]{func_40_autograd_02.png}
return xs

alpha = 0.1
x0 = 1.

x_opt = grad_desc(x0, fun, alpha = alpha, max_iter = 10)


y_opt = fun(x_opt)

x_true = np.linspace(-1.2, 1.2, 100)


y_true = fun(x_true)

plt.plot(x_true, y_true)
plt.plot(x_opt, y_opt, 'o-', c='red')

for i, (x, y) in enumerate(zip(x_opt, y_opt), 1):


plt.text(x - 0.1, y + 0.1, i, fontsize=15)

plt.show()

4
Türevi autograd ile aldık, bu örnekte sembolik türev kolaydı, elle f 0 (x) = 2x diye-
bilirdik ama gösterim amaçlı direk yazılımla türevi aldık.
Kısıtlanmış Optimizasyon
Mühendislik problemlerinde kısıtlanmış optimizasyon çok ortaya çıkar. Prototipik
örnek bir düzlem üzerindeki orijine en yakın noktayı bulmak. Mesela düzlem
2x − y + z = 3 olsun, ve mesafeyi minimize etmek istiyoruz, bunu x2 + y2 + z2
ile hesaplayabiliriz. Yani optimizasyon problemi düzlem denklemi ile sınırlanan
mesafe formülünün minimal noktasını bulmak [5].
Problemi direk scipy.optimize.minimize ile çözelim.

from scipy.optimize import minimize

def objective(X): # hedef


x, y, z = X
return x**2 + y**2 + z**2

def cons(X): # kisitlama


x, y, z = X
return 2 * x - y + z - 3

x0 = [1, 1, 1]
sol = minimize(objective, x0, constraints={'type': 'eq', 'fun': cons})
print (sol)

fun: 1.5000000035790053
jac: array([ 1.99997392, -1.00010441, 0.99994774])
message: 'Optimization terminated successfully.'
nfev: 22
nit: 4
njev: 4
status: 0
success: True
x: array([ 0.99998696, -0.50005221, 0.49997386])

Fonksiyon minimize için kısıtlamalar eq ile sıfıra eşit olma üzerinden tanımlanır.
Eğer ineq kullanılırsa sıfırdan büyük olma tanımlanıyor o zaman mesela x > 0

5
ve x < 5 kısıtlamalarını getirmek istersek,

cons=({'type': 'ineq','fun': lambda xvec: 5.0-xvec[1]}, # y<5


{'type': 'ineq','fun': lambda xvec: xvec[1]}) # y>0
sol = minimize(objective, x0, method = 'SLSQP', constraints=cons)
print (sol)

Not: SLSQP metotu gradyana ihtiyaç duymuyor.


fun: 1.1090612774580318e-16
jac: array([7.79817877e-12, 1.49011612e-08, 7.79860898e-12])
message: 'Optimization terminated successfully.'
nfev: 20
nit: 4
njev: 4
status: 0
success: True
x: array([-7.44668151e-09, 2.73897702e-24, -7.44668129e-09])

Bazen her şeyi kendimiz yaparak tüm adımların ne yaptığından emin olmak
isteyebiliriz. Mesela kısıtlama şartlarını kendimiz bir Lagrange çarpanı f(x)f(x)−
λg(x) ifadesi üzerinden tanımlayıp, türevi alıp sıfıra eşitleyip, fx (x) = fy (x) =
fz (x) = g(x) = 0 ile, elde edilen kısıtsız optimizasyonu çözmeyi tercih edebiliriz.
Türevin alınmasını direk autograd’a yaptırırız.

import autograd.numpy as np
from autograd import grad

def F(L):
x, y, z, _lambda = L
return objective([x, y, z]) - _lambda * eq([x, y, z])

dfdL = grad(F, 0)

# Find L that returns all zeros in this function.


def obj(L):
x, y, z, _lambda = L
dFdx, dFdy, dFdz, dFdlam = dfdL(L)
return [dFdx, dFdy, dFdz, eq([x, y, z])]

from scipy.optimize import fsolve


x, y, z, _lam = fsolve(obj, [0.0, 0.0, 0.0, 1.0])
print (x,y,z)
1.0 -0.5 0.5

Aynı sonuç bulundu. Şimdi merak ediyoruz, bu sonuç gerçekten minimum mu?
Üstteki noktada Hessian’ın pozitif kesin olup olmadığını kontrol edebiliriz. Hes-
sian’ı da autograd hesaplar! Once gradyan,

from autograd import hessian


h = hessian(objective, 0)
res = h(np.array([x,y,z]))
print (res)

6
[[2. 0. 0.]
[0. 2. 0.]
[0. 0. 2.]]

Bu matris pozitif kesin, ama çıplak gözle bariz değilse, tüm özdeğerleri pozitif
olup olmadığına bakabiliriz,

print (np.linalg.eig(h(np.array([x, y, z])))[0])

[2. 2. 2.]

Birden Fazla Gradyan Değişkeni


Diyelim ki elimizde

g(w1 , w2 ) = tanh(w1 w2 )

fonksiyonu var, bu üç boyutlu bir fonksiyon, ve optimizasyon amaçlı gradyan


gerekiyor, gradyanın iki değişken üzerinden alınması gerekli [7].

import autograd
from autograd import numpy as anp

def g(w_1,w_2):
return anp.tanh(w_1*w_2)

from mpl_toolkits.mplot3d import Axes3D


from matplotlib import cm
x = np.linspace(-4,4,20)
y = np.linspace(-4,4,20)
xx,yy = np.meshgrid(x,y)
zz = g(xx,yy)
fig = plt.figure()
ax = fig.gca(projection='3d')
surf = ax.plot_surface(xx, yy, zz, cmap=cm.coolwarm)
plt.savefig('func_40_autograd_03.png')

7
g’nin her iki kısmi türevini ve gradyanını,

 ∂ 
∂w1
g(w1 , w2 )
∇g(w1 , w2 ) = ∂
∂w2
g(w1 , w2 )

autograd ile hesaplamak için

dgdw1 = autograd.grad(g,0)
dgdw2 = autograd.grad(g,1)

Dikkat edersek, 0 ve 1 parametreleri geçildi, bunlar sırasıyla w1 ve w2 değişkenlerine


tekabül ediyorlar (g tanımındaki sıralarına göre, 0. ve 1. parametreler). Şimdi
mesela (1.0,2.0) noktasındaki gradyanı hesaplayabiliriz,

gradg = [dgdw1(1.0,2.0), dgdw2(1.0,2.0)]


print (gradg)

[0.14130164970632894, 0.07065082485316447]

Tabii çok boyutlu ortamda yazının başındaki teknikleri kullanmak daha iyi, üstteki
bir seçenek.
Kaynaklar
[1] Bayramlı, Ders Notları, Otomatik Türev Almak (Automatic Differentiation -AD-)
[2] Schrimpf, http://faculty.arts.ubc.ca/pschrimpf/526/526.html
[3] Stoyanov, https://nikstoyanov.me/post/2019-04-14-numerical-
optimizations
[5] Kitchin, http://kitchingroup.cheme.cmu.edu/blog/2018/11/03/
Constrained-optimization-with-Lagrange-multipliers-and-autograd/
[6] Bayramli, Cok Boyutlu Calculus, Vektör Calculus, Kurallar, Matris Türevleri
[7] Watt, Automatic Differentiation, https://jermwatt.github.io/machine_
learning_refined/notes/3_First_order_methods/3_5_Automatic.html

8
Altgradyanlar (Subgradients)
Altgradyanlar aslında bir algoritma değil, bir matematiksel kavram [1, 40:29], ve
hem optimizasyon, hem analiz, hem de pratik bağlamda çok faydalı bir kavram.
Hatırlarsak dışbükey ve türevi alınabilir bir f için

f(y) > f(x) + ∇f(x)T (y − x) ∀x, y

gerekli ve yeterli bir şart. Yani fonksiyonuma herhangi bir noktada oluşturacağım
teğet eğri, lineer yaklaşıksallık, fonksiyonum için bir global eksik / az tahmin
edici (underestimator) olacaktır, yani hep ondan küçük kalacaktır.
Altgradyan nedir? Altgradyan üstteki gradyanin yerini alabilecek herhangi bir
g vektörüdür, yerine alabilecek derken üstteki ifade her y için hala doğru olacak
şekilde. Dışbükey fonksiyon f’nin x noktasında altgradyanı herhangi bir g ∈
Rn ’dir öyle ki

f(y) > f(x) + gT (y − x) ∀y

Teğet çizgi hakkında: görsel olaral hayal edersek kap şeklinde, yani dışbükey
olan bir fonksiyona nerede teğet çizgi çekersem çekeyim fonksiyonun kendisi
hep o çizginin üstünde kalır. Eğer fonksiyonum kap olmasaydı, habire aşağı
yukarı inip çıkıyor olsaydı bir noktada o çizginin altına düşülebilirdi. Eğer f
türevi alınabilir ise dışbükey olmasının şartı üstteki ifadenin doğru olması.
Dışbükey fonksiyonlar için
1) g her zaman mevcuttur (dışbükey olmayan fonksiyonlar için g’nin mevcud-
iyeti şart değildir). Bu güzel bir özellik.
2) Eğer x noktasında f’in türevi alınabilir ise, tek bir altgradyan vardır, o da
türevin kendisidir [1, 43:12], g = ∇f(x).
Aslında #2 kalemi dışbükey olmayan bir f için bile geçerli, eğer g varsa. Bu du-
rumlarda illa altgradyan olması gerekmiyor, hatta türevi alınabilir dışbükey ol-
mayan f için bile g olmayabiliyor.
Dışbükey olmayan (pürüzsüz) ve altgradyanı olmayan bir fonksiyon örneği nedir?
Alttaki,

Bu fonksiyonun hiçbir yerde altgradyanı yok. Eğri üzerinde bir nokta arıyorum

1
öyle ki oradan geçen bir çizgi tüm fonksiyonu üstte bıraksın.. böyle bir çizgi
çizilemez. Altgradyan yok [1, 43:54]. Bazılarımız itiraz edebilir, “üstteki bir
içbükey fonksiyon, dışbükeyin ters çevrilmiş hali”. O zaman x3 diyelim, pürüzsüz,
ve altgradyanı yok.
Altgradyanı mevcut fonksiyonlar görelim, mesela mutlak değer fonksiyonu f(x) =
|x|.

Altgradyanlar için farklı şartları görelim.


x > 0 için tek bir altgradyan var, o da g = 1, yani fonksiyonun eğiminin ta
kendisi, eğim=1. Aynı şekilde x < 0 için, o zaman g = −1. Bu sonuç “eğer f’in
x’te türevi alınabilir ise o noktada g = ∇f” açıklaması ile uyuyor. x = 0 noktası
için birçok seçenek var, herhangi bir [−1, 1] öğesi için, yani -1 ve +1 arasındaki
herhangi bir sayı olabilir, çizgili noktalar seçeneklerden ikisi.
Boyut atlayalım, f(x) = ||x||2 fonksiyonunu görelim, x’in L2 norm’u. İki boyutta
[1, 45:51],

Eğer x 6= 0 ise bu fonksiyonun türevi alınabilir (yoksa alınamaz, bir yaygın görüşe
göre x = 0’da problem yok, ama var) ve altgradyanı onun mevcut gradyanı,
x/||x||2 . x = 0 noktasında altgradyan g {z : ||z||2 < 1} kümesinin herhangi bir öğesi.
Şimdi f(x) = ||x||1 ’e bakalım,

2
Bu fonksiyonun x = 0’da türevi alınamaz, aynen tek boyutlu (mutlak değer
fonksiyonu) versiyonunda olduğu gibi. Ayrıca bu fonksiyonun herhangi bir ek-
sende sıfır değer olduğu zamanda da türevi alınamaz. Altgradyan için öğe öğe
yaklaşmak lazım, eğer bir öğe xi 6= 0 ise gi = sign(xi ), eğer xi = 0 ise gi ∈
[−1, +1].
En son örnek [1, 48:35] iki dışbükey fonksiyonun maksimumu olanı, yani f(x) =
max{f1 (x), f2 (x)} ki f1 , f2 dışbükey ve türevi alınabilir olmak üzere, ve f(x) bu
iki fonksiyonun her x noktasında f1 (x) ve f2 (x)’den hangisi büyükse o. Bu tür
bir maks fonksiyonunun sonucunun dışbükey olduğunu önceki derslerden biliy-
oruz.

Altgradyan yine farklı şartlara göre değişik oluyor. Eğer f1 (x) > f2 (x) o zaman
altgradyan özgün, g = ∇f1 (x). Eğer f2 (x) > f1 (x) ise altgradyan özgün, g =
∇f2 (x).
Kabaca çizersek birbirlerini kesen f1 ve f2 düşünelim,

3
onların maks halleri yeşil ile [çok kabaca benim eklediğim] çizgi, yani kesişmenin
solunda f2 sağında f1 . Tabii ki sol tarafta f2 aktif o zaman onun gradyanı geçerli,
sağ tarafta f1 . Kesişme noktası, f1 = f2 ilginç, g = α∇f1 (x) + (1 − α)f2 (x), yani
f1 , f2 ’nin herhangi bir dışbükey kombinasyonu, ki iki üstteki resimde görülen iki
kesikli çizgiler bazı örnekler.
Altdiferansiyel (Subdifferential)
Dişbükey f’in tüm altgradyanlarına altdiferansiyel denir [1, 52:35]. Çoğunlukla
kısmi türev için kullanılan aynı sembolle gösterilir, ∂ ile.

∂f(x) = {g ∈ Rn : g, f’in altgradyanıdır}

Yani x noktasındaki tüm mümkün altgradyanların kümesi altdiferansiyel oluyor.


1) ∂f(x) kapalı ve dışbükey bir kümedir. İşin ilginç tarafı bu dışbükey olmayan
f’ler için bile geçerlidir. Niye olduğuna bakalım, ∂f(x) x’te f(x)’in tüm altgradyan-
larıdır. Diyelim ki g1 , g2 altgradyanları bu altdiferansiyel kümesinde, g1 ∈ ∂f(x)
ve g2 ∈ ∂f(x). Simdi αg1 + (1 − α)g2 nerededir ona bakalım [1, 53:59]. Bu değerin
y − x ile iş çarpımını alırsak ve ona f(x) eklersek acaba f(y)’den büyük bir değer
elde eder miyiz?

(αg1 + (1 − α)g2 )T (y − x) + f(x) |{z}


6 f(y) ∀y (1)
?

Üsttekini ispatlayabilirsek ∂f(x)’in bir dışbükey küme olduğunu ispatlayabilirim,


çünkü iki geçerli altgradyanın herhangi bir dışbükey kombinasyonunu almışım
ve hala küme içindeysem o küme dışbükey küme demektir.
Alttaki iki ifadenin doğru olduğunu biliyoruz,

gT1 (y − x) + f(x) 6 f(y)

gT2 (y − x) + f(x) 6 f(y)

Eğer iki üstteki ifadeyi α ile bir üstteki ifadeyi 1 − α ile çarparsam ve toplarsam,
basitleştirme sonrası (1)’i elde ederim. İspat böylece tamamlanır [1, 55:11].

4
Dikkat edersek f’nin dışbükey olup olmadığından bahsetmedik bile.
2) Boş Olmamak: eğer f dışbükey ise ∂f(x) boş değildir.
3) Tek Altgradyan: önceden bahsettik ama eğer f x noktasında türevi alınabilir ise
altdiferansiyelde tek bir öğe vardır o da o noktadaki gradyandır, ∂f(x) = {∇f(x)}.
4) Üstteki özelliğe tersten bakarsak, eğer ∂f(x) = {g}, yani altdiferansiyelde tek
bir öğe var ise, o zaman f o noktada türevi alınabilir demektir ve o noktadaki
gradyan g’dir.
[disbukey geometri baglantisi atlanti]
Altdiferansiyel Calculus
Altgradyanların kendine has bir Calculus’u var, aynen gradyanları, vs. içeren
Çok Değişkenli Calculus’ta olduğu gibi [1, 59:53]. Birazdan göstereceklerimizden
daha fazlası ama alttakiler en faydalı olanları [1, 1:00:00]. Dişbukey f fonksiyon-
ları için alttakiler geçerlidir,
Ölçekleme: ∂(af) = a · ∂f, a sabit ise ve a > 0 olacak şekilde
Toplama: ∂(f1 + f2 ) = ∂f1 + ∂f2
Doğrusal Bileşim: Eğer g(x) = f(Ax + b) ise o zaman ∂g(x) = AT ∂f(Ax + b). Bu
altgradyanlar için bir tür Zincirleme Kanunu gibi. Hatta eğer f türevi alınabilir
ise, bu ifade tamı tamına Zincirleme Kanunu olurdu.
Noktasal Sonlu Maksimum: Eğer f(x) = maxi=1,..,m fi (x) ise, o zaman
 
[
∂f(x) = conv  ∂fi (x)
i:fi (x)=f(x)

Biraz karmaşık duruyor ama daha önce iki fonksiyon maksimumu üzerinden
gördüğümüz kavrama benziyor. Her noktada maks olan fi ’leri alıyoruz, ve bu
fonksiyonların altgradyanlarını hesaplıyoruz. Ama bu altgradyanların birleşimi
her zaman bir dışbükey küme oluşturmayabilir, ve altdiferansiyelin bir dışbükey
küme olması gerekir, o zaman için elimizde olan altgradyanların conv ile dışbükey
zarfına (convex hull) bakarız. Yani sadece birleşim ∪ ile elde ettiğim kümeyi bir
işlemden daha geçirerek onun dışbükey küme halini alıyorum.
[atlandi, norm, 1:09:00]
Niye Altgradyanlar?
1) Optimizasyon: Önemli bir sebep [1, 1:12:00]. Bir dışbükey fonksiyonun alt-
gradyanını hesaplamak her zaman mümkündür, o zaman her dışbükey fonksiy-
onu minimize edebilirim. Bazı durumlarda bu yavaş olabilir ama en azından
minimizasyon mümkün olur.
2) Dışbükey Analizi: Her f için, dışbükey olsun olmasın,

5
f(x∗ ) = min f(x) ⇐⇒ 0 ∈ ∂f(x∗ )
x

Yani x∗ bir minimize edicidir sadece ve sadece 0 değeri f’in x∗ noktasında bir
altgradyanı ise. Bu özelliğe çoğunlukla “altgradyan optimalliği” adı veriliyor.
İspatı basit. Eğer g vektörü x∗ noktasındaki altgradyan ise o zaman alttaki ifade
her y için doğrudur,

f(y) > f(x∗ ) + 0T (y − x∗ ) = f(x∗ )

f(y) > f(x∗ ) ∀y

Üstteki ifade x∗ bir minimize edicidir diyor, o zaman sıfır bir altgradyandır.
Bazen üstteki ifadenin dışbükey olmayan fonksiyonlar için bile geçerli olduğunu
unutanlar oluyor [1:14:32]. Bu her f için doğru diyorum bazen bana şaşırmış
şekilde bakıyorlar. Söylenen biraz sürpriz edici, evet. İkizlik ve KKT şartları
hakkında konuşurken benzer şaşırtıcı ifadeler olacak.
Tabii eklemek gerekir bazen dışbükey olmayan fonksiyonlar için altgradyan hesa-
planamaz, ya da mevcut değillerdir. Her problemi çözmek için bir yemek tarifi
değil bu. Mesela başta gördüğümüz içbükey fonksiyon,

Altgradyanı yok (ama tabii minimize edicisi de yok).


Altgradyanlarla devam edelim [2, 01:11], onlar bir dışbükey fonksiyonun gradyanı
kavramının genelleştirilmiş hali idi.
Bir dikkat edilmesi gereken durum var ama, altgradyanlar bir dışbükey fonksiyon
için her zaman mevcuttur, ama bunu spesifik olarak “tanım kümesinin nispe-
ten iç bölgelerinde olacak şekilde” diye vurgulamak gerekir. Mesela gösterge
fonksiyonu I’nin uç noktalarında mevcut değildir.
Şimdi altgradyan yönteminin gücüne bir örnek görelim. Derslerimizin başında
1. derece optimallik şartını görmüştük [2, 05:30],

min f(x) öyle ki x ∈ C (3)


x

6
problemini çözmek istiyoruz, diyelim f dışbükey ve türevi alınabilir. Bu problem
için x’in çözüm olmasının şartı

∇f(x)T (y − x) > 0 ∀y ∈ C

eşitsizliğinin doğru olmasıdır. Yani 1. derece minimallik gradyan sıfırı verir, o


zaman herhangi bir ∇f(x)T (y − x) yönünde adım atmak bizi her zaman bu min-
imallikten uzaklaştırmalıdır. Bu durum her olurlu y ∈ C için doğru ise minimal
yerdeyiz demektir [2, 05:50]. Ya da şöyle anlatalım, x noktasındayız, y noktasına
gitmeyi düşünüyoruz. O zaman y − x vektörünü oluşturuyoruz, ve su soruyu
soruyoruz, “kriter fonksiyonunun gradyanı aynı çizgi de mi?”. Eğer aynı yönde
ise o yönde hareket etmek kriter f(x)’i arttırır. Yani eğer gradyan her mümkün
olurlu yön ile aşağı yukarı aynı yönü gösteriyorsa (azaltma / çoğaltma, -90/+90
derece bağlamında) o zaman minimum noktadayız demektir.

İşte bunu altgradyan perspektifinden ispatlayabiliriz [2, 06:33].


Üsttekini altgradyan perspektifinden ispatlayabiliriz. Önce problemimizi sınırsız
bir formatta tekrar tanımlayacağız. Sınırlamayı bir gösterge IC haline getirerek
bunu yapabiliriz,

min f(x) + IC (x) (2)


x

ki IC (x) = 0 eğer x, C kümesi içindeyse, dışındaysa sonsuzluk. Şimdi üstteki


fonksiyona altgradyan optimalliği uygulayalım, eğer üstteki fonksiyonu mini-
mize eden bir nokta varsa elimde, bunun tercümesi sıfırın o noktada fonksiyonun
altgradyanı olması. Fonksiyonun altgradyanını hesaplayalım, kurallarımıza göre
iki dışbükey fonksiyon toplamının altgradyani o fonksiyonların ayrı ayrı altgradyan-
larının toplamı. f dışbükey, IC dışbükey (çünkü C kümesi dışbükey küme). f
pürüzsüz, o zaman x’te onun altgradyan kümesi sadece o noktadaki gradyan.
IC ’nin altgradyanı normal koni NC . O zaman

0 ∈ ∂(f(x) + IC (x))

⇐⇒ 0 ∈ ∇f(x) + NC (x)

olmalı, ya da

⇐⇒ −∇f(x) ∈ NC (x)

7
olmalı. Şimdi normal koniyi hatırlayalım, tanımı

NC (x) = {g ∈ Rn : gT x > gT y ∀y ∈ C

buna göre iki üstteki NC , g = −∇f üzerinden

⇐⇒ −∇f(x)T x > −∇f(x)T y ∀y ∈ C

olarak açılabilir. Ya da

⇐⇒ ∇f(x)T (y − x) > 0 ∀y ∈ C

Üstteki 1. derece optimallik şartına benziyor zaten. −∇f(x) üstteki tanımın bir
öğesidir, o zaman 0 altgradyan kümesinin öğesidir.
İşte gayet temiz bir şekilde optimallik ispatı yapmış olduk. Bu arada sınırlama
içeren optimizasiyon problemi için alttaki tanım

0 ∈ ∂f(x) + Nc

ifadesi her nasılsa tamamen genel, yani dışbükey bir problem tanımı için gerekli
ve yeterli bir şart çünkü hatırlarsak bahsettik ki tüm dışbükey problemleri (2) ya
da (3) formunda öne sürmek mümkün. Tabii üstteki formlea iş yapmak kolay
değildir, çünkü NC ile çalışmak zor. Eğer C çetrefil bir küme ise, mesela

C = {x : gi (x) 6 0, Ax = b}

gibi, o zaman normal koniyi oluşturmak zor olacaktır. Yani iki üstteki tanımın her
zaman faydalı olduğunu söyleyemeyiz, ama her dışbükey problem için gerekli ve
yeterli şart olduğunu söyleyebiliyoruz.
Sonradan optimalliği tanımlamanın farklı bir yolunu göreceğiz. Sınırlama ifadeleri
olduğu zaman problemler daha az çetin / çözülür hale gelir, problemler sınırsız-
sınırlı halde birbirine eşit şekilde tanımlanabilirler, ama sınırlı tanımları çözmek
daha kolay. KKT koşulları burada devreye girecek. Yani her şeyi kritere tıkmak,
gösterge vs ile uğraşmak, altgradyan almak yerine bu tür tanımla çalışmak daha
rahat oluyor [2, 12:00].
Altgradyan optimalliğinin bazı diğer örneklerini görelim, mesela Lasso için alt-
gradyan optimalliği. Bazılarının bilebileceği üzere Lasso problemini parametrize
etmenin iki yolu vardır, birisi katsayılar üzerinde bir L1 norm kısıtlaması tanımlamak,
diğeri ise alttaki gibi onu kritere dahil etmek,

1
min ||y − Xβ||22 + λ||β||1 (5)
β 2

8
ki λ > 0. Altgradyan optimalliğinde sadece ve sadece alttaki şart geçerliyse elim-
izde bir çözüm var diyebiliyoruz, bu şart,

1
||y − Xβ||22 + λ||β||1

0∈
2

yani eğer 0 kriterimin altgradyan kümesinde ise. Üstteki altgradyanın uygu-


landığı toplam işaretinin iki tarafı da dışbükey o zaman onları altgradyanların
toplamı olarak açabilirim, ayrıca soldaki terim bir de pürüzsüz olduğu için tek
altgradyan normal gradyandır,

⇐⇒ 0 ∈ −XT (y − Xβ) + λ∂||β||1

⇐⇒ XT (y − Xβ) = λv (4)

herhangi bir v ∈ ∂||β||1 için. L1 norm’un altgradyanı için daha önce gördüğümüz
üzere bileşen bileşen bakmak gerekiyor, ve farklı şartlara göre parçalı bir fonksiyon
elde edeceğiz,

 {1} eğer βi > 0
vi ∈ {−1} eğer βi < 0

[ − 1, +1] eger βi = 0

Yeni öyle bir β arıyorum ki herhangi bir v vektörü için (4)’u tatmin edecek ve bu
v geçerli bir altgradyan olacak, yani üstteki şartlara uyacak. O zaman çözüme
erişmişim demektir. Çözümü şu anda vermiyoruz, bunlar çözüm için uyulması
gereken optimallik şartları [2, 15:24].
Her βi için üstteki denklemin nasıl oluşacağını görmek istersek, ve X1 , .., Xp değerleri
X matrisinin kolonları olacak şekilde

 T  
↑ ↑   ↑ ↑    
y β1 v1
  .1  
   

 X1 X2 . . .   ..  −  X1 X2 . . .
 ..  = λ  .. 
  

 .   . 
  yp   βp vp
↓ ↓ ↓ ↓

O zaman bunu her vi olasılığı için yazarsak, βi ’in sıfır olup olmadığı üzerinden
bir parçalı fonksiyon ortaya çıkartabiliriz. Altgradyan optimallik şartı,


XTi (y − Xβ) = λ · sign(βi ) eger βi 6= 0
|XTi (y − Xβ)| 6 λ eger βi = 0

9
haline geldi. İkinci satırı nasıl elde ettik? Eğer βi = 0 ise bu bana λv ifadesi −λ
ve +λ arasında herhangi bir yerde olabilir diyor (çünkü vi parçalı fonksiyonunda
βi = 0 ise vi -1 ve +1 arası herhangi bir değer dedik), ve −λ ve +λ arası olma
durumunu son satırdaki mutlak değer ifadesine tercüme edebiliriz.
Dikkat, üstteki ifade optimalliğe bakma / kontrol etmek için bir yöntem. Birisi
size bir vektör veriyor [2, 16:57], sonra soruyor “bu vektör Lasso kriterine göre
optimal midir?” Öyle olup olmadığına bakmak için vektörün her ögesine bakıyoruz,
ve üstteki kontrolü işletiyoruz. Eğer her öge optimal ise evet diyoruz, tek bir öğe
bile optimal değilse hayır diyoruz.
Üstteki parçalı formüldeki ikinci bölümü ilginç bir şekilde kullanabiliriz. Diyelim
ki 100 değişkenlik modeli Lasso ile veriye uydurduk, ve β katsayıları elde ettik,
bir regresyon yaptık yani. Diyelim ki çözümden sonra birisi geliyor size 101.
kolon veriyor, acaba tüm uydurma işlemini baştan tekrar mı yapmak lazım? Belki
hayır, |XT101 (y − Xβ)| 6 λ kontrolünü yaparız, eğer koşul doğru ise o zaman β100 =
0 demektir, ve bu katsayıya gerek yoktur, modelin geri kalanı değişmeden kalır
[2, 20:42].
Bir diğer ilginç uygulama Lasso’nun basitleştirilmiş hali; X = I yani birim matrisi
olduğu durum. Bu yaklaşımla bazılarının gürültü silme (denoising) dediği işlemi
yapabilmiş oluyoruz. X = I deyince Lasso’da geri kalan,

1
min ||y − β||22 + λ||β||1
β 2

Bu problem ifadesi diyor ki “öyle bir β vektörü bul ki y’ye olabildiği kadar yakın
olsun ve β üzerinde bir L1 cezası olsun”. Yana bana içinde bir sürü gözlem nok-
tası taşıyan bir y veriliyor ve ben bu gözlemleri en iyi şekilde yaklaşıklayan β’yi
arıyorum ve bu β’nin seyrek olmasını [2, 24:23] tercih ediyorum (L1 cezası ile
bu oluyor, büyük değerler cezalandırılınca çözü katsayının sıfıra yakın olmasını
özendirmiş oluruz). Artık biliyoruz ki üstteki problemi altgradyan optimalliği ile
çözmek mümkün.
Daha önce gördüğümüz Lasso altgradyan optimalliğini X = I için tekrar yazarsak


(y − βi ) = λ · sign(βi ) eger βi 6= 0
||y − βi || 6 λ eger βi = 0

Çözüm β = Sλ (y), ki Sλ (y)’ye yumuşak eşikleme (soft-threshold) operatörü deniyor.


Üstteki optimalliğe uyan bir çözüm, hatta tek çözüm, budur.

 yi − λ eğer yi > λi
[Sλ (y)]i = 0 eğer − λ > yi > λ, i = 1, .., n

yi + λ eğer yi < −λi

Çözümün optimallik şartlarına uyup uymadığı rahatça kontrol edilebilir. Formülde

10
β = Sλ (y) diyerek alttakilerin doğru olup olmadığına bakarız,
Eğer yi > λ, βi = yi − λ > 0 ise yi − βi = λ = λ · 1 mı?
Eğer yi < −λ ise benzer şekilde
Eğer |yi | > λ, βi = 0 ise |yi − βi | = |yi | > λ mi?
[distance to convex set örneği atlandı]
Daha önce gradyan inişi (gradient descent) algoritmasını görmüştük, bu algo-
ritma çok basittir. Şimdi işleri biraz daha zorlaştıracağız [2, 48:00]. Bu metotun
bir dezavantajı optimize edilen f’nin türevi alınabilir bir fonksiyon olma zorun-
luluğu. Diğer bir dezavantaj yakınsamanın uzun zaman alabilmesi.
Altgradyan Metodu
Gradyan inişi yapısına benziyor, f’in dışbükey olması ve dom(f) = Rn olması
lazım, ama f’nin pürüzsüz olma zorunluluğu yok.
Gradyan inişi gibi özyineli bir şekilde, x(0) ’dan başlıyoruz, ve

x(k) = x(k−1) − tk · g(k−1) , k = 1, 2, 3, ..

adım atarak ilerliyoruz, öyle ki g(k−1) ∈ ∂f(x(k−1) ) yani f’nin x(k−1) noktasındaki
herhangi bir altgradyanı. Adım ata ata gidiyorum, her adımda mevcut altgradyan-
lara bakıyorum, herhangi birini seçiyorum, ona g(k−1) diyelim, ve x’i bu yönde
olacak şekilde bir tk ’ye oranlı olarak güncelliyorum [2, 49:50].
Altgradyan metotunun ilginç özelliklerinden biri her adımda iniş yapmanın garanti
olmaması (herhalde onun için “altgradyan inişi” yerine “altgradyan metotu” ismi
verilmiş). Bu sebeple adım atarken o ana kadar, yani x(0) , .., x(k) içinde olan en iyi
(k)
(best) (en minimal) noktayı hatırlamak gerekiyor, xbest , ki

(k)
f(xbest ) = min f(x(i) )
i=0,..,k

Eğer mesela altgradyan metotunun 100,000 adım işletmişsem erişilmiş minimal


nokta olarak bu hatırlanan en iyi noktayı sonuç olarak rapor ederim.
Adım büyüklüğü nasıl seçilir?
Sabit adım büyüklüğü seçmek bir seçenek. Küçükçe seçilen böyle bir büyüklük
işler.
Çokça kullanılan bir diğer seçenek “gittikçe yokolan” adım büyüklüğü. Bu tür
adım seçimi için kullanabilecek pek çok kural var, aranan bir nitelik sıfıra gidilmesi
ama çok hızlı gidilmemesi. Mesela tk = 1/k uygun. Altgradyanlarda geriye iz
sürmenin karşılığı yok.
Yakınsama analizi

11
Altgradyan metotunun yakınsama analizi gradyan inişinin analizinden biraz farklı
[2, 54:15]. Diyelim ki elimizde bir dışbükey fonksiyon f var ve tanım kümesi
herşey, dom(f) = Rn . Fonksiyon ayrıca Lipschitz sürekli, fonksiyonun sürekli
olduğunun söylemiyoruz dikkat, fonksiyon sabit G > 0 üzerinden Lipschitz
sürekli, yani

|f(x) − f(y)| > G||x − y||2 ∀x, y

Bunu baz alarak iki tane teori öne sürebiliriz, birisi sabit adım büyüklüğü, diğeri
azalan adım büyüklüğü için.
Yokolan adım büyüklüğü için iki şart tanımlayalım, “kare toplanabilir ama toplan-
abilir değil”, yani şu iki şart,

X
∞ X

t2k < ∞, tk − ∞
k=1 k=1

Şimdi iki teoriyi tanımlayabiliriz,


Teori 1
Sabitlenmiş t için altgradyan metotu alttaki şartı tanımlar,

(k)
lim f(xbest ) 6 f∗ + G2 t/2
k→∞

Üstteki ifade diyor ki eğer altgradyan metotunu sonsuza kadar işletirsek eldeki
en iyi noktadan elde edilecek fonksiyon değeri gerçek optimum artı Lipschitz
sabitinin karesi çarpı t/2’dan küçük olacaktır, ki t sabitlenmiş adım büyüklüğü.
Ama üstteki yine de çözüm için bir limit vermiyor. Onun için alttaki lazım,
Teori 2
Yokolan adım büyüklükleri için

(k)
lim f(xbest ) = f∗
k→∞

[ek detaylar atlandı]


Altgradyan metotuna bir örnek olarak [2, 1:01:36] regülarize edilmiş lojistik re-
gresyona bakabiliriz. β katsayılarını bulmaya uğraşıyoruz, ve veriye uydurma
bağlamında bir kayıp fonksiyonunu minimize etmeye uğracağız. Önce normal
regresyon,

X
n
−yi xTi β + log(1 + exp(xTi β)

f(β) =
i=1

12
Üstteki pürüzsüz ve dışbükey bir fonksiyon.

X
n
∇f(β) = (yi − pi (β))xi
i=1

ki pi (x) = exp(xTi β)/(1 + exp(xTi β)), i = 1, .., n.


Regülarize edilmiş lojistik regresyon

min f(β) + λ · P(β)


β

ki P(β) = ||β||22 olabilir (Ridge cezası) ya da P(β) = ||β|1 | (Lasso cezası). Bu


cezalardan ilki pürüzsüz, diğeri değil. Böylece birinde gradyan inişi diğerinde
altgradyan metotu kullanmak zorunda olacağız.
Ekler
Alttaki örnek [3]’ten,

1X T
N
min F(w) = (x w − yi )2 + λ||w||1
w 2 i=1 i

gibi bir Lasso örneği var.

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

def subgrad(w):
return X.T*(X*w-y) + lamda*np.sign(w)

def obj(w):
r = X*w-y;
return np.sum(np.multiply(r,r))/2 + lamda * np.sum(np.abs(w))

N = 40
dim = 10
max_iter = 200
lamda = 1/np.sqrt(N);
np.random.seed(50)
w = np.matrix(np.random.multivariate_normal([0.0]*dim, np.eye(dim))).T
X = np.matrix(np.random.multivariate_normal([0.0]*dim, np.eye(dim), size = N))
y = X* w

w = np.matrix([0.0]*dim).T
obj_SD = []
gamma = 0.01
for t in range(0, max_iter):
obj_val = obj(w)

13
w = w - gamma * subgrad(w)/np.sqrt(t+1)
obj_SD.append(obj_val.item())
if (t%5==0): print('iter= {},\tobjective= {:3f}'.format(t, obj_val.item()))

print (w)

iter= 0,objective= 169.279279


iter= 5,objective= 24.721959
iter= 10,objective= 13.195682
iter= 15,objective= 8.739994
iter= 20,objective= 6.419780
iter= 25,objective= 5.034598
iter= 30,objective= 4.138547
iter= 35,objective= 3.526977
iter= 40,objective= 3.093047
iter= 45,objective= 2.775883
iter= 50,objective= 2.538530
iter= 55,objective= 2.357443
iter= 60,objective= 2.217031
iter= 65,objective= 2.106647
iter= 70,objective= 2.018829
iter= 75,objective= 1.948229
iter= 80,objective= 1.890943
iter= 85,objective= 1.844077
iter= 90,objective= 1.805447
iter= 95,objective= 1.773392
iter= 100,objective= 1.746629
iter= 105,objective= 1.724158
iter= 110,objective= 1.705193
iter= 115,objective= 1.689110
iter= 120,objective= 1.675411
iter= 125,objective= 1.663694
iter= 130,objective= 1.653633
iter= 135,objective= 1.644963
iter= 140,objective= 1.637466
iter= 145,objective= 1.630964
iter= 150,objective= 1.625306
iter= 155,objective= 1.620369
iter= 160,objective= 1.616050
iter= 165,objective= 1.612262
iter= 170,objective= 1.608931
iter= 175,objective= 1.605996
iter= 180,objective= 1.603403
iter= 185,objective= 1.601108
iter= 190,objective= 1.599073
iter= 195,objective= 1.597264
[[-1.53942055]
[-0.02366012]
[-0.61081721]
[-1.43597808]
[ 1.3626909 ]
[-0.47342589]
[-0.78826118]
[ 1.04965236]
[-1.27159815]
[-1.32969646]]

14
Bir diğer örnek [4]’ten, burada kodlanan (5)’teki formül aslında, kodun sembol-
lerini kullanırsak,

1
min ||Ax − b||2 + λ||x||1
x 2

L1 normu ||x||1 gradyan inişi için problemli o sebeple altgradyan metotu kul-
lanacağız. Veri olarak [5]’te görülen diyabet verisini alabiliriz,

import scipy.io as sio


import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import numpy.linalg as lin

def subgrad_func(A,b,lam):
n2 = A.shape[1]
x = np.zeros((n2,1))
k=1
g = np.ones((n2,1))
t = 0.01
f = []
while True:
if k>3:
crit = np.abs(f[k-2]-f[k-3])/f[k-2]
if crit < 1e-5: break
tmp = 0.5*lin.norm(np.dot(A,x)-b,2)**2+lam*lin.norm(x,1);
if k%10==0: print (tmp)
f.append(tmp)
s = x.copy()
s[x>0]=1
s[x<0]=-1
if len(s[x==0])>0:
s[x==0] = -2*np.random.rand(len(x==0))+1
g = np.dot(A.T,np.dot(A,x)-b) + lam*s
x = x - t*g
k = k+1
return x

diabetes = pd.read_csv("../../stat/stat_120_regular/diabetes.csv",sep=';')
y = np.array(diabetes['response'].astype(float)).reshape(442,1)
A = np.array(diabetes.drop("response",axis=1))

lam = 0.1;
x = subgrad_func(A,y,lam);
print ('x')
print (x)

6167530.253256479
6017359.332614086
5936043.378499364
5887955.958919385
5856837.417105291
5835069.931049544

15
5818932.590413047
5806489.16976122
5796653.745550204
5788760.388544399
5782366.953999686
5777155.717300746
5772889.40103409
5769385.329280358
5766499.620202982
5764117.531938736
5762146.838816163
5760513.025122407
5759155.660694774
5758025.5987459235
5757082.775086282
5756294.462375693
5755633.876252789
x
[[ 5.34807751]
[-200.87752927]
[ 490.9420537 ]
[ 304.14877939]
[ -43.03872491]
[-107.97583692]
[-207.47086585]
[ 127.15527296]
[ 410.70880916]
[ 115.41867007]]

Bir dışbükey kümesi üzerinden tanımlı ama pürüzsüz olmayabilecek bir dışbükey
fonksiyonu minimize etmek için yansıtılan altgradyan (projected subgradient)
metotu adlı bir metot ta kullanılabilir [2, 22:04].
Dışbükey f’yi dışbükey küme C üzerinden optimize etmek için

min f(x) öyle ki x ∈ C


x

 
(k−1)
x(k) = PC x(k−1) − tk gk

Bu metot normal altgradyan metotu gibi, tek fark parantez içinde görülen alt-
gradyan adımı atıldıktan sonra elde edilen sonucun C kümesine geri yansıtılması
(projection), çünkü atılan adım sonucunda olurlu bir sonuç elde etmemiş olabili-
riz.
Yakınsama analizi normal altgraydan metotuna benziyor, bu metotla da benzer
yakınsama garantisi elde edilebiliyor, yakınsama oranı da buna dahil.
Yansıtma adımı bazen zor olabilir, hangi durumlarda kolay olduğunun listesi
aşağıda [2, 23:53]. Hangi kümelere yansıtmak kolaydır?
1) Doğrusal görüntüler: {Ax + b : x ∈ Rn }

16
2) {x : Ax = b} sisteminin çözüm kümesi
3) Negatif olmayan bölge: Rn + = {x : x > 0}. Verilen vektörün negatif değerlerinin
sıfır yapmak, pozitifleri tutmak bize o vektörün negatif olmayan bölge karşılığını
veriyor.
4) Bazı norm topları {x : ||x||p 6 1}, p = 1, 2, .., ∞ için. Daha önce 2-norm topuna
yansıtmayı gördük, vektörü alıp normalize edersek bu kümeye yansıtma yapmış
oluyoruz aslında. Bu yansıtma bizi o vektörün 2-norm topundaki en yakın diğer
vektöre götürüyor. Sonsuz norm kolay, bir kutuya yansıtma yapmış oluyoruz,
bunun ne demek olduğunu düşünmeyi size bırakıyorum, 1-norm en zoru.
5) Bazı çokyüzlüler (polyhedra) ve basit koniler.
Bir uyarıda bulunalım, tanımı basit duran kümeler ortaya çıkartmak kolaydır,
fakat bu kümelere yansıtma yapan operatörler çok zor olabilir. Mesela gelişigüzel
bir çokyüzlü C = {x : Ax 6 b} kümesine yansıtma yapmak zordur. Bu problemin
kendisi apayrı bir optimizasyon problemi aslında, bir QP.
[stochastic subgradient method atlandı]
Altgradyanların iyi tarafı genel uygulanabilirlik. Altgradyan metotları dışbükey,
Lipschitz fonksiyonları üzerinde bir anlamda optimaldir. Ünlü bilimci Nesterov’un
bu bağlamda bir teorisi vardır [2, 45:12], pürüzsüz durumlarda ve 1. derece
yöntemlerde altgradyanların lineer kombinasyonları üzerinden güncellemenin
sonucu olan adımların başarısına bir alt sınır tanımlar.
Kaynaklar
[1] Tibshirani, Convex Optimization, Lecture Video 6, https://www.youtube.
com/channel/UCIvaLZcfz3ikJ1cD-zMpIXg
[2] Tibshirani, Convex Optimization, Lecture Video 7, https://www.youtube.
com/channel/UCIvaLZcfz3ikJ1cD-zMpIXg
[3] He, IE 598 - BIG DATA OPTIMIZATION, http://niaohe.ise.illinois.
edu/IE598_2016/
[4] Feng, Lasso, https://github.com/fengcls/Lasso
[5] Bayramlı, Istatistik, Regresyon, Ridge, Lasso, Çapraz Sağlama, Regülarize Etmek

17
Proksimal / Yakınsal Gradyan Metotu (Proximal Gradient Method)
Bu metot, herhangi bir pürüzsüz olmayan fonksiyonu optimize etmeye uğraşmak
yerine belli bir yapıya uyan çetrefil fonksiyonları optimize etmeye uğraşır. Bu
yapı

f(x) = g(x) + h(x) (1)

formundadır [1, 45:59]. g, h’in ikisi de dışbükey. g’nin pürüzsüz, türevi alınabilir
olduğu farz edilir (çoğunlukla oldukca çetrefil olabilir) ve dom(g) = Rn , h ise
pürüzsüz olmayabilir. Tabii pürüzsüz artı pürüzsüz olmayan iki fonksısyon toplamı
kriterin tamamını pürüzsüz olmayan hale çevirir. Ama bu toplam daha basittir
denebilir, onun üzerinde proksimal operatörü uygulanabilir.
Hatırlarsak eğer f türevi alınabilir olsaydı gradyan iniş güncellemesi

x+ = x − t · ∇f(x)

Bu formüle erişmenin bir yöntemi karesel yaklaşıklama üzerinden idi, f’nin x


etrafındaki yaklaşıklamasında ∇2 f(x) yerine t1 I koyunca,

1
x+ = arg min f(x) + ∇f(x)T (z − x) + ||z − x||22
x
| {z 2t }
ft (z)

elde ediliyordu. Yani gradyan inişi sanki ardı ardına geldiği her noktada bir kare-
sel yaklaşıklama yapıyor, ve onu adım atarak minimize etmeye uğraşıyor.
Ama (1)’deki f pürüzsüz değil, o sebeple üstteki mantık ise yaramayacak. Fakat,
belki de karesel yaklaşıklamanın bir kısmını hala kullanabiliriz, ve minimizasy-
onu sadece g’ye uygularız çünkü pürüzsüz olan kısım o. Yani niye g’nin yerine
karesel yaklaşıklama koymayalım? Şimdi bunu yapacağız [1, 50:10].

x+ = arg min g̃t (z) + h(z)


z

ki g̃t (z) g’nin x noktası etrafındaki karesel yaklaşıklaması oluyor. Eğer elimizde
h olmasaydı üstteki sadece bir gradyan güncellemesine indirgenebilirdi. Neyse
açılımı yaparsak

1
= arg min g(x) + ∇g(x)T (z − x) + ||z − x||22 + h(z)
z 2t

Daha uygun bir formda yazabiliriz, z’nin g üzerindeki değişikliğe karesel uzaklığı
olarak,

1
1  2
= arg min z − x − t∇g(x) 2 + h(z)
z 2t
Yani söylenmek istenen, hem sadece g olsaydı atacağımız gradyan adımına yakın
durmaya çalışmak, hem de h’nin kendisini ufak tutmak. Dışarıdan ayarlanan t
parametresi g gradyan adımı ile h arasında bir denge kurmak gibi görülebilir,
eğer t ufak ise o zaman gradyan adımına yakın durmaya daha fazla önem atfetmiş
olacağız, h’nin ufak tutulmasına daha az. t çok büyük ise tam tersi olacak.
Bu aslında kabaca Proksimal Gradyan İnişi yöntemini tarif etmiş oluyor. Şimdi
proksimal eşlemesi operatörünü göstereceğiz, ki bu algoritmaları daha temiz olarak
yazmamıza yardımcı olacak.
Bir h fonksiyonu için bir prox operatörü tanımlıyoruz,

1
proxt (x) = arg min ||x − z||22 + h(z) (3)
z 2t

Üstteki x’in bir fonksiyonu olarak arg min’de gösterilen kriteri minimize eden
z’yi buluyor. Operatör t’ye bağlı, dışarıdan verilen parametre. Tabii ki h’ye de
bağlı, ki bazen üstteki operatörü proxh,t olarak gösteren de oluyor.

Üstteki ifadenin eşleme olduğunu kontrol edelim. Ciddi tanımlı bir fonksiyon
üstteki değil mi? Ona bir x veriyorsunuz, o da size tek bir sonuç döndürüyor.
Ayrıca bu eşleme / fonksiyonun kendisi bir minimizasyon. Peki bu minimiza-
syon problemi dışbükey mi? Evet. Peki bu problemin özgün bir sonucu var
mıdır? Vardır çünkü üstteki problem harfiyen dışbükey. Değil mi? Eğer h harfiyen
dışbükey olmasa bile ifadenin tümü harfiyen dışbükey olurdu çünkü 2t 1
||x − z||22
harfiyen dışbükey [1, 55:09], z−x’in karesi var [ayrıca x değişkeni h’ye geçilmiyor].
Yani harfiyen dışbükey, o zaman özgün sonuç var. Biz de bu özgün sonucu alarak
bir iniş algoritması yazıyoruz [1, 56:28],

x(k) = proxtk x(k−1) − tk ∇g(x(k−1) ) ,



k = 1, 2, ... (2)

Güncelleme adımını tanıdık şekilde yazmak için

x(k) = x(k−1) − tk · Gtk (x(k−1) )

ki Gt ’ye f’nin genelleştirilmiş gradyanı denebilir,

x − proxt (x − t∇g(x))
Gt (x) =
t
G’nin dışbükey fonksiyonların alışılageldik gradyanlarına benzer pek çok özelliği
vardır, ki bu özellikler proksimal metotların yakınsadığıyla alakalı ispatlarda kul-
lanılabilir.

2
Şimdiye kadar anlattıklarımıza bakanlara bu komik bir hikaye gibi gelebilir. Bir
g + h toplamını minimize etmek istiyordum, bunu yapabilmek için (2) formunda
adımlar atacağım, bir prox operatörüm var, ama bu operatör bir sonuç döndürüyor
aslında, ve bu sonuç bir başka minimizasyondan geliyor. Yani g + h türü bir
toplam minimizasyonu yerine her adımda, bir sürü minimizasyonları koymuş
oldum. Bu nasıl daha iyi bir sonuç verecek ki?
Şunu belirtmek lazım, sadece eğer proksimal gradyanları analitik, ya da hızlı bir
şekilde hesaplayabiliyorsak onları çözüm için düşünürüz. Yani her ne kadar her
adımda (3) turu optimizasiyonlar yapıyorsak ta, bunu pürüzsüz olan kısım h
yeterince basit olduğu zaman yapıyoruz ki tüm (3) için analitik ya da hızlı hesap-
sal çözüm olsun [1, 58:54].
Diğer noktalar, dikkat edersek proksimal operatör g’ye bağlı değil, tamamen h
bazlı. Eğer h basit ise ama g müthiş çetrefil ise bu proksimal hesaplarını çok
zorlaştırmıyor. Eğer o çok çetrefil (ve pürüzsüz) g için gradyan hesaplanabiliy-
orsa, durumu kurtardık demektir.
Tekrar bir Lasso problemi göreceğiz. Bu Lasso için gördüğümüz ikinci algoritma,
ve belirtmek gerekir ki Proksimal metot altgradyan metotuna göre çok daha ver-
imlidir, hızlıdır.
Verili bir y ∈ Rn , X ∈ Rn×p için Lasso kriterini hatırlarsak,

1
f(β) = ||y − Xβ||22 + λ||β||1
2
Kriterdeki ilk terim en az kareler kayıp fonksiyonu, ikinci terim bir ayar parame-
tresi üzerinden katsayıların 1. normu. Bu kriteri pürüzsüz, ve pürüzsüz olmayan
ama basitçe olan iki kısma ayıracağız, yani zaten oldukca bariz, pürüzsüz kısım 1.
terim, g(β) diyelim, olmayan 2. terim, h(β) diyelim. Proksimal gradyan inişi için
bize iki şey gerekiyor, birincisi g’nin gradyanı, ikincisi h için prox operatörünü
hesaplayabilmek.
g’nin gradyanı oldukca basit, onu bu noktada uykumuzda bile bulabiliyor ol-
mamız lazım. h’nin prox operatörü,

1
proxt (β) = arg min ||β − z||22 + λ||z||1
z 2t
Her şeyi t ile çarparsam,

1
proxt (β) = arg min ||β − z||22 + λt||z||1
z 2

Üstteki minimizasyonun çözümünü daha önce altgradyanlar üzerinden görmüştük,

= Sλt (β)

3
Yine yumuşak eşikleme (soft-threshold) operatörüne gelmiş olduk,

 βi − λ eğer βi > λi
[Sλ (β)]i = 0 eğer − λ > βi > λ, i = 1, .., n

βi + λ eğer βi < −λi

Tüm algoritma neye benziyor? Önce g’ye göre bir graydan güncellemesi ya-
parım, gradyan

∇g(β) = −XT (y − Xβ)

O zaman güncelleme

β + tXT (y − Xβ)

olur. Buna prox uygularsak,

β+ = Sλt (β + tXT (y − Xβ))

Yumuşak eşikleme ne yapar? Her ögeye teker teker bakar, eğer mutlak değeri
çok ufaksa onu ya sıfıra eşitler, ya da onu λ · t kadar sıfıra yaklaştırır.
Üstteki Lasso algoritmasina ISTA adı da verilir.
Geriye Çizgisel İz Sürme (Backtracking line search)
Graydan inişinde görmüştük ki adım büyüklüklerini dinamik olarak seçebiliyorduk,
her adımdaki duruma adapte olabiliyorduk, tipik olarak Lipschitz sabitini bilmiy-
oruz çünkü. O sebeple geriye iz sürme pratikte iyi işlemesiyle beraber, teorik
olarak yakınsamayı da garantiliyordu.
Proksimal gradyanları için benzer bir kavram geçerli. Ayrıca proksimal durumda
geriye doğru iz sürmenin birden fazla yolu var [1, 1:10:23]. Ben sadece g üzerinde
işlem yapan bir yöntem seçtim, çünkü bu metotu hatırlaması daha kolay. Gradyan
inişi için iz sürmeyi hatırlarsak, x noktasındayız diyelim ve x − t∇g yönünde git-
mek istiyoruz, o zaman alttakinin doğru olup olmadığını kontrol ediyorduk,

t
f(x − t∇f(x)) > f(x) − ||∇f||22
2

Proksimal gradyan için benzer bir yöntem [1:11:57], ve G üzerinde işlem yapıyoruz
dikkat, h değil, yani G üzerinden yeterince “iniş” yapmaya uğraşacağız, g + h
değil. Normal iz sürmede üsttekinin doğruluğunu kontrol ediyoruz, doğru ise
t’yi belli bir ölçüde ufaltıyoruz. Doğru değilse yani yeterince iniş yaptıysak, o
zaman eldeki değerlerle güncellemeyi yapıyoruz.

4
t
g(x − tGt (x)) > g(x) − t∇g(x)T Gx (x) + ||Gx (x)||22
2

Yani gradyan güncellemesi 1. derece Taylor güncellemesinden geldi. Üstteki


ifadede de eğime ek olarak 1. derece Taylor güncellemesine göre de yeterince
iniş yapmış olmak istiyorum. Dikkat edersek eğer G yerine g’nin gradyanını ko-
yarsam, iki üstteki formüle benzer bir formül elde ederim.
Geriye iz sürme genel algoritmasi şöyle, bir 0 < β < 1 paremetresi var (dışarıdan
ayarlanan bir parametre). t = 1 ile başlıyoruz, ve üstteki formülü işletiyoruz,
eğer gerekiyorsa t = βt ile küçültme yapıyoruz. İz sürme bitince bulduğumuz t
ile güncelleme yapıyoruz [3, 07:35].
[bazi ek detaylar atlandi]
Matris Tamamlamasi
Şimdi prox operatörü sofistike olan bir örnek görelim [3, 11:38]. Buradan çıkan
algoritma ilginç olacak.
Bize bir Y ∈ Rm×n matrisi veriliyor ama biz sadece bu matrisin bazı öğelerini
görebiliyoruz, bu öğeler Yi,j , (i, j) ∈ ω ile belirtiliyor ki ω belli bir indis kümesidir.
Bu problem bir tavsiye sistemi olabilir, matrisin tamamı bir ideal müşteri / ürün
eşlemesidir, biz sadece bu matrisin belli bir kısmını görüyoruz (tipik olarak mev-
cut müşterilerin tarihi veride yaptığı alımlar, ürünler üzerindeki beğendi/beğenmedi
yorumları matrisin “görünen” kısmını temsil edebilir).
Bu tür problemleri iz norm regülarizasyonu (trace norm regularization) prob-
lemi olarak görmenin iyi işlediği görülmüştür. Bu problem aslında daha önce
gördüğümüz Lasso problemine benzer, onun matrisler için olan formudur bir
açıdan. Problem,

1 X
min (Yij − Bij )2 + λ||B||tr (4)
B 2
(i,j)∈ω

ki ||B||tr iz (ya da nükleer) normudur,

X
r
||B||tr = σi (B)
i=1

ile gösterilir, r kertedir, r = rank(B), ve herhangi bir X matrisi için σ1 (X) > .. >
σr (X) > 0, X’in eşsiz (singular) değerleridir.
Minimizasyon ifadesindeki ilk toplam, B’deki değerleri zaten görülen, bildiğimiz
değerlere Y’ye karesel kayıp yakın tut diyor, ve ona bir ayar parametresi üzerinden
B’nin iz normunu ekliyoruz, bu istatistiki bağlamda bir tür regülarizasyon yapmış
oluyor. Eğer bu ek olmsaydı problem kötü konumlanmış (ill-posed) olurdu [3,
15:06]. Eğer o terim olmasaydı ve λ sıfır olsaydı o zaman optimizasyon B’yi Y’ye

5
eşitlerdik, oldu bitti derdik, ama o zaman hiçbir iş yapmamış olurduk. Sağdaki
terim ekiyle yapmaya uğraştığımız Y’ye olabildiğince yakın bir B seçmek ve bu
B’nin düşük kerte olmasını zorlamak. Bu bir regülarizasyon yöntemi, diyelim B
şu şekilde

B = |{z}
|{z} VT
U |{z}
m×n m×k k×n

yani B’yi güya oluşturan birer U, V’nin boyutlarındaki k’nin olabildiğince düşük
olmasını istiyoruz.
Bir diğer bakış açısı, daha önceki Lasso’yla ilintilendirmek bağlamında, iz normu
L1-normun matrisler için olan versiyonu olarak görmek. Eğer elimde bir köşegen
matris olsaydı iz köşegendeki öğelerin (tek öğeler onlar) toplamı olurdu, ki bu
bir vektörün 1-norm’unu almak gibi değil mi? Eğer köşegeni bir vektör gibi
görürsem, ve matriste bu vektörden başka bir şey yoksa.. bağlantıyı görüyoruz
herhalde.
Bir anlamda ||B||tr B matrisinin kertesini yaklaşıksal olarak temsil ediyor çünkü
kerte bir matrisin sıfır olmayan eşsiz değerlerinin sayısıdır. ||B||tr tabii ki eşsiz
değerlerinin sayısı değil onların kendilerinin toplamı, ama yaklaşıksal olarak kul-
lanabileceğimiz bir şey bu y [3, 17:49] , çünkü değer toplamı dışbükey [altgradyan,
türevi alınabildiği için bu yaklaşıklık seçilmiş herhalde]. (4) problemi tamamen
dışbükey bu arada, ilk terim dışbükey, ve ikinci terim düzgün bir norm’dur o
zaman dışbükeydir.
Bilimciler proksimal gradyan kullanmadan önce bu problem zor bir problemdi.
Optimizasiyon problemi bir yarı kesin (semidefinite) program olarak tanımlanır.
Eskiden bu tür problemleri iç nokta teknikleri ile çözüyorduk, ve bu teknikler
üstteki gibi problemler üzerinde oldukca yavaştır.
Devam edelim, problemi şöyle hazırlarız, bir yansıtma operatörü PΩ tanımlayalım,
gözlenen kümeye yansıtma yapacağız,


Bij (i, j) ∈ Ω
[PΩ (B)]ij =
0 (i, j) ∈
/Ω

Bu operatörün yaptığı verilen bir matrisin gözlem olmayan her öge için değeri
sıfır yapmak, yoksa olduğu gibi bırakmak. Simdi kriteri yazabiliriz,

1
f(B) = ||PΩ (Y) − PΩ (B)||2F + λ||B||tr
|2 {z } | h(B)
{z }
g(B)

Problemi proksimalin beklediği g + h formuna soktuk. Hatırlatalım, g dışbükey


ama pürüzsüz değil. Bu yaklaşım için gerekenler neydi? Pürüzsüz kısım için

6
gradyan hesaplayabilmek, ve pürüzsüz olmayan kısım için prox operatörünü
hesaplayabilmek. Gradyan oldukca basit,

∇g(B) = −(PΩ (Y) − PΩ (B)) (8)

Sadece işaretleri biraz değiştirdim çünkü onu sonra gradyandan çıkartacağız, o


sebeple parantez dışında bir eksi işareti olması faydalı. Şimdi ikinci terim için
prox operatörünü görelim.

1
proxt (B) = arg min ||B − Z||2F + λ||Z||tr (5)
Z 2t
Tüm mümkün Z matrisleri üzerinden minimizasyon yapıyoruz, ve Bi ile Zi arasındaki
tüm farkların kare toplamlarını alıyoruz, artı bir sabit çarpı Z’nin iz normu. Yani
optimizasyon hedefi Z, ve bu minimizasyonu prox operatörünü B üzerinde uygu-
layarak elde ediyoruz [3, 22:15].
Üstteki ifadeyi hesaplamak için altgradyan matematiğine inmek gerekiyor biraz.

proxt (B) = Sλt (B)

Yani prox’u λ seviyesinde bir matriste yumuşak eşikleme olarak görmek mümkün.
Yani aynen 1-norm’un prox operatörünün vektörsel yumuşak eşikleme olduğu
gibi burada matris seviyesinde bir eşikleme var [3, 22:46]. Bu demektir ki her-
hangi bir matris B’nin prox operatörü için B’nin SVD’sini alıyoruz, yani B =
UΣV T diyoruz, ve köşegen matris Σ üzerinde yumuşak eşikleme işletiyoruz, bunu
yapmak için ya köşegendeki her ögeden λi çıkartıyoruz ve eğer pozitifse o değeri
kullanıyoruz, ya da sıfır alıyoruz.

Sλ (B) = UΣλ V T

(Σλ )ii = max{Σii − λi 0}

Sλ (B) normal B’den daha düşük kerteli olacaktır, çünkü üstteki işlem ile Σλ ’nin
köşegenindeki bazı değerler sıfırlanır, ve bu matris ile hesaplanan UΣλ V T , çarpım
sırasında U, V’deki bazı satırlar, kolonları da sıfırlar [3, 26:00].
Peki proxt (B) = Sλt (B) nereden geliyor? Prox operatörünü oluşturan kriterin
(5) altgradyanını alırız, sıfıra eşitleriz, ve ortaya çıkan formülü doğrulayan Z’yi
buluruz. Cevabın ne olacağını biliyoruz, sadece tarif edilen altgradyan vs sonrası
aynı formülü bulup bulmayacağımızı kontrol edeceğiz.
(5)’teki ilk terim puruzsuz, direk gradyan alinir,

0 ∈ Z − B + λt · ∂||Z||tr (7)

7
İz normunun altgradyanını gösterelim,

∂||Z||tr = {UV T + W : ||W||op < 1, UT W = 0, WV = 0} (6)

Üstteki notasyon diyor ki aradığımız W’ler en büyük eşsiz değeri 1’den küçük
olan ve U’nun kolonlarına ve W’nin satırlarına dikgen olmalı. Yıne sonradan
doğrulama ile ispat yapılabilir, üstteki tanımı baz alarak Z = Sλt (B) olarak formüle
sokarsak sıfır sonucu aldığımızı göreceğiz. Ek bazı bilgiler, iz normu ve op normu
birbirinin ikizidir. Yani

||Z||tr = max Z · Y
||Y||op 61

Üstteki · işareti öğesel çarpım ve bu çarpımların toplamı anlamında. ||Y||op 6


1 şartına uyan tüm Y’lere bakıyorum, ve bu Y’lerle Z arasında ögesel çarpım
yapıyorum topluyorum bu bana Z’nin iz normunu veriyor.
Ya da

= max tr(ZT Y)
||Y||op 61

işlemi de aynı kapıya çıkar, bahsettiğimiz ikizlik sayesinde bu mümkün oluyor.


Devam edersek, üstteki bir max ifadesi ve bu ifadeleri altgradyanını almayı gördük,
üstteki ifade üzerinden, ||Y||op 6 1 şartına uyan tüm Y’ler içinden tr ZT Y maksi-
mumunu gerçekleştiren, eşsiz değerlerin toplamını / iz normunu veren Y’leri
istiyoruz. Ve (6) içindeki tüm U, V’lerin bunu yapabileceğini kontrol edebilirsiniz
[3, 31:56], Z SVD’sinden gelen U, V’lerin herhangi bir öğesel çarpımı size Z’nin
eşsiz değerlerinin toplamını verecektir, ve tasarım itibariyle onların operatör normu
en fazla 1’dır. UV T ’un operatör normu en fazla 1’dır, W için aynı şekilde, ve
her iki terim birbirine dikgen olacak şekilde tasarlanmıştır. Tüm bu matrislerin
||Z||tr ’in altgradyani olduğunu ispatlamanın yolu budur.
Neyse üsttekilerin bize altgradyan verdiğini ispatladıktan sonra Z = Sλt (B)’i
(7)’ye sokup ispatı tamamlıyoruz.
Bu oldukca zor bir prox operatörüydü tabii. Hesaplamanabilir olduğu anlaşıldığında
pek çok araştırmacı sevinmişti, pek çok yerde kullanıldı, vs. İspatı size ödev
olarak veriyorum ama rutin bir ödev sorusu olmadığını belirtmek isterim.
Artık algoritmayı oluşturabiliriz, g gradyanının negatif yönünde adım atıyoruz.
Gradyanı (8)’de görmüştük.
 
+
B = Sλt B + t(PΩ (Y) − PΩ (B))

Büyük parantez içini gradyan ile hesaplıyoruz sonra elde edileni yumuşak eşikten

8
geçiriyoruz. Bu ne demekti? Parantez içindekilerin SVD’sini al, eşsiz değeri
λt’den küçük olan tüm değerleri sıfırla, ve kalanlardan λt çıkar, ve bu yeni değerlerle
yeni bir matris yarat. Prox operatörünü uygulamak bu demek.
Bu arada pürüzsüz kısmımızdaki gradyan ∇g(B), L = 1 ile Lipschitz süreklidir.
(8)’deki ifade lineer, sabit 1 üzerinden tabii ki Lipschitz. Yakınsama analiz bil-
gimiz bize diyor ki proksimal gradyan inişinde adım büyüklüğü en fazla 1/L
olabilir, ki burada 1 sadece. Bu problemin güzel taraflarından biri bu, olabilecek
en büyük adım büyüklüğünü kullanabiliyoruz ve onu hesaplaması kolay, sadece
1.
Ve t = 1’i üstteki formüle sokuyoruz,
 
+
B = Sλt B + PΩ (Y) − PΩ (B)

elde ediyoruz. Formüldeki B − PΩ (B) bize görülmeyen kümedeki herşeyi veriyor


değil mi? B’de herşey var, PΩ (B)’de görülen kümedeki B öğeleri var (geri kalan-
lar sıfır), o zaman bu çıkartmayı yapınca görülmeyen kümedeki herşeyi elde ed-
eriz.
 
= Sλt PΩ (Y) + PΩC (B)

olarak yazabiliriz, PΩC (B), PΩ (Y)’in tamamlayıcısı (complement), görülmüş öğeler


için sıfır, görülmemiş ij öğeleri için Bij .
Algoritmanın mantığı çok doğal, her adımda tahminim PΩC (B)’a bakıyorum, bu-
rada olanların görülmemiş kümede ne yapacağımı kontrol etmesine izin veriyo-
rum, artı PΩ (Y) ile orijinal veride görülen öğeleri alıyorum.
Yani bir matris oluşturuyorum, görülen yerlerde Yij var görülmeyen yerlerde Bij
var. Sonra bu matrisi düşük kerteli hale getiriyorum, SVD’sini alıyorum, eşsiz
değerlerini işleyerek bazılarını sıfırlayıp tekrar matrisi oluşturuyorum yani. Ve
bu tarif edilenleri ardı ardına yapıyorum. Elde edileni yeni B yap, mevcut ol-
mayan ogeler icin bu matrisi kullan, vs.
Bu algoritmaya yumuşak atfetme (soft-impute) algoritmasi da deniyor, çünkü
her adımda kayıp değerleri “yüklüyoruz”, yaklaşık olarak atıyoruz, ve bunu
yumuşak bağlamda yapıyoruz, eşikleme ile yavaş yavaş kerteye düşürüyoruz.
Bu arada üstteki yaklaşım ilk bulunduğunda proksimal gradyan olduğu bilin-
miyordu. Bilimci yaklaşımı buluyor, hakkında makale yazıyor, sonra sonra maka-
leyi revize ederken birdenbire anlıyor ki bu metot proksimal gradyan. Daha önce
gördüğümüz İSTA da biraz böyle aslında, değil mi? Kendi başına durabilecek,
gayet doğal bir mantığı olan bir algoritma, sanki proksimal yapısı dışında da bu-
lunabilecek bir şey.
Devam edelim, algoritmadaki prox operatörü ne kadar pahalı? Her adımda SVD

9
işletmemiz lazım, bu İSTA’dan farklı. SVD oldukca pahalı bir işlemdir, özellikle
büyük matrisler için.
[atlandi]
Matris tamamlama böyle. Şimdi proksimal gradyan inişine kategorik olarak bakalım,
PGİ gradyan inişinin genelleştirilmiş halidir dedik. f = g+h kriterini çözüyorsak,
h = 0 ise normal gradyan inişini elde ederiz.
h = IC ise yansıtılan gradyan inişini elde ederiz.
g = 0 ise proksimal minimizasyon algoritmasini elde ediyoruz. Bu durumda
kriterde sadece pürüzsüz olmayan bir fonksiyon var, bu algoritma altgradyan
inişine bir alternatif olarak kullanılabiliyor.
Tabii üstteki tüm özel durumların da yakınsama oranı O(1/). Bunu biliyoruz
çünkü proksimal gradyanin teorik yakınsama oranı öyle [3, 48:30].
Ekler
Örnek kod, Lasso problem çözümü [2], pür proksimal gradyan inişi, iz sürme
yok

import pandas as pd
diabetes = pd.read_csv("../../stat/stat_120_regular/diabetes.csv",sep=';')
y = np.array(diabetes['response'].astype(float)).reshape(442,1)
X = np.array(diabetes.drop("response",axis=1))
N,dim = X.shape
print (N,dim)

lam = 1/np.sqrt(N);
w = np.matrix(np.random.multivariate_normal([0.0]*dim, np.eye(dim))).T

L = (np.linalg.svd(X)[1][0])**2
print(L)
max_iter = 500

def obj(w):
r = X*w-y;
return np.sum(np.multiply(r,r))/2 + lam * np.sum(np.abs(w))

def f_grad(w):
return X.T*(X*w-y)

def soft_threshod(w,mu):
return np.multiply(np.sign(w), np.maximum(np.abs(w)-mu,0))

w = np.matrix([0.0]*dim).T
for t in range(0, max_iter):
obj_val = obj(w)
w = w - (1/L)* f_grad(w)
w= soft_threshod(w,lam/L)
if (t % 50==0):
print('iter= {},\tobjective= {:3f}'.format(t, obj_val.item()))

10
print (w)

442 10
4.0242141761466925
iter= 0,objective= 6425460.500000
iter= 50,objective= 5751070.568959
iter= 100,objective= 5750285.357193
iter= 150,objective= 5749670.506866
iter= 200,objective= 5749177.635558
iter= 250,objective= 5748779.527464
iter= 300,objective= 5748457.810485
iter= 350,objective= 5748197.804952
iter= 400,objective= 5747987.670443
iter= 450,objective= 5747817.840900
[[ -8.71913404]
[-238.35531517]
[ 522.93302022]
[ 323.11825944]
[-526.09642955]
[ 265.58097894]
[ -17.84381222]
[ 143.15165377]
[ 652.14114865]
[ 68.55685031]]

Kaynaklar
[1] Tibshirani, Convex Optimization, Lecture Video 8, https://www.youtube.
com/channel/UCIvaLZcfz3ikJ1cD-zMpIXg
[2] He, IE 598 - Big Data Optimization, http://niaohe.ise.illinois.edu/
IE598_2016/
[3] Tibshirani, Convex Optimization, Lecture Video 9, https://www.youtube.
com/channel/UCIvaLZcfz3ikJ1cD-zMpIXg

11
Newton-umsu Metotlar (Quasi-Newton Methods), DFP, BFGS
Bir f hedef fonksiyonunun minimizasyonu için Newton metodunun özyineli al-
goritması

xk+1 = xk − F(xk )−1 gk

ki g gradyan, F ise Hessian.


Ya da

xk+1 = xk − (∇2 f(xk ))−1 ∇f(xk )

Newton’umsu metotların ana fikri Hessian matrisi yerine sadece gradyan bil-
gisini kullanarak yaklaşık bir Fk kullanmak, diyelim ki Hk . Sonra f(·)’un karesel
olarak temsilini yazalım, özyineli gidişat sırasında, bir herhangi bir xk+1 etrafında
Taylor açılımı

1
mk (x) ≡ f(xk+1 ) + ∇f(xk+1 )T (x − xk+1 ) + (x − xk+1 )T HTk+1 (x − xk+1 )
2

Eğer gradyanı alırsak

∇mk (x) = ∇f(xk+1 ) + H−1


k+1 (x − xk+1 )

Şimdi k ve k+1 noktaları, gradyanları üzerinden bir Hk+1 ilişkisi ortaya çıkartmak
istiyoruz ki çözüp bir sonuç elde edebilelim. Ek denklemler elde etmek için şu
akla yatkın şartları öne sürebiliriz, m ve f gradyanları birbirine uysun. Yani,

∇mk (x) = ∇f(xk )

O zaman, “Newton-umsuluk şartı (quasi-Newton condition)” da denen iki üstteki


denklemle beraber, ve açılımda x herhangi bir x olabileceği için onun yerine xk
kullanarak,

∇f(xk+1 ) + H−1
k+1 (xk − xk+1 ) = ∇f(xk )

H−1
k+1 (xk − xk+1 ) = ∇f(xk ) − ∇f(xk+1 )

H−1
k+1 (xk+1 − xk ) = ∇f(xk+1 ) − ∇f(xk )

Üsttekine sekant denklemi adı veriliyor, şu figürle alakalı,

1
Yani sekant denklemine göre H−1
k+1 değeri, yatay kordinattaki x
k+1
−xk değişimini,
gradyan değişimi ∇f(xk+1 ) − ∇f(xk )’e taşıyor / eşliyor [4].
Kısaltma amaçlı,

H−1
k+1 (x − x ) = ∇f(xk+1 ) − ∇f(xk )
| k+1{z k} | {z }
yk sk

H−1
k+1 yk = sk (1)

Özyineli bağlamda bir H0 ’dan başlayarak ufak değişimlerle sonuca ulaşılmaya


uğraşılır. Değişimlerin ufak olması gerekliliği üzerinden ve bu değişimlerin kerte
1 eki ile olması sonucu [4]’teki matris normu ile beraber aslında birazdan türeteceğimiz
güncelleme denklemi alınabiliyor. Kerte 1 eki konusu için bkz [5]. Biz farklı bir
yönden, eğer ufak değişim kerte 1 ve 2 ile yapılsa nereye varılacağına bakacağız
[1, sf. 111].
Kerte 1 eki ile Hk ’yi Hk+1 yapmak demek aslında

Hk+1 = Hk + czzT

demektir. Bunu iki üstteki formül içine koyarsak

sk = (Hk + czzT )yk = Hk yk + cz(zT yk )

zT yk bir skalar olduğu için

sk − Hk yk
cz =
z T yk

Bu denklemi çözen en basit c, z seçenekleri

z = sk − Hk yk

2
1
c=
zT y k

Bu bize kerte 1 güncelleme formülünü verir,

(s − Hk yk )(s − Hk yk )T
Hk+1 = Hk +
(s − Hk yk )yk

Ne yazık ki kerte 1 güncelemesinin bazı problemleri var. Bunlardan en önemlisi


güncelleme sonrası elde edilen yeni Hk+1 ’in pozitif kesin olmasının garanti olma-
ması, bu sebeple bir sonraki döngüde elde edilecek yön dk = −Hk ∇f(xk )’nin bir
iniş yönü olmasının garantisinin de tehlikeye girmesi.
Çözüm olarak Hk+1 ’in pozitif kesin kalmasını garantileyecek kerte 2 güncellemesi
keşfedilmiştir. Yani

Hk+1 = Hk + c1 z1 zT1 + c2 z2 zT2

Pozitif kesinliğin ispatı için [2, sf. 206].


Yine (1)’deki Newton-umsuluk şartıyla beraber

sk = Hk yk + c1 z1 (zT1 yk ) + c2 z2 (zT2 yk )

z1 ve z2 için özgün çözüm olmamasına rağmen üstteki denklemi tatmin edecek


seçenekler bulunabilir,

1 1
z 1 = sk , z2 = Hk yk , c1 = , c2 =
zT1 yk zT2 yk

Ve böylece kerte 2 güncellemesi şu hale gelir,

yk yTk (Hk yk )(Hk yk )T


Hk+1 = Hk + −
sTk yk (Hk yk )T yk

Bu formüle Davidon-Fletcher-Powell (DFP) formülü adı verilir.


Algoritma şöyle
1) k = 0 yap. Bir x0 ’dan başla, ve herhangi bir simetrik, pozitif kesin bir H0 al
2) Eğer sk = 0 ise dur, yoksa dk = −Hk gk
3) Şunu hesapla

αk = arg min f(xk + αdk )


α>0

3
xk+1 = xk + αk dk

4) Hesapla

yk = αk dk

sk = gk+1 − gk

yk yTk (Hk yk )(Hk yk )T


Hk+1 = Hk + −
sTk yk (Hk yk )T yk

BFGS
DFP ile kerte 2 güncellemesi oluyor böylece Hk+1 pozitif kesin kalıyor, güzel.
Fakat DFP’nin hala sayısal olarak bazı problemleri var. Burada problem Hes-
sian’ın değil Hessian’ın tersinin yaklaşıklamasının güncelleniyor olması. Daha
iyi bir seçim Hessian’ın kendisinin yaklaşıklamasının güncellenmesi ve onun üzerinden
bir terslik elde edilmesi olmaz mıydı? Evet.
Devam etmeden önce işimize yarayacak başka bir konu, ikizlik konusundan bahsede-
lim. Eğer DFP formülünün tersinin alırsak belli bir sonuç elde ederiz (bunun
benzerini yapacağız). Ama biz bu noktaya (1)’deki

Hk+1 yk = sk

ile geldiğimizi biliyoruz, ve üstteki formülde ufak bir takla atarsak

yk = Bk+1 sk

sonucuna gelebileceğimizi de biliyoruz, ki Bk , Fk ’nin yaklaşık hali. Dikkat ed-


ersek bu yeni Newton-umsuluk kuralı form olarak bir öncekine çok benziyor,
sadece Hk yerine Bk var ve yk , sk yerleri değişti! Bundan istifade edebiliriz, ve
şimdiye kadar yapılan tüm türetme işlemlerini kullanarak ve sadece yk , sk yerini
değiştirerek Bk için bir güncelleme formülü elde edebiliriz.

sk sTk (Bk sk )(Bk sk )T


Bk+1 = Bk + −
yTk sk (Bk sk )T sk

İşte Bk ’nin BFGS güncellemesi budur, isim Broyden, Fletcher, Goldfarb, and Shan-
non adlı araştırmacılardan geliyor. Şimdi üsttekinin tersini alırsak arka planda
yapılan ve daha stabil olan Hk ’nin güncellenmesinden faydalanmış oluyoruz,
ama hala her adımda bizim ilgilendiğimiz matris tersine erişmiş oluyoruz. Üstteki

4
formülün sağ tarafının tersi için [6]’daki Sherman-Morrison tekniğini kullanacağız.
SM formülü neydi?

(A−1 u)(vT A−1 )


(A + uvT )−1 = A−1 −
1 + vT A−1 u
eğer 1 + vT A−1 y 6= 0 ise.
Şimdi eğer ana güncelleme formülünü

Bk+1 = A0 + u0 vT0 + u1 vT1

formuna getirebilirsek SM kullanabiliriz. Şu eşitlikleri kullanalım,

sk
A0 = Bk , uo = T
, vT0 = sTk
sk yk

sk sTk Bk yk
A1 = Bk + T
= A0 + u0 vT0 , u1 = −
sk yk yTk Bk yk

vT1 = yTk Bk

Böylece

Bk+1 = A0 + u0 vT0 + u1 vT1

formülüne erişmiş olduk. Bu Bk+1 üzerinden bir ters elde etmek için, ki bu sonuca
HBFGS
k+1 diyelim,

HBFGS −1
k+1 = Bk+1

= (A1 + u1 vT1 )−1

SM açılımına göre,

A−1 T −1
1 u1 v1 A 1
= A−1
1 −
1 + vT1 A−1
1 u1

A−1
1 de SM ile açılacak tabii (onun için bu A1 ’i belli bir forma getirdik)

A−1 u vT A−1 A−1 u vT A−1


A−1 T −1 (A−1 0 0 0 0 T −1 0 0 0
0 − 1+vT A−1 u0 )u1 v1 (A0 − 1+vT A−1 u0 )
0
0 u 0 v0 A 0
HBFGS
k+1
−1
= A0 − − 0 0 0 0

1 + vT0 A−1 A−1 u vT A−1


0 u0 1 + vT (A−1 − 0 T0 0−1 0 )u1
1 0 1+v0 A0 u0

5
Dikkat edersek A0 = Bk . O zaman A−1 0 = B−1
k = Hk . Bu eşitliği ve ilk başta
gösterdiğimiz notasyonu kullanarak,

Hk sk sTk Hk −Bk yk yTk Bk


Hk sk sTk Hk (Hk − T T
yk sk +sk Hk sk
)(yTk Bk yk
)
HBFGS
k+1 = Hk − −
yTk sk + sTk Hk sk 1 + yTk Bk (H − k T
T
Hk sk sk Hk
T
−Bk yk yTk Bk
)( )
yk sk +sk Hk sk yTk Bk yk

Hk sk sTk Hk
×(Hk − )
yTk sk + sTk Hk sk

Bazı çarpımları yaptıktan sonra ve Hk = B−1


k olduğunu hesaba katarak, yani

Hk Bk = Bk Hk = In

diyerek, alttakini elde ediyoruz,

k k k H s sT
T k k k s sT H
Hk sk sTk Hk (1 − sT yk +sT H s )(−yk yk )(1 − sT y +sT H s )
HBFGS
k+1 = Hk − T T
− k k k k
Ts
k k k k k

sk yk + sk Hk sk T T s k
yk Bk yk + yk (Bk − sT yk +sT Hk sk )(−yk )
k
k k

Sembolik işlemlerimize devam ediyoruz. yk ve yTk çarparak alttakini elde ediy-


oruz,

H s sT yT yT s sT H
Hk sk sTk Hk ( sT ykk+s
k k k k k k k
T H s − yk )(xk − sT y +sT H s )
HBFGS
k+1 = Hk − T T
− k k k k k k k k k
T s sT y
sk yk + sk Hk sk T T y
yk Bk yk − yk Bk yk + sT ykk +sTkHkksk
k

k k

Üstte en son terimdeki bölendeki terimleri iptal edince ve daha fazla çarpma
işlemi yapınca,

Hk sk (sTk yk )(yTk sk )sk Hk


Hk sk sTk Hk sTk yk +sTk Hk sk yk yTk (sTk yk + sTk Hk sk )
HBFGS
k+1 = Hk − + + −
sk yk + sTk Hk sk (yTk sk )(sTk yk ) (yTk sk )(sTk yk )

Hk sk (sTk yk )yTk + yk sTk Hk


(yTk sk )(sTk yk )

3. ve 5. terimlerde daha da basitleştirme yapınca

Hk sk sTk Hk Hk sk sTk Hk yk yTk (sTk yk + sTk Hk sk ) Hk sk yTk + yk sTk Hk


HBFGS
k+1 = Hk − T + + −
sk yk + sTk Hk sk sk yk + sTk Hk sk (yTk sk )(sTk yk ) yTk sk

6
Dikkat edersek 2. ve 3. terimleri birbirini iptal ediyor, o zaman, ve 4. terimi
alternatif bir formda gösterirsek,

yk yT sTk Hk sk Hk sk yTk + yk sTk Hk


 
HBFGS
k+1 = Hk + T k 1+ T −
yk s k s k yk yTk sk

Nihai BFGS formülüne erişmiş olduk. Bu formülü alttaki gibi de gösterebiliriz


[7],

sk yTk sk yTk y k yT
   
HBFGS
k+1 = I− Hk I − T + T k
s k yk y k sk yk s k

Bir örnek üzerinde görelim,

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import numpy.linalg as lin

eps = np.sqrt(np.finfo(float).eps)

def rosen(x):
return 100*(x[1]-x[0]**2)**2+(1-x[0])**2

def rosen_real(x):
gy =[-400*(x[1]-x[0]**2)*x[0]-2*(1-x[0]), 200*(x[1]-x[0]**2)]
return rosen(x), gy

def linesearch_secant(f, d, x):


epsilon=10**(-5)
max = 500
alpha_curr=0
alpha=10**-5
y,grad=f(x)
dphi_zero=np.dot(np.array(grad).T,d)

dphi_curr=dphi_zero
i=0;
while np.abs(dphi_curr)>epsilon*np.abs(dphi_zero):
alpha_old=alpha_curr
alpha_curr=alpha
dphi_old=dphi_curr
y,grad=f(x+alpha_curr*d)
dphi_curr=np.dot(np.array(grad).T,d)
alpha=(dphi_curr*alpha_old-dphi_old*alpha_curr)/(dphi_curr-dphi_old);
i += 1
if (i >= max) and (np.abs(dphi_curr)>epsilon*np.abs(dphi_zero)):
print('Line search terminating with number of iterations:')
print(i)
print(alpha)
break

7
return alpha

def bfgs(x, func):

H = np.eye(2)
tol = 1e-20
y,grad = func(x)
dist=2*tol
epsilon = tol
iter=0;

while lin.norm(grad)>1e-6:
value,grad=func(x)
p=np.dot(-H,grad)
lam = linesearch_secant(func,p,x)
iter += 1
xt = x
x = x + lam*p
s = lam*p
dist=lin.norm(s)
newvalue,newgrad=func(x)
y = np.array(newgrad)-grad
rho=1/np.dot(y.T,s)
s = s.reshape(2,1)
y = y.reshape(2,1)
tmp1 = np.eye(2)-rho*np.dot(s,y.T)
tmp2 = np.eye(2)-rho*np.dot(y,s.T)
tmp3 = rho*np.dot(s,s.T)
H= np.dot(np.dot(tmp1,H),tmp2) + tmp3
#print ('lambda:',lam)

print (xt)
print ('iter',iter)

x=np.array([-1.0,0])
bfgs(x,rosen_real)

[1. 1.]
iter 19

Eğer gradyan yerine yaklaşıksal gradyan hesap fonksiyonunu kullanırsak,

def _approx_fprime_helper(xk, f, epsilon):


f0 = f(xk)
grad = np.zeros((len(xk),), float)
ei = np.zeros((len(xk),), float)
for k in range(len(xk)):
ei[k] = 1.0
d = epsilon * ei
df = (f(xk + d) - f0) / d[k]
if not np.isscalar(df):
try:
df = df.item()
except (ValueError, AttributeError):
raise ValueError("The user-provided "

8
"objective function must "
"return a scalar value.")
grad[k] = df
ei[k] = 0.0
return grad

def rosen_approx(x):
g = _approx_fprime_helper(x, rosen, eps)
return rosen(x),g

bfgs(x,rosen_approx)

[0.99999552 0.99999104]
iter 19

yine optimum noktaya erişmiş oluyoruz.


Yakınsaklık garantileri açısından, Newton-umsu metotlar her adımda bir pozi-
tif kesin Hk ürettikleri için çizgi aramasıyla birleştirilmiş normal Newton metot-
larıyla aynı şekilde sürekli iniş özelliğine sahip olacaktır, bu sebeple 1. derecede
optimallik şartı açısından, nereden başlanırsa başlansın bir minimuma ulaşacaklardır.
Detaylar için [2].
Kaynaklar
[1] Dutta, Optimization in Chemical Engineering
[2] Zak, An Introduction to Optimization, 4th Edition
[3] Bayramli, Hesapsal Bilim, Sayısal Entegrasyon ve Sonlu Farklılıklar ile Sayısal
Türev
[4] Chen, ELE522 - Large Scale Optimization Lecture, Princeton, http://www.princeton.
edu/˜yc5/ele522_optimization/
[5] Bayramli, Lineer Cebir, Ders 8, Kerte Konusu
[6] Bayramli, Lineer Cebir, Ekler, Sherley-Morrison Formülü
[7] Fletcher, A new approach to variable metric problems

9
Çifteşlik, İkizlik (Duality)
Bu benim en favori konularımdan [1]. Çok faydalı ve çok güzel bir teknik, bakış
açısı. Bu konu üzerinde iki ders zamanı harcayacağız. Konuyu lineer program-
lama (LP) üzerinden göreceğiz, çünkü bu alanda çifteşlik pratik olarak rahatça
gösterilebiliyor.
[önceki ders özeti atlandı]
Önümüzdeki iki ders için teori şapkamızı takacağız, tabii çifteşliğin pek çok opti-
mizasyon problemi üzerinde çok ciddi etkileri var. Yani bu konu bulutlar üzerinde,
aşırı soyut bir konu değil, onu vurgulamak istiyorum.
Ama şimdilik soyut denebilecek bir problemle başlayalım. Diyelim ki elimde
bir LP var ve bu LP’nin optimal değeri için bir alt sınır bulmak istiyorum, B 6
minx f(x). Çifteşliğe bu çok basit soru üzerinden giriş yapacağız. Örnek

min x + y, öyle ki
x,y

x+y>2
x, y > 0

dogru olsun.
İki skalar değişken var, ve pozitif olmalılar. Bu problem için alt sınır nedir?
Çıplak gözle bile bakarak bunu bulabiliriz, cevap 2. Değil mi? x + y > 2 şartına
uymak gerekiyorsa alt sınır 2 olacaktır.
Bazılarınız düşünebilir ki “şanslıydık, problem şartları aradığımız şeyi söylüyordu
zaten”. Doğru fakat iddia ediyorum ki bu stratejiyi metodik bir şekilde de kul-
lanabilirdik. Benzer bir problem,

min x + 3y, öyle ki


x,y

x+y>2
x > 0, y > 0

Bu problemin alt sınırını nasıl buluruz?


Eğer y > 0 şartını ikiyle çarparsak 2y > 0 diye yeni bir şart elde ederiz (hala
doğru), bu yeni şartı alıp x+y > 2’a eklersek x+3y > 2 şeklinde bir şart daha elde
etmiş oluruz. Bu şart hedef fonksiyonuna benzediği için alt sınırı direk söylüyor,
alt sınır yine 2.
Üstteki probleme daha genel bir açıdan bakalım,

min px + qy, öyle ki


x,y

1
x+y>2
x, y > 0

Alt sınır nedir? Öncekine göre biraz farklı bir strateji izleyeceğiz, diyelim ki her
şartı a, b, c sabitleri ile çarptım,

ax + ay > 2a
bx > 0
cy > 0

Bu tabii ki a, b, c > 0 ise yapılabilir yoksa işaretler değişirdi. Devam edelim, yine
bazı ek koşullar yaratmış oldum. Bu yeni şartları toplarsam bir yeni şart daha
elde ederim,

(a + b)x + (a + c)y > 2a

Yeni değişken isimleri p, q atarsam

px + qy > 2a

atama

a + b = p, a+c=q

Aslında alt sınırı iki üstteki denklemden bulmuş olduk, 2a (bir üstteki şartlara
uyulduğu sürece tabii).
Eğer en iyi alt sınırı isteseydim, onu nasıl elde ederdim? Bu demektir ki 2a ola-
bildiğince büyük olmalı, tabii belli şartlara uyulduğu sürece. Aslında bu soru bizi
ikinci bir LP’ye götürüyor, literatürde ana LP’nin çifteşi / ikizi denen LP’ye. İki
değişkenli ortamda,

max 2a öyle ki
a,b,c

a+b=p
a+c=q
a, b, c > 0

Maksimum arandığına dikkat ve bu problemde üç tane değişken var (ana prob-
lemde iki taneydi). Ve böylece deriz ki üstteki şartlara uyan her a, b, c (ki bu
şartlara ikizin olurluk / fizibilite şartları deniyor) maksimal noktada ana prob-
lemin alt sınırını minimize eder.

2
Bir soru sorayım: acaba üstteki problemden bir eşitlik elde etmem mümkün mü?
Yani ikizdeki problemin optimal değeri ana problemdeki optimal değere eşit ola-
bilir mi? Cevap evet. Peki arada boşluk olması mümkün mü? Cevap (bazen)
evet. İyi bir sezgisel bakış bu, ana ve ikiz LP optimal değerleri neredeyse her
zaman birbirine eşittir, bazı istanai patolojik durumlar dışında.
Farklı bir probleme bakalım. Bu problemde bir eşitlik te olacak.

min px + qy öyle ki
a,b,c

x>0
y61
3x + y = 2

İkizi bulmak için her koşul için bir değişken atayalım, ama ondan önce her ana
koşulda eşitsizlikler aynı şekilde ise işimiz daha rahatlaşır (çünkü a, b, c, .. değişkenlerini
sıfırdan büyük yapacağız, ama farklı yönleri gösteren ana koşullar ile bu zorlaşıyor),
y 6 1 yerine −y > −1 mesela, o zaman

min px + qy öyle ki
a,b,c

x>0
−y > −1
3x + y = 2

Yine a, b, c ile çarpıyorum,

ax > 0
−by > −b
3cx + cy = 2c
a, b > 0

c üzerinde koşul var mı? Hayır, çünkü c’nin çarptığı koşul bir eşitlik, c ne olursa
olsun yeni koşul geçerli, işaret değişiminden korkmaya gerek yok.
Önceden olduğu gibi bir toplam alıyoruz,

(a + 3c)x + (−b + c)y > −b + 2c

Yine p, q atamasını yaparsam,

px + qy > −b + 2c

3
p = a + 3c, q = −b + c

İkiz problemi elde ettik, amaç ana problemin alt sınırı −b + 2c’yi maksimize et-
mek, üstteki iki şart ve a, b > 0 olacak şekilde.

max 2c − b öyle ki
a,b,c

a + 3c = p
−b + c = q
a, b > 0

Dersin geri kalanında ikizlikten genel bir çerçevede bahsedeceğim, sonra bir ilginç
örnek göreceğiz, ardından ikizliğe yeni bir bakış açısından yaklaşacağız, bu açı
çok önemli olacak. Dersi ikinci bir örnekle bitireceğiz.
LP’lere tüm genelliği ile bakalım şimdi. Önceki format neler olup bittiğini görmek
açısından faydalı, ama genel şablonu da görmek lazım.
Tanımlar
c ∈ Rn , A ∈ Rm×n , b ∈ Rm , G ∈ Rr×n , h ∈ Rr verili.
Ana Problem

min cT x öyle ki
x

Ax = b
Gx 6 h (1)

İkiz Problem

max −bT u − hT v öyle ki


u,v

−AT u − GT v = c
v>0 (2)

İkizi nasıl elde ettik?


Ax = b ve Gx 6 h için iki (vektör) değişkeni tanımlıyoruz, sırasıyla u, v. u için
kısıtlama yok, çünkü eşitlik için. Sadece v > 0 olmalı.
Eger x olurlu ise

aT (Ax − b) + vT (Gx − h) 6 0

4
olur çünkü olurluluk noktasında Ax − b = 0 ve Gx − h 6 0, bu sebeple üstteki
toplam tabii ki sıfırdan küçük.
Gruplarsak,

(AT u + GT v)T x − bT u − hT v > 0

(−AT u − GT v)T x > −bT u − hT v

Parantez içini c’ye atarsam o zaman

cT x > −bT u − hT v

Böylece eşitliğin sağ tarafı alt sınırım olur, sol tarafı ise ikiz değişkenlerim üzerinde
kısıtlama haline gelir, v > 0. Böylece ikiz probleme erişmiş oluyoruz.
Sonraki örneğe gelelim. Bu probleme maks akış min kesiş (max flow min cut)
problemi deniyor. Konunun gelişmesindeki ilginç bir hikaye 20. yüzyıl başında
Sovyetler maks akış Amerikalılar ise min kesiş problemlerini çözmeye odaklanmıştı,
fakat bu iki problem ikizlik üzerinden aslında aynı problem.
Maksimum akış problemi şöyle: bir yönlü çizit verildi diyelim,

İki nokta arasında bağlantı varsa cij o iki nokta i, j arasındaki bağlantının kapa-
sitesini gösteriyor, eğer bir tren hattından bahsediyorsak o bağlantıdan geçebilecek
yük miktarı, eğer su borusu ise oradan akabilecek su miktarı, ya da bir yol ise
o yolun uzunluğu, vs. olabilir. Bir bağlantıdan gerçekte olan akışı fij olarak
tanımlayabiliriz,

0 6 fij 6 cij

ve i, j ∈ E olacak, burada E tüm kenarların (edges) indisleri, çizit G = (V, E)


olarak tanımlı, V çizitin düğüm noktaları (vertices). Bir diğer şart (ki aslında bu

5
bariz) bir düğüme giren akışın çıkan akışla eşit olması.

X X
fik = fkj k ∈ V\{s, t}
(i,k)∈E kj

Not: \ işareti ”hariç” demek.


Maks akış problemi eldeki bir mali, nakliyatı diyelim, bir başlangıç noktası s bitişi
noktası t’ye maksimum miktarda nakil edebilecek yolları bulmaktır. Dikkat: s’den
mal göndermek deyince s’den çıkan pek çok yoldan nakliyat paylaştırılarak gönderilebilir,
altta görüldüğü gibi (kırmızı hat kapasitesi, yeşil bir optimal akış örneği, başlangıç
0 bitiş 7).

O zaman maksimum akışı bir LP olarak kodlayalım,

X
max fsj , öyle ki
f∈R|E|
(s,j)∈E

0 6 fij 6 cij , ∀i, j ∈ E


X X
fik = fkj k ∈ V\{s, t}
(i,k)∈E kj

Fakat tek bir toplam ile tüm çizit üzerinden maksimum akışı nasıl formülize
edebildik? Hedef fonksiyonundaki toplam sadece başlangıç s’den çıkan akışa
bakıyor? Buradaki ufak numara yaptığımız kısıtlamayla bağlantılı, akışın muhafaza
edilmesini şart koştuğumuz için optimal akış, her ne ise, çıkış noktasından olan
toplamı ile varış noktasına girişi aynı tutmalı (aradaki geçiş düğümleri için de
aynı şey geçerli olduğu için tabii), bu sebeple optimizasyonu tek bir toplam ile
tanımlayabildik. Üstteki grafik örnekte görülüyor, çıkış toplam 3+2+1 varış toplam
4+2. O zaman çıkışı optimize edersek t’ye varan, tüm düğümler üzerinden ola-
bilecek akışı maksimize etmiş oluruz.
Bu programın ikizini hesaplayabiliriz, üstteki bir LP ikizini bulmayı biliyoruz,
ana LP’dekiler kısıtlamalar kadar yeni değişken elde ederiz, vs.. Daha önce min-
imizasyon problemlerinin ikizine baktık, ana problemde bir alt sınır elde etm-

6
eye uğraşıyorduk. Şimdi ana problem maksimizasyon, o zaman hedef için üst
sınır aramak bizi ikize götürür. Min probleminde bile hedefe bir eksi işareti ek-
lesem onu maksimizasyon olarak görebilirdim, ve üst sınıra bakabilirdim. İkizin
türetilmesi için notlara bakılabilir [2]. Sonuçta şu minimizasyonu elde ediyorum,

X
min bij cij öyle ki
b∈R|E| ,x∈R|V|
(i,j)∈E

bij > xi − xj
bij , xi , xj ∈ {0, 1} ∀i, j

Elde ettiğimiz sonuc (hala ikize gelmedik) şunu söylüyor, elimdeki düğümleri
öyle iki gruba ayırmak istiyorum ki (altta bir grup görülüyor, renkli kısım), bir
gruptan diğer gruba geçen kapasitelerin, geçen kenarların kapasitelerinin toplamı
minimal olsun.

Bu arada üstteki program bir LP değil, bir tamsayı programı (integer program)
çünkü eldeki düğümleri bir gruba ya da diğerine (0,1 değerleri üzerinden) atıyoruz,
değişkenler ikisel, doğal olarak tam sayılar. Şimdi ikize geliyoruz, ana problemi
ikiz üstteki tamsayı programının gevşetilmiş (relaxation) hali. 0,1 tamsayılarını
alıp onları 0 ile 1 arasında gidip gelebilen reel değişkenler olarak tanımlarsak bir
LP elde ederiz.
Yani ana / ikizlik ve üstteki gevşetme arasındaki ilişkiler şöyle
maksimum akış değeri 6 gevşetilmiş minimum kesiş 6 minimum kesişin kapa-
sitesi
Gevşetme ile minimum değer daha azaldı, tamsayı programını gevşetip dışbükey
program haline getirince bunun olduğu biliniyor, kısıtlama kümesini genişlettim,
bu minimumu küçültecektir.
Herhalde kesiş kelimesinin nereden geldiği anlaşılıyor şimdi, eğer elimde bir
makasla renkli bölgeye giden bağlantıları kessem, en az miktarda akışı kesmiş

7
olurum, ve o renkli bölge içindeki akış en yüksek kapasitede olur. Ve buradaki
problemde güçlü ikizlik durumu olduğu için bu iki değer birbirine eşit!
Şimdi LP ikizliğine farklı bir açıdan bakalım, ki bu açı oldukca faydalı olacak.
(1) ve (2) formunu tekrar hatırlayalım. Ana problemdeki cT x’e eşitlik ve eşitsizlik
kısıtlamalarını daha önce bir kez gördüğümüz gibi ekleyince,

cT x > cT x + uT (Ax − b) + vT (Gx − h)

Bu doğru çünkü olurlu x için Ax − b sıfır ve Gx − h sıfırdan küçük, v > 0. Yani


toplam cT x’dan muhakkak daha küçük.
Ayrıca şunu da söylemek mümkün, diyelim ki x ∈ C olurlu değerler,

f∗ = min cT x > min cT x+uT (Ax−b)+vT (Gx−h) > min cT x+uT (Ax−b)+vT (Gx−h)
x∈C x∈C x

En sağdaki eşitsizlik yeni eklendi, buradaki ifadenin ortadakinen tek farkı x’lerinin
sadece olurlu kümeden değil mümkün tüm x’ler olabilmesi. Herhangi bir x de
bizi herhangi bir hedefe götürebilecegi icin (kısıtlama kalmadı) −∞ bile olmak
mümkün, üstteki eşitsizlik bu sebeple doğru.
En sağdaki ifadeyi g(u, v) olarak yazabiliriz, u, v’nin bir fonksiyonu olarak. Bu
fonksiyon f∗ ’ye bir alt sınır sağlar,

f∗ > g(u, v)

ki v > 0 olduğu sürece.


O zaman mümkün olan en büyük alt sınır g(u, v)’yi hesaplamak istiyorsak, ikiz
problemimiz g(u, v)’yi olabildiğince büyük yapmak olabilir, yani onu maksimize
etmek.

max g(u, v) öyle ki


u,v

v>0

Bu ikizi türetmenin bir başka yoludur. Üstteki problemden gelen g ki ona çoğunlukla
g∗ denir, f∗ için bir alt sınır oluşturacaktır,

g∗ 6 f∗

Şimdi g’nin nasıl bir fonksiyon olduğuna yakında bakalım. Tanım şöyleydi,

8
g(u, v) = min cT x + uT (Ax − b) + vT (Gx − h)
x

Bir gruplama yapalım,

= min(cT + AT u + GT v)T x − bT u − hT u
x

Üstteki x bağlamında bir lineer fonksiyon değil mi? Birşeyler devriği çarpı x artı
birşeyler. Tüm x’ler üzerinden bu fonksiyonun minimumu nedir? Eksi sonsu-
zluk, eğer parantez içindeki değer sıfır değilse.. Değil mi? Eğer x sıfırla çarpılıp
yokedilmiyorsa x’i istediğim tarafa çekip hedefi istediğim kadar negatife götürebilirim.
Ama cT + AT u + GT v sıfır ise o zaman minimum nedir? Sıfırdan geri kalanlar,
−bT u − hT u, o zaman


−∞ eğer cT + AT u + GT v 6= 0
=
−bT u − hT u eğer cT + AT u + GT v = 0

Negatif sonsuz olmayan duruma bakıyoruz, cT + AT u + GT v = 0 şartı aynı za-


manda c = −AT u − GT v demektir, o zaman g(u, v)’yi v > 0 olacak şekilde mak-
simize etmek demek

max −bT u − hT u öyle ki


u,v

c = −AT u − GT v, v>0

programıyla eşdeğerdir.
İkiz programa erişmiş olduk, farklı bir yönden geldik, ama yine (2) ile aynı nok-
taya ulaştık.
Bu ikinci türetiş şeklinin daha faydalı olmasının sebebini anlatalım şimdi. İlk ikiz
alma stratejimiz neydi? Elimizde

min f(x) öyle ki


Ax = b
Gx > h
v>0

var, her kısıtlamaları ikiz değişkenler u, v ile çarpıyoruz, birleşik bir denklem, bir
lineer kombinasyon elde ediyoruz,

uT (Ax − b) + vT (Gx − h) 6 0

9
Sonra üstteki ifadeyi bir şekilde f(x)’e eşitlemem lazım, ya da f(x)’i içeren bir
şeylere eşitlemem lazım, ki onu kullanarak ana değer için bir alt sınır elde edebi-
leyim. İlk stratejimiz buydu değil mi?

f(x) + birşeyler > 0

elde etmek.
Bu iyi güzel ama genel bağlamda bu yöntem her zaman işlemez. Eğer f(x) lineer
değilse, onu lineer kombinasyonlar kullanarak nasıl elde edebiliriz ki? Mümkün
değil. Yani üstteki yöntem f(x) lineer ise işler, diğer durumlarda işlemez.
İkinci stratejinin güzel tarafı burada. Her zaman işler, yeter ki f dışbükey olsun.
Aslında bir açıdan dışbükeylik olmasa da işliyor, buna sonra geleceğiz. İkinci
stratejiyi tekrar hatırlarsak, bir Lagrangian oluşturmuştuk, bu ifadede ana hedefe
ikiz değişkenlerle noktasal çarpım üzerinden eklenen kısıtlamalar vardı, ve min-
imizasyonu olurlu set yerine tüm x’ler üzerinden yapıyorduk, ve bu bize her
zaman ana hedef için bir alt sınır veriyordu.
[Matris oyunları örneği atlandı]
Ekler
Altta maksimum akışı LP olarak çözen sayısal bir örnek görüyoruz.
Örnek
Alttaki örnekte [3] bir maksimum akış çözümü görelim. Çizit ve her kenarın
kapasiteleri görülüyor

from scipy.optimize import linprog


import numpy as np

A_ub = np.eye(5)
b_ub = np.array([1.,2.,2.,3.,1.])
A_eq = np.array([[1, 0, -1, -1, 0],
[0, 1, 1, 0, -1]])
b_eq = np.array([ 0, 0 ]);
f = np.array( [ 1, 1, 0, 0, 0 ])
res = linprog(-f, A_ub=A_ub, b_ub=b_ub, \

10
A_eq=A_eq, b_eq=b_eq)
print (np.round(res.x))

[1. 1. 0. 1. 1.]

print (res.x.dot(f))

1.9999999998438802

Not: linprog minimize etmeye ayarlı olduğu için hedefi eksi ile çarptık, yani
maksimizasyon yaptırmış olduk.
Maksimum akış 2.0 olarak bulundu.
Optimize edilen −fT x dersek vektör x içindeki öğeler e1 , e2 , e3 , e4 , e5 , ve f içinde
1, 1, 0, 0, 0 var, yani aslında sadece e1 , e2 ’nin akış toplamına bakmış oluyoruz. Bu
normal, sebeplerinden önce bahsetmiştik. Bulunan sonuç x∗ = (1, 1, 0, 1, 1), ve
fT x∗ çarpımı ilk iki öğeyi toplatıyor, ve 1+1 = 2, maksimum akış.
Eşitlik kısıtlamaları Aeq ve beq içinde, Aeq x = beq için. Sadece iki kısıtlama var,
bu kısıtlamalardan ilki 1’e giren e1 ile ondan çıkan e3 , e4 ’un eşit olması gerektiğini
söylüyor, bu sebeple ilk kısıtlama 1, 0, −1, −1, 0, ve ona tekabül eden beq sıfır
değerinde, e1 akışı ile e3 , e4 toplanırsa sıfır olsun demiş oluyoruz. İkinci kısıtlama
2’ye giren iki akış e2 , e3 ile çıkan e5 ’i dengeliyor.
Eşitsizlik kısıtlamaları Aub x 6 bub . Burada kapasiteleri kodluyoruz, her kenarın
kapasitesi belli, e1 için 1, e2 için 2, vs. Ve optimal sonuç bulunuyor.
Not: bu problemi lineer program olarak kodlayabilmek çok şey kazandırdı. Diğer
yandan üstteki problemi bilgisayar bilim bağlamında çözen yaklaşımlar da vardır,
hatta çizitin özel yapısından faydalanarak bu yaklaşımların bazıları oldukca hızlı.
Kaynaklar
[1] Tibshirani, Convex Optimization, Lecture Video 10, https://www.youtube.
com/channel/UCIvaLZcfz3ikJ1cD-zMpIXg
[2] Tibshirani, Convex Optimization, Lecture Notes, https://www.stat.cmu.
edu/˜ryantibs/convexopt/
[3] Zisserman, C25 Optimization, http://www.robots.ox.ac.uk/˜az/lectures/
opt/

11
Genel Çifteşlik / İkizlik (General Duality)
Bu derste [1] genel dışbükey problemlerinde ikizlik konusunu göreceğiz, ek olarak
dışbükey olmayan durumlara da bakacağız. İkizlik oldukça genel bir konu.
Önceki derste ikizliği elde etmenin ikinci yönteminde

L(x, u, v) ≡ cT x + uT (Ax − b) + vT (Gx − h)

tanımı üzerinden (Lagrangian)

f∗ = min L(x, u, v) > min L(x, u, v) ≡ g(u, v)


x∈C x

şeklinde bir formül elde etmiştik, u, v sabitlendiği durumda ve x ∈ C olurlu


çözümleri kümesi olacak şekilde, ve bu küme üzerinden Lagrangian’ın, tüm x’ler
üzerinden olan Lagrangian’dan her zaman daha büyük olacağını görmüştük.
Aslında bu çok basit bir fikir ama bu basit ve kuvvetli fikir sayesinde ikizliği
genel problemlere uygulamak mümkün oluyor.
Ayrıca, sonradan göreceğimiz üzere, en sağdaki eşitsizlik ikiz çözüm u, v nok-
tasına sıkı (tight), yani olurlu kümeyi bir yana atarak bir şey kaybetmiş olmadık.
Yani üstte görülen eşitsizlik bazılarına gevşek gelebilir, ama doğru u, v’de son
derece sıkıdır.
Neyse devam edersek, yine üstte görülen g(u, v) u, v’nin bir fonksiyonu ve işin
güzel tarafı çoğunlukla hesaplanabilir bir fonksiyon. Yani L(x, u, v)’yi x üzeriden
minimize etmek u, v’nin bir fonksiyonu.
Bir diğer deyişle, g(u, v) fonksiyonu f∗ üzerinde herhangi bir u ve v > 0 için bir
alt sınır. Ikiz fonksiyonu olarak isimlendirilen g.
Lagrangian’ı tekrar düzenleyerek alttakini elde etmiştik,


−∞ eğer cT + AT u + GT v 6= 0
g(u, v) =
−b u − h u eğer cT + AT u + GT v = 0
T T

Şimdi LP’lerden ilerleyip, düşünebildiğimiz en genel optimizasyon formuna bakacağız.


Dişbükey (convex) olması şart değil ama tabii ki dışbükey durumlara özel ilgi
göstereceğiz. Form,

min f(x), öyle ki


x

hi (x) 6 0, i = 1, .., m
lj (x) 6 0, j = 1, .., r

1
Eğer sadece dışbükeylige bakıyor olsaydık f, hi ’lerin dışbükey, li ’lerin ise doğrusal
olması gerekirdi. Lagrangian’i tanımlayalım, hala çok genel bir şekilde yaklaşıyoruz
tabii,

X
m X
r
L(x, u, v) = f(x) + ui hi (x) + vi li (x)
i=1 i=1

Eşitlik ve eşitsizlik kritlerini ikiz değişkenler ile çarpıp topluyoruz, ve hedefe


ekliyoruz. Daha önce olduğu gibi eşitlik kısıtlamarını çarpan ui ’lar sıfır olma-
malı çünkü f(x) ile Lagrangian arasında bir ilişki kuracağız, ve ana problemdeki
eşitsizlin işaret değiştirmesini istemiyoruz.
Bu arada “ikiz değişkenler” kelimesi duruma göre bazen “Lagrange çarpanı”
olarak görülebilir.
Önemli özellik, her v ve u > 0 için, her olurlu x noktasında

f(x) > L(x, u, v)

Niye? Daha önce LP’lerle gördüğümüz fikirle aynı durum, olurlu noktalarda

X
m X
r
L(x, u, v) = f(x) + ui hi (x) + vi li (x)
| {z } | {z }
i=1 60 i=1 =0

Olurlu noktalarda li ’ler sıfır, o zaman tüm li ’leri toplamı yokolur, ui ’lerin hepsi
sıfırdan büyük olmalı ve olurlu noktada hi ’ler sıfırdan küçük, pozitif çarpı negatif
eşittir negatif, toplam negatif, f(x)’den bir değer eksiltilmiş olacaktır, bu da muhakkak
f(x)’den küçük bir sonuca sebep olacaktır, iki üstteki bu şekilde ispatlanmış olur.
Üstteki fonksiyonu, parçalarını grafiksel olarak alttaki gibi görebiliriz,

2
Kesiksiz çizgi kriter / hedef fonksiyonu örnek bir f. Dikkat edersek görülen f
dışbükey değil, bunu genel dışbükey olmayan ortamlarda da tekniğin işlediğini
göstermek için yaptık.
Noktalı eğrilerin her biri farklı u’lar için L’nin değerleri, ayrıca olurlu kümeyi
[−0.46, 0.46] arasında olacak şekilde seçtik. Yani

min f(x), öyle ki


x

hi (x) 6 0

programını ele almış olduk, noktalalı eğriler ile çizilen ise

L(x, u) = f(x) + ul(x)

Devam edersek belli bir f∗ minimumu düşünelim,

f∗ > min L(x, u, v) > min L(x, u, v) ≡ g(u, v)


x∈C x

LP örneğindeki yaklaşım, sadece olurlu küme C yerine tüm x’ler üzerinden min-
imizasiyon bir alt sınır oluşturur. g(u, v)’ye ikiz fonksiyon diyoruz.
Peki niye g(u, v) tanımını minx∈C L(x, u, v) için yapmadım, tüm x’ler üzerinden
olan kısıtlanmamış versiyon için yaptım? Çünkü tüm x’ler üzerinden olan tanım
bizim için daha faydalı. O tür ifadeler üzerinde analitik çözüm geliştirmek daha
rahattır, analitik çözüm olmasa bile tüm x’ler üzerinden yaklaşım daha faydalı.
Tabii hala bazı kısıtlamalar var, mesela u > 0 olmalı.
İkiz fonksiyon g’nin λ’ya (aslında u) gore bir grafiğini altta görüyoruz,

Kesikli çizgi kriter, ve g her λ için kriterin hep altında.

3
Peki niye ikizi yapabildiğim en büyük değer kriterin olurlu kümede olabilecek
en ufak değerine eşit değil (ikizin tepesi kesikli çizgiye değmiyor)? Çünkü elim-
izdeki bir dışbükey olmayan fonksiyon. Dişbükeylik olsaydı alt sınır sıkı olurdu.
Dışbükey olmayan fonksiyonlarda da sıkılık görülebilir ama dışbükeylik duru-
mundaki gibi bu şart değildir.
Biraz daha zor bir örneğe bakalım.
Standart formda bir karesel program (QP).

1
min xT Qx + cT x öyle ki
x 2

Ax = b, x > 0

ki Q pozitif kesin, Q  0 olarak gösterilir, en küçük özdeğeri harfiyen sıfırdan


büyük (yani > 0, > 0 değil), bu durumda üstteki problem harfiyen dışbükey
olur.
Lagrangian için öğrendiğimiz tarifi uygularsak,

1
L(x, u, v) = xT Qx + cT x − uT x + vT (Ax − b) (2)
2

İkiz fonksiyonu bulalım şimdi. x, üzerinden minimizasyon yapılan değişken


olacağı için g’de olmayacak, yani

g(u, v) = min L(x, u, v)


x

x’ler üzerinden ufak bir gruplama sonrası

1
= min xT Qx + (c − u + AT v)T x − bT v (1)
x 2

Bu minimumu nasıl buluruz? Gradyanı alıp sıfıra eşitleriz değil mi? Tabii üstteki
tanıdık bir formda, eğer tek boyuttan hatırlarsak,

ax2 + bx + c

formülü olsaydı, çözüm x∗ = −b


2a
olurdu. Çok boyutlu vektörel formda

1 T
x Qx + bT x
2

için çözüm x∗ = −Q−1 b. Bunu biliyorum çünkü pek çok kez bu çözümü türettim,
hatırlıyorum. Bu formu bizim probleme uygularsak, (1) içindeki parantezde görülen
c − u + AT v kısmı üstteki b oluyor. O zaman Lagrangian’ın minimize edicisi

4
x∗ = −Q−1 (c − u + AT v)

O zaman Lagrangian’ın minimum noktası üstteki minimize ediciyi formüle geri


sokunca elde edeceğim şey

min L(x, u, v) = L(x∗ , u, v)


x

1
= (c − u + AT v)T Q−1 (c − u + AT v) − (c − u + AT v)T Q−1 (c − u + AT v) − bT v
2

Geriye tek Q−1 kaldı çünkü (2)’ye x∗ ’i soktuğumuz zaman Q ile çarpılan ilk
Q−1 iptal oldu, ikincisi geriye kaldı, basitleştirince Lagrange ikiz fonksiyonu elde
ediyoruz,

1
g(u, v) = − (c − u + AT v)T Q−1 (c − u + AT v) − bT v (3)
2
Yani bana verilen her u > 0 ve herhangi v için hesaplayacağım üstteki formül,
bana karesel programın optimumu için bir alt sınır veriyor.
Hiç te önemsiz olmayan bir sonuç, ama bu noktaya son derece önemsiz (gibi
gözüken), gayet basit ifadeleri bir araya koyarak geldik. Ama karesel program
için elde ettiğimiz sonuca bakın. Başta gördüğümüz genel form bir QP. (3)’un
bu QP’nin optimal değeri için bir alt sınır oluşturacağı ilk bakışta bariz gibi dur-
muyor. Ama bu böyle, ve Lagrangian ikiz fonksiyonun bir özelliğinin sonucu bizi
buraya getiriyor, birkaç satırlık ifadeyle üstteki kuvvetli sonucu doğrulayabiliyoruz.
Farklı bir varyasyona bakalım şimdi, ya Q  0 olsaydı, yani Q pozitif yarı kesin
olsaydı?
Bu durumda yine Lagrangian’in gradyanını alıp sıfıra eşitlerdik, vs. ve

Qx = −(c − u + AT v) (4)

elde ederdik, fakat Q’nun tersini alıp x’i elde edemezdik çünkü Q pozitif kesin
değil.
Çözüm için iki şartı gözönüne almak lazım,
1) c − u + AT v ∈ col(Q) ki col(Q) Q’nun kolon uzayı demek, yani (4) lineer
ifadesini tatmin eden bir x var. Bu durumda x∗

x∗ = −Q+ (c − u + AT v)

olarak yazılabilir, ki + işareti genelleştirilmiş ters (generalized inverse) demek.


Bu işleme bazen sözde ters (pseudo inverse) ismi de veriliyor, ve çoğunlukla eşsiz

5
değer ayrıştırması (singular value decomposition) üzerinden tanımlanıyor. Ama
Q simetrik olduğu için onun öz ayrıştırmasını (eigen decomposition) yazsam da
olur herhalde, Q’yu şu sekilde yazsaydım,

Q = UDUT

Eğer Q pozitif yarı kesin ise o zaman D içinde bazı değerlerin sıfır olması mümkün,
yani şunun gibi bir durum olabilir,
 
d1
..
.
 
 
 T
= U U

 dr 
 0 
0

Q+ sözde tersini tanımlamanın bir yolu üstteki öz ayrıştırma üzerindendir (dikdörtgensel
matrisler için SVD üzerinden).
Ama ondan önce bir soru, eğer tüm değerleri sıfır olmayan bir D üzerinden bir öz
ayrıştırmam olsaydı? Basit, UD−1 UT değil mi? Unutmayalım U matrisi dikgen.
Ama pozitif yarı kesinlik var, o yüzden D’nin tersini alamıyorum. Bu sebeple
sözde ters işlemi D içindeki tersi alınabilen değerlerin tersini alıp diğerlerini
olduğu gibi bırakmak üzerinden tanımlanmıştır.
 
1/d1
..
.
 
 
+  T
Q = U U

 1/dr 
 0 
0

Üsttekine bazen “Moore-Penrose sözde tersi” ismi verildiğini de duyabilirsiniz,


aslında pek çok farklı sözde ters yöntemleri var, ama standart olan üstteki.
Yani bu durumda c − u + AT v’nin içinde Q’nun kolon uzayında olmayan bazı
öğeleri var, yani bu bazı öğeler col(Q)’a dikgen olan bir uzaydalar, sıfır (null)
uzayındalar. Q simetrik olduğu için kolon uzayıyla sıfır uzayı birbirini dikgen
tamamlıyor.

c − u + AT v ⊥ null(Q)

2) Bu durumda üstteki sıfır uzayıyla olan dikgenlik doğru değil. O zaman ne


olur? O durumda (4)’ün çözümü yoktur. O zaman (1)’ın minimizasyonuna ne
olacak? (1)’i istediğimiz kadar ufak yapabiliriz, yani −∞’a kadar gidebiliriz.

6
Çünkü düşünürsek sıfır uzayında olan x seçeneği (1)’in ilk terimini sıfır yapar,
ama ikinci terimi istediğimiz yöne çekebiliriz, ta ki −∞ olana kadar.


− 12 (c − u + AT v)T Q−1 (c − u + AT v) − bT v eğer c − u + AT v ⊥ null(Q)
g(u, v) =
−∞ eğer tersi doğruysa

Şimdi geri bir adım atıp her şeye bakalım. Elimizde bir QP varsa Lagrange ikiz
fonksiyon da karesel, o zaman Lagrange ikizi maksimize etmek hala bir QP. Yani
QP’lerin ikizleri yine QP.
Biraz önce gördüğümüz QP örneğinde Lagrange ikiz karesel, ama tanım kümesinde
(domain) bir kısıtlama var, üstteki g(u, v)’de görüyoruz. Fakat bu tanım kümesi
kısıtlamasını bir QP kısıtlamasına çevirebiliriz, spesifik olarak u, v üzerinde bir
eşitlik kısıtlamasına. null(Q)’ya dikgen olmak demek Q’nun sıfır uzayına olan
yansıtma matrisini, P diyelim, alıp c − u + AT v ile çarparsam sıfır sonucunu al-
malıyım. Bunu eşitlik kısıtlaması olarak kodlayabilirim. Tabii bu tür bir eşitlik
kısıtlaması eklemek ikiz problemi daha çetrefil hale getirecektir.
Bir diğer örneğe bakalım. Bu çok daha basit bir karesel program, iki boyutlu.

1
min f(x) = xT QxbT x öyle ki
x∈(x1 ,x2 ) 2
x>0

İkiz fonksiyon

1
g(u) = min xT Qx + bT x − uT x
x 2

ki u = (u1 , u2 )
Ana problem karesel, ikiz de karesel. Problemleri grafik olarak görelim, hem ana
(primal) hem de ikiz (dual) aynı grafikte olacak şekilde,

7
İkizin nasıl gözükeceğini daha önceki örneklerden tahmin edebilirdik, (3) formülünde
eksi işareti var, ikiz bir içbükey yüzey olacak.
İlginç bir şey görüyoruz, ana problemin en küçük olduğu nokta ikizin en büyük
olduğu noktada. Üstteki sistem sıkı olacak gibi duruyor, eğer üstteki g(u)’yu
maksimize etmek bana f∗ ’i geri verecek. Bu durumun bu örneğe özel olmadığını
belirtmek isterim, dışbükey problemlerde sık sık olan bir şey bu.
Bir diğer ilginç durum, ikiz çözümün nerede olduğu, yani u1 , u2 ’den bahsediyo-
rum, kriterden değil. Kriter çözüm noktasında ana ve ikizde uymalı. İkiz çözüm
(0, 0)’da. Ana çözüm, resimden pek belli olmuyor ama x1 , x2 kordinat sisteminin
içlerine doğru bir yerlerde yani her ikisi de harfiyen pozitif. Bu bir raslantı mı?
Yani x1 , x2 harfiyen pozitif ise (yani > 0) ikizin sıfır olma durumu?
Değil. Burada olan birbirini tamamlayan serbestlik (complementary slackness)
durumu. Bu kavramı Karush-Kuhn-Tucker (KKT) şartlarını işlediğimizde öğreneceğiz.
Eğer problemde gördüğümüz sınırlamaların herhangi biri çözüm noktasında sıkı
değilse ona tekabül eden ikiz değişken sıfır olmalı. Bu olması gereken bir fenomen
ve ispatını da yapacağız. Üstteki örnekte her iki şart da çözümde sıkı değil, x her
iki kordinatta da sıfırdan büyük, bu her iki ikiz değişkeni çözümde sıfır olmaya
zorluyor.
Tekrar üzerinden geçersek, bir ana problem,

min f(x) öyle ki


x

hi (x) 6 0, i = 1, .., m
lj (x) = 0, j = 1, .., r

8
için bir ikiz g(u, v) oluşturabiliriz ki her zaman f∗ > g(u, v) olacaktır her u > 0 ve
v için. O zaman en iyi alt sınır g(u, v)’yi tüm olurlu u, v’ler üzerinden maksimize
ederek elde edilir. Bu bize Lagrange ikizi problemi verir,

max g(u, v) öyle ki


u,v

u>0

Önemli bir özellik zayıf ikizlik durumu, eğer ikizin optimal değerine g∗ dersek
f∗ > g ∗ .
Üstteki ilişki ana problem dışbükey olmasa bile işliyor. Yani elimizde müthiş
dışbükey olmayan çok zor bir optimizasyon problemi olabilir, ama onun ikizini
oluşturursak bu yeni problemin optimal değeri her zaman ana problem için bir
alt sınır oluşturuyor. Bazen bu optimal değerin kendisi bile faydalı, belki kriter
fonksiyonun kendisi mesela bir ekonomik bedel, bir yol miktarı, vs gibi bir şeyi
temsil ediyor ve ona iyi bir alt sınır bulmak bile bize önemli bir bilgi veriyor.
Şimdi sıkı durun, dahası da var. Birazdan bahsedeceğim şey ilk duyanları çok
şaşırtıyor. İkiz problem her zaman bir içbükey / dışbükey optimizasyon prob-
lemi. Bu önemli çünkü dışbükey programları bir şekilde muhakkak sayısal olarak
çözebiliyoruz, cvx paketi ile belki, ya da altgradyan (subgradient) metotlarıyla..
bir şekilde bu olur. Bilimin vardığı nokta burası, o problem çözüldü. Bu çok
iyi çünkü eğer ana problem minimizasyon problemi ise ikiz her zaman içbükey
maksimizasyon, ya da diğer yönde ana problem maksimizasyon ise ikiz dışbükey
minimizasyon, ve içbükey / dışbükey problemi çözebiliyoruz. Bu her zaman
doğru, ana problem ne olursa olsun.
Niye? İspatını yapacağız, ana maksimizasyondan başlayarak g’nin her zaman bir
içbükey fonksiyon olduğunu ispatlayacağız. Bu ispat çok basit aslında. Tanım
itibariyle,
 
X
m X
r
g(u, v) = min f(x) + ui hi (x) + vi li (x)
x
i=1 i=1

Her şeyi eksi ile çarparsak üsttekini bir maksimizasyona çevirebiliriz,


 
X
m X
r
= − max −f(x) − ui hi (x) − vi li (x)
x
i=1 i=1

Şimdi max başındaki eksiye bakmadan geri kalanlara bakalım. u, v üzerinden


düşünürsek üstte çarpımlar ve toplamlar var. u, v açısından f(x) bile bir sabitin
toplamı demektir. Çarpım toplamlar doğrusal fonksiyondur, doğrusal fonksiy-
onlar ise dışbükeydir. Şimdi max basındaki eksiyi de hesaba katarsak dışbükey
içbükey olur (ama hala aynı familyadayız). Yani ikizde elimizde kesinlikle bir
içbükey problem olmalı.

9
Fakat genel uygulamalarda önümüze bazı engeller çıkabiliyor. Mesela Lagrangian’ın
kendisinin hesabı oldukca çetrefil olabilir. Eğer ana problem dışbükey ise La-
grangian hesabı kolay ama çetrefil f(x)’ler için bu iş daha zor. Yani dışbükey
olmayan ana problemin şanslıysak ikiz hesabı kolaydır, ama çoğunlukla iş zor.
Altta bir örnek seçtim, öyle ki ikiz hesaplanabilir halde olacak, her ne kadar ana
problem olmasa da.

max f(x) = x4 − 50x2 + 100x, öyle ki x > −4.5

Problemin grafigi altta

Sol grafikteki koyu siyah nokta ikizdeki maksimuma tekabül eden nokta, gerçek
minimum değil, o minimum biraz daha sola doğru. Sağdaki ikiz grafiğini hesapladım,
u yok tabii çünkü eşitlik kısıtlaması yok. İkizin içbükey olduğuna dikkat. Ana
problem dışbükey değil, ama ikiz içbükey.
Ayrıca ikiz aşağı yukarı “parçalı lineer” denebilecek bir halde, ki bu durum da
ana problem dışbükey olmadığında yaygın şekilde görülen bir durum.
Bu arada eğer g’yi cebirsel olarak türetirsek, oldukca çetrefil bir form elde edeceğimizi
görebiliriz [türetim atlandı, burada benim notum, içbükey bir problemi pür sayısal
olarak çözmenin nasıl olsa mümkün olacağı].
Güçlü İkizlik
Daha önce f∗ > g∗ olması gerektiğini gördük. Fakat pek çok problemde

f∗ = g∗

olduğunu da gördük. Yani ana ve ikiz problem arasında hiç boşluk yok. Buna
güçlü ikizlik ismi veriliyor. Hatta bu durum neredeyse her dışbükey optimiza-
syon probleminde ortaya çıkıyor. Neredeyse dedik çünkü Slater şartı denen bir
şart da lazım bu şarta göre eğer olurlu kümede tüm eşitlik tüm eşitsizlik şartlarını

10
harfiyen yerine getiren en az bir nokta varsa o zaman güçlü ikizlik var. Harfiyen
derken tüm eşitlik şartları sıfıra eşit, tüm eşitsizlikler sıfırdan küçük olmalı.
Çoğunlukla bu çok, çok zayıf bir şart, yani yerine getirmesi çok kolay. Yani ana
problemin dışbükey olup da Slater şartına uymaması çok nadirdir, eğer ana prob-
lemde çok absürt şartların olması lazım.
Slater şartının LP’ler için anlamı nedir? LP’ler zaten doğal olarak dışbükeydir,
ama onlar için zaten tüm şartlar doğrusal olduğu için LP olurlu ise otomatik
olarak güçlü ikizlik vardır [gerisi atlandı]
İkizlik Boşluğu (Duality Gap)
Bir basit kavrama daha değinelim. Basit ama çok faydalı olabilir, mesela ana
ve ikizi optimize etmek içi bir özyineli algoritma geliştiriyorsunuz, ve bir olurlu
x’imiz ve olurlu u, v’miz var ise,

f(x) − g(u, v)

büyüklüğünü hesaplayabiliriz. Bu niye faydalı? Çünkü ikizlik boşluğu her za-


man f(x)’in optimale yakınlığına bir üst sınır oluşturur,

f(x) − f∗ 6 f(x) − g(u, v) (5)

Nasıl türetildi? g(u, v) 6 f∗ olduğunu biliyoruz, ya da −g(u, v) > −f∗ . Sonra


f(x) = f(x) ile başlayarak bir tarafa −f∗ diğerine −g(u, v) ekleriz, üstteki eşitsizliği
elde ederiz.
O zaman ana ve ikizi optimize etmek içi bir özyineli algoritma geliştirirken “op-
timal kritere ne kadar yakınım?” diye merak ediyorsak, (5) hesabını yaparsak o
değerden daha uzak olamayacağımızı biliriz. Eğer 0.001 almışsak, 0.001’dan uzak
olamayız. Tabii aynı argüman ikiz kriteri için de geçerli, ondan da 0.001’den daha
uzakta olamayız, g∗ − g(u, v) aynı şekilde sınırlanmıştır.
Bu kavramları özyineli algoritmada bir durma şartı olarak kullanabiliriz. Eğer
f(x) − g(u, v) <  ise f(x) − f∗ <  olması garantidir, geldiğimiz nokta bir “ alt
optimalliktir”, ya da bir “ alt optimal sonucu” elde etmişizdir.
Bu kavram KKT şartlarına gelince de faydalı olacak.
Kaynaklar
[1] Tibshirani, Convex Optimization, Lecture Video 11, https://www.youtube.
com/channel/UCIvaLZcfz3ikJ1cD-zMpIXg

11
Karush-Kuhn-Tucker (KKT) Şartları
KKT şartları birkaç basit kavramın bir araya gelmesiyle oluşan çok kuvvetli bir
kavram. Bu şartlar 4 tane. Alttaki gibi genel bir problemle bağlantılılar,

min f(x) öyle ki


x

hi (x) 6 0, i = 1, .., m
lj (x) = 0, j = 1, .., r

Lagrangian’ı hatırlarsak,

X
m X
r
L(x, u, v) = f(x) + ui hi (x) + vi li (x)
| {z } | {z }
i=1 60 i=1 =0

Problemin dışbükey olması mecbur değil.


Bu şartlar,
1) Durağanlık şartı
Lagrangian’da u, v sabitledim, ve x’e göre Lagrangian’ın altgradyanını alırsam, 0
değeri bu altgradyan içinde olmalı.

X X
m r
!
0 ∈ ∂x f(x) + ui hi (x) + vj lj (x)
i=1 j=1

2) Tamamlayıcı Gevşeklik (Complementary Slackness)

ui · hi (x) = 0 ∀i

Üstteki şart diyor ki ya hi (x) sıfır olmalı, yani i’inci eşitsizlik sıkı olmalı, ya da
ona tekabül eden ikiz değişken ui sıfır olmalı, yani eşitsizlik ya sıkı -eşitlik- ya da
dikkate alınmamalı.
3) Ana Olurluk

hi (x) 6 0, lj (x) = 0 ∀i, j

4) İkiz Olurluğu

ui > 0, ∀i

Optimallik için x, u, v üstteki 4 şartı yerine getirmeli, genel bağlamda bu o x’in


ana problemi, u, v’nin ikiz problemi çözmesi anlamına geliyor.

1
İspatlayalım. Önce ters yönden gelerek bir ispat, diyelim ki elimde ana ve ikiz
çözümler var. Eğer o “çözüm varsa, oradan KKT şartları meydana çıkmalı” is-
patını görelim. Bu yöne “gereklilik” (necessary) denebilir. Diyelim ki x∗ , ve u∗ , v∗
ana ve ikiz çözümleri var, ve ikizlik boşluğu sıfır (yani güçlü ikizlik aktif, Slater
şartını hatırlarsak). O zaman

f(x∗ ) = g(u∗ , v∗ )

Tanım itibariyle, her u, v için g(u, v) fonksiyou Lagrangian’ın x üzerinden mini-


mumu. Üsttekinden hareketle ve u, v için u∗ , v∗ kullanırsak,

X
m X
r
= min f(x) + u∗i hi (x) + v∗j lj (x)
x
i=1 j=1

Üstte minimum buluyorum yani x üzerinden üstteki Lagrangian’ı x∗ ’deki halin-


den daha fazla ufaltmam mümkün değil,

X
m X
r
∗ ∗ ∗
6 f(x ) + ui hi (x ) + vj ∗ lj (x∗ ) (1)
i=1 j=1

Devam edersek, u∗i olurlu, o zaman üstteki ortadaki terim > 0, v∗i olurlu o zaman
üçüncü terim sıfır. Bu demektir ki üstteki ifade f(x∗ )’den daha az olmalı.

6 f(x∗ ) (2)

Sonuç olarak

f(x∗ ) 6 f(x∗ ∗)

elde ettik, o zaman üstteki ifade aslında eşitsizlik değil bir eşitlik çünkü eşitsizliğin
iki tarafında aynı şey var.
Eşitsizliklerin eşitlik olması ne anlama gelir? Demek ki x∗ Lagrangian’ı u∗ , v∗
noktasında minimize edecektir. Durağanlık bu demek zaten değil mi? x’e göre
Lagrangian’ın altgradyanını aldım ve bu sıfıra eşit. Ayrıca tamamlayan gevşeklik
şartı da ispatlanmış oluyor, (1) ile (2) eşit olmalıysa, ve (1)’deki 3. terimin sıfır
olduğunu biliyoruz, 2. terimdeki tamamı pozitif olan toplam öğeleride sıfır ol-
malı çünkü başka türlü (2)’ye eşitliği elde edemeyiz. Eh bu durum da tamam-
layan gevşeklik şartı değil midir?
Ana-ikiz olurluğunu zaten bedava elde ettik. Elimizde bir çözüm varsa onlar
ana-ikiz olurlu olmalı.

2
Yani ispatlamış olduk ki eğer elimizde ana-ikiz boşluğu olmayan bir çözüm varsa,
x∗ , u∗ , v∗ çözüm üçlüsü KKT koşullarına uymaktadır. KKT koşularının güçlü iki-
zlik durumunda şart olduğunu göstermiş olduk.
Diğer yönden ispat etmeye uğraşalım.
Elimizde KKT şartlarını tatmin eden bir x∗ , u∗ , v∗ üçlüsü olduğunu düşünelim, ve
bu üçlünün optimal olması gerektiğini ispat edelim, yani x∗ ’in ana u∗ , v∗ ’nin ikiz
problem için optimal olması gerektiğini.. Eğer x∗ , u∗ , v∗ KKT şartlarına uygunsa,
durağanlığa göre

X
m X
r
∗ ∗ ∗ ∗ ∗
g(u , v ) = f(x ) + ui hi (x ) + vj ∗ lj (x∗ ) (3)
i=1 j=1

Bu tabii g tanımı ile bağlı,

g(u∗ , v∗ ) = min L(x, u∗ , v∗ )


x

ve durağanlıkla

= min L(x∗ , u∗ , v∗ )
x

böylece üç üstteki tanım ortaya çıkıyor.


(3) içindeki ikinci terimde tamamlayıcı gevşekliği uygularsak toplamdaki her öge
x∗ için sıfır, toplam sıfır, ikinci terim tamamen sıfır.
KKT koşullarından bir diğeri olurluk, o zaman (3)’teki üçüncü terimde her toplam
öğesi sıfır, toplam sıfır. Geriye tek kalan

X
m

 X r

∗ ∗ ∗ ∗
∗ ∗  ∗
g(u , v ) = f(x )+ u
 ih

i (x ) + v
 j lj (x )
i=1
 
j=1



= f(x∗ )

Eğer g(u∗ , v∗ ) = f(x∗ ) ise o zaman ana ve ikiz kriter arasında ikizlik boşluğu
yoktur demektir, ve daha önce gördüğümüz gibi bu elimizdekinin bir çözüm
olduğunun işaretidir.
Yani birkaç farklı yönden gelerek ispatladık ki x∗ ve u∗ , v∗ KKT koşullarına uyuy-
orsa, o zaman elimizdekiler optimal ana ve ikiz çözümleridir. KKT koşulları her
zaman yeterlidir. Dikkat edilirse dışbükeylikten hiç bahsetmedik, KKT yeterli
(sufficient), onlara uygunluk varsa optimal ana ve ikiz çözüme erişmişiz demek-
tir. Gereklilik (necessary) durumu eğer güçlü dışbükeylik varsa, elimizdeki çözüm

3
KKT koşullarına da uymaya mecbur. Biraz söz cambazlığı gibi gelebilir ama
tanımların net olması, ve ilerideki teorilere faydası açısından bu iyi.
Soru
Eğer KKT koşullarını tatmin etmek optimallik için yeterliyse dünyadaki her prob-
lemi KKT üzerinde rahatça çözebilir miyim?
Hayır çünkü 1. KKT şartı, durağanlık şartıyla problem çıkabilir. Pürüzsüz bir
problem için durağanlık için f ve hi , li ’in gradyanlarını almam yeter, sıfıra eşitlerim
vs. Bir de dışbükeylik varsa tipik olarak altgradyanı yazmak basittir. Sonucu bul-
mak her zaman kolay olmayabilir ama en azından durağanlığı formülize etmek
kolaydır. Fakat bazı fonksiyonlarda dışbükeylik yoksa altgradyanları hesapla-
manın zorluğu ötesinde bazen altgradyan olmayabilir bile. Genelde pürüzsüz
durumlarda KKT koşullarını kullanmanın zor tarafı budur.
Bu sebeple formel bir uyarıyı slaytlara koyduk, “eğer f dışbükey değilse türevi
alınabilir bir f için bile direk ∂f = {∇f(x)} diyemeyiz”.
Eğer ana problemde hiçbir kısıtlama olmasaydı o zaman 2. 3. ve 4. KKT şartları
yokoluyor bu normal çünkü ikiz değişken olmayacak, 1. şarttaki 2. ve 3. terim
yokolur, sadece altgradyanın sıfırı içerme şartı geriye kalıyor. Bazen bilimci-
lerin bu tür problemlerde salt altgradyan optimalliği kullanıp “KKT koşulları
kullandım” dediğini duyabilirsiniz, ben bile dalgınlıkla bunu söyleyebiliyorum
bazen. Fonksiyon var, altgradyanını alıp sıfıra eşitliyorum, bu “KKT koşulu” diy-
orum. Teknik olarak doğru tabii, sadece KKT’nin çok basit bir hali bu.
Örnek
Eşitlik şartları olan karesel bir fonksiyonun minimizasyonuna bakalım.

1
min xT Qx + cT x öyle ki
x 2

Ax = 0

Q  0 olacak, yani Q pozitif yarı-kesin, o zaman üstteki problem dışbükey.


Eşitsizlik şartı yok.
KKT şartlarını yazalım. Lagrangian nedir?

1
L(x, u) = xT Qx + cT x + uT Ax
2

Durağanlık için üsttekinin gradyanını alıp sıfıra eşitlerim,

Qx + c + AT u = 0

Tamamlayıcı gevşeklik

4
(Boş, çünkü eşitsizlik şartları yok)
Ana-ikiz olurluk
İkiz olurluk boş, çünkü eşitsizlik yok, yani u’nin pozitif olma şartı yok. Ana
olurluk ise

Ax = 0

Biliyoruz ki üstteki iki şartı tatmin edersem x ana, u ikiz optimal çözüm olacak.
Güzel değil mi? Hatta bu lineer bir sistem olarak yazılabilir,

    
Q AT x −c
=
A 0 u 0

Eğer üstteki sistemi x, u bulmak için çözersem, optimal noktaları bulabilirim.


Eğer matris tersi alınabilir ise tersini alırım, eşitliğin sağındaki ifade ile çarparım,
bu bana ana-ikiz sonucu verir.
Üstteki matrise bazen KKT matrisi deniyor, KKT koşullarını kullanarak oluşturulduğu
için.
[atlandı, su doldurma problemi, SVM]
Ekler
Örnek
Şimdi [2]’den alınan bir örneği görelim.

min x21 + x22 öyle ki


x1 ,x2

x1 + x2 = 5

Burada bir eşitlikle kısıtlanmış QP (equality constrained QP) var ve biraz önce
gördüğümüz KKT matrisini oluşturarak onu tek adımda çözebiliriz. Kriter ve
kısıtlama matris formunda şöyle, x = (x1 , x2 ) alırsak,

 
1 2 0 T
f(x) = xT

x+ 0 0 x
2 0 2
| {z }
Q
 
  x2
1 1 =5
| {z } x2
A

(Sıfır vektörü var çünkü x21 , x22 içeren terimler var ama x1 , x2 içeren terimler yok)

5
KKT matrisini şöyle oluştururuz,

    
Q AT x −c
=
A 0 u b
     
2 0 1 x1 0
 0 2 1  ·  x2  =  0 
1 1 0 u 5

import numpy.linalg as lin


X = np.array([[2,0,1],[0,2,1],[1,1,0]])
a = np.array([[0],[0],[5]])
print (lin.solve(X,a))
[[ 2.5]
[ 2.5]
[-5. ]]

Doğrulamak için paket ile çözelim,

from cvxopt import matrix


from cvxopt import solvers
Q = matrix([ [2.0, 0], [0, 2.0] ])
p = matrix([0.0, 0.0])
G = matrix([[0.0,0.0],[0.0,0.0]])
h = matrix([0.0,0.0])
A = matrix([1.0, 1.0], (1,2))
b = matrix(5.0)
sol=solvers.qp(Q, p, G, h, A, b)
print (sol['x'])
pcost dcost gap pres dres
0: 1.2500e+01 1.2500e+01 2e+00 1e+00 1e-15
1: 1.2500e+01 1.2500e+01 2e-02 1e-02 0e+00
2: 1.2500e+01 1.2500e+01 2e-04 1e-04 0e+00
3: 1.2500e+01 1.2500e+01 2e-06 1e-06 0e+00
4: 1.2500e+01 1.2500e+01 2e-08 1e-08 0e+00
Optimal solution found.
[ 2.50e+00]
[ 2.50e+00]

Ekler
Soru
Eğer KKT şartını eşitlik sınırlanmış QP (bilahere LP) çözmek için kullanabiliy-
orsam, ve mesela LP diyelim, her eşitsizlik içeren problemi standardizasyon ile
eşitlikle sınırlı probleme çevirebiliyorsam, KKT matrisi ile her türlü LP’yi çözemez
miyim? Niye farklı metotlara giriş yapmak gerekiyor?
Cevap
Standardizasyon sonrası hala elimizde pozitiflik sınırlamaları var, ki bunlar da
birer eşitsizlik sınırı aslında. KKT matrisi çözmek bu eşitsizlikleri tatmin etmez,

6
basit bir matris tersi alıyoruz, elimize geçen değişkenlerin pozitif kalma zorun-
luluğunu bu metot ile zorlayamayız.
Kaynaklar
[1] Tibshirani, Convex Optimization, Lecture Video 12, https://www.youtube.
com/channel/UCIvaLZcfz3ikJ1cD-zMpIXg
[2] Lendek, Optimization Lecture, Quadratic Programming http://www.lendek.
net/teaching/opt_en/

7
Destek Vektor Makinaları (Support Vector Machines)
En basit halleriyle SVM’ler risk minimize eden lineer sınıflayıcısıdırlar.

s
h × (log( 2N
h
) + 1) − log( η4 )
R(Θ) 6 J(Θ) = Remp (Θ) +
N

h: sınıflayıcının kapasitesi
N: eğitim verisinde kaç veri noktası olduğu
Vapnik ve Chernovenkis 1 − η olasılıkla ispaladı ki üstteki denklem doğrudur.
SVM algoritması hem h değerini hem de sayısal, ölçümsel riski aynı anda min-
imize etmektedir, ve bunu sınır noktalarını noktalarını ayırmakla yapmaktadır.
Türetelim,

Karar düzlemi: wT x + b = 0
Şöyle bir tanım yapalım:


q = min x − 0 , wT x + b = 0 sartina gore
x

q, H+ ve H− formüllerini ileride kullanacağız.


Lagrange:

1 2
min x − 0 + λ(wT x + b)
x 2

Gradyanı alalım ve 0 değerine eşitleyelim,

∂ 1 T
( x x + λ(wT x + b)) = 0
∂x 2

1
x + λw = 0

x = −λw

Üsteki sonucu wT x + b = 0 şartına sokalım,

wT (−λw) + b = 0

b
λ=
wT w
Yani çözüm
 
b
x̂ = − w
wT w

O zaman q

b
q = ||x̂ − 0|| = − T w


w w

b √
× wT w
wT w

|b|
q=
||w||

Tanım:

H+ = wT x + b = +1

H− = wT x + b = −1

grafikte görüldüğü gibi yani. Üstteki şekilde tanımın bir zararı yok (çünkü +1,-1
sabit durunca ayraç genişlemesi nasıl olacak diye düşünülebilir, ama bu tanım
genelliği kaybetmeden yapabilabiliyor çünkü b, w değerlerinde hala oynanabilir.
q+ ve q− değerlerini hesapla

|b − 1|
q+ =
||w||

2
| − b − 1|
q− =
||w||

Ayraç o zaman şöyle

|b − 1 − b − 1| | − 2| 2
m = q+ + q− = = =
||w|| ||w|| ||w||
2
Ayraçların olabildiğince ayırmasını istiyorsak m’i arttırız (yani ||w||
’i maksimize
ederiz), ya da ||w|| değerini minimize ederiz.
Sınırlar
Veri noktalarını öyle sınıflamak istiyoruz ki + ve - noktalar hiperdüzlemlerin
doğru noktalarında kalsınlar.

wT x + b > +1, ∀yi = +1

wT x + b 6 −1, ∀yi = −1

Bu iki denklemi birleştirelim

yi (wT x + b) − 1 > 0

Her şeyi biraraya koyalım

1
min ||w||2 , yi (wT xi + b) − 1 > 0 olsun.
w 2

Bu form tanıdık geliyor mu? Bu qp ile çözülebilecek karesel (quadratic) bir formül,
programdır!
qp
Python dilinde cvxopt paketi vardır Matlab Optimization Toolbox’da qp() var.
QP fonksiyonları problemleri genelde

1 T
x Px + qT x
2

formunda görmek isterler. Biraz önce elde ettiğimiz denklemi bu istenen formata
doğru “masajlayabiliriz”
İkiz (dual)

3
SVM ihtiyaçları için ikiz formül (dual) ile çalışmak daha rahattır Lagrange (tekrar)
oluşturalım, türevi alalım, ve sıfıra eşitleyelim. Bunun sonucunda elimize KKT
noktaları geçecektir

1 X
Lp = ||w||2 − αi (yi (wT xi + b) − 1)
2 i

∂ X
Lp = w − αi yi xi = 0
∂w i

X
w= αi yi xi
i

∂ X
Lp = − αi yi = 0
∂b i

Üstteki iki denklemi asal (primal) denkleme koyduğumuz zaman

X 1 XX
Maksimize et LD = αi − αi αj yi yj xTi xj
i
2 i j

sınırlar

X
αi yi = 0
i

αi > 0

qp
Bu yine qp() formunda bir problem! Sadece bu sefer çözeceğimiz değişkenler
αi ’lar, x’lar değil. Üstteki denklem şu forma 12 xT Px + qT x masajlanabilir Bunun
yapmak için Pi,j ’ye −yi yj xTi xj değerini atarız. Ve qp’yi çağırırız Sonuç bir α’lar
listesi olacaktır.
b değerini hesaplamak
KKT koşulunun sebebiyle sıfır olmayan her αi için ana problemde ona tekabül
eden kısıtlayıcı şart şıkıdır (tight), yani bir eşitliktir. O zaman sıfır olmayan her αi
için b’yi wT xi + b = yi ifadesini kullanarak hesaplarız. Sıfır olmayan her αi ’dan
gelen b yaklaşık olarak diğer other b’lere eşit olacaktır. Final b’yi hesaplamak için
tüm b’lerin ortalamasını almak sayısal (numeric) olarak daha garantidir.
Sınıflayıcı Tamamlandı

4
Her yeni x noktası için artık sign(xT w + b) ibaresini sınıflayıcımız olarak kullan-
abiliriz. −1 ya da +1 olarak geri gelecek sonuç bize yeni noktanın hangi sınıfa ait
olduğunu söyleyecektir.
Örnek Çıktı

Çekirdekler (Kernels)
Şimdiye kadar lineer ayraçlardan bahsettik. SVM’ler lineer olmayan ayraçlarla
da çalışabilir. Çok basit: Bir temel fonksiyon kullanarak girdiyi daha yüksek
boyuta doğru bir önişlemden geçirirsek bunu başarabiliriz. Algoritmanın geri
kalanı değişmeden kalacaktır.
Gayri Lineer Çekirdek

Esneme Payı Bazen bir problem ayrılmaya müsait olmayabilir. Çok üç nokta-
lardaki bazı noktalar sınıflayıcının çalışmasını imkansız hale getirebilir Bunun
çözümü için sınıflayıcıya ”esneme payı” dahil edebiliriz. Mesela yi = +1 için
verinin yanlış tarafa düşmesini şu durumda izin verebiliriz: wT + b > −0.03
Fakat eklemek gerekir ki bu tür noktaların “çok fazla” olmasını da istemiyoruz,
bu sebeple bu ”yanlış” noktaların sayısına da bir ceza getirebiliriz.

from numpy import linalg


import cvxopt
import cvxopt.solvers

def svm(X, y):


n_samples, n_features = X.shape

# Gram matrix
K = np.zeros((n_samples, n_samples))
for i in range(n_samples):
for j in range(n_samples):

5
K[i,j] = np.dot(X[i], X[j])

P = cvxopt.matrix(np.outer(y,y) * K)
q = cvxopt.matrix(np.ones(n_samples) * -1)
A = cvxopt.matrix(y, (1,n_samples))
b = cvxopt.matrix(0.0)

G = cvxopt.matrix(np.diag(np.ones(n_samples) * -1))
h = cvxopt.matrix(np.zeros(n_samples))

# solve QP problem
solution = cvxopt.solvers.qp(P, q, G, h, A, b)

print solution

# Lagrange multipliers
a = np.ravel(solution['x'])

print "a", a

# Support vectors have non zero lagrange multipliers


ssv = a > 1e-5
ind = np.arange(len(a))[ssv]
a = a[ssv]
sv = X[ssv]
sv_y = y[ssv]
print "%d support vectors out of %d points" % (len(a), n_samples)
print "sv", sv
print "sv_y", sv_y

# Intercept
b = 0
for n in range(len(a)):
b += sv_y[n]
b -= np.sum(a * sv_y * K[ind[n],ssv])
b /= len(a)

# Weight vector
w = np.zeros(n_features)
for n in range(len(a)):
w += a[n] * sv_y[n] * sv[n]

print "a", a
return w, b, sv_y, sv, a

X = np.array([[3.,3.],[4.,4.],[7.,7.],[8.,8.]])
y = np.array([1.,1.,-1.,-1.])
w, b, sv_y, sv, a = svm(X, y)
print "w", w
print "b", b
print 'test points'
print np.dot([2.,2.], w) + b # > 1
print np.dot([9.,9.], w) + b # < -1

pcost dcost gap pres dres


0: -2.9061e-01 -5.0286e-01 6e+00 2e+00 1e+00

6
1: -3.6857e-02 -3.0976e-01 3e-01 4e-16 1e-15
2: -1.0255e-01 -1.2816e-01 3e-02 3e-17 7e-16
3: -1.1074e-01 -1.1128e-01 5e-04 3e-17 7e-16
4: -1.1111e-01 -1.1111e-01 5e-06 4e-17 7e-16
5: -1.1111e-01 -1.1111e-01 5e-08 1e-17 6e-16
Optimal solution found.
{'status': 'optimal', 'dual slack': 7.403425105865883e-08, 'iterations': 5, 'relative
a [ 2.76375125e-08 1.11111073e-01 1.11111073e-01 2.76375125e-08]
2 support vectors out of 4 points
sv [[ 4. 4.]
[ 7. 7.]]
sv_y [ 1. -1.]
a [ 0.11111107 0.11111107]
w [-0.33333322 -0.33333322]
b 3.66666541806
test points
2.33333253877
-2.33333253877

Not: İkizdeki Ld ’yi maksimize ediyoruz, fakat hala qp()’deki minimize ediciyi
çağırıyoruz. Bu sebeple tüm α’ların toplamını temsil eden q’ların negatifini alıyoruz,
np.ones(n_samples) *-1 işleminde görüldüğü gibi. Formüldeki karesel kısım
içinde zaten − 21 negatif ibaresi var, böylece geri kalan formülün değişmesine
gerek yok.
Dayanaklı Kayıp Fonksiyonu ile SVM, Pegasos
SVM problemi alttaki fonksiyonu çözmek anlamına geliyordu,

1
min ||w||2 , s.t. yi (wT xi + b) − 1 > 0
w 2

ki bu bir karesel program idi ve cvxopt paketindeki qp ile çözülebiliyordu. Bazıları


b terimini de atıyorlar, ve

1 X
min ||w||2 + max{0, 1 − yi (wT xi )}
w 2

olarak yazıyorlar. Ayrıca regülarizasyonu kontrol etmek için bir λ sabiti de ek-
leniyor, yani üstte λ||w||2 /2 kullanılması lazım. Regülarize işlemi w’nin norm’unun
küçük olmasını tercih eder, ki bu bazı w değerlerinin sıfıra gitmesini zorlar, yani
bir tür özellik seçme işi bu şekilde gerçekleşmiş olur. Toplam işleminin içindeki
fonksiyona “kayıp fonksiyonu (loss function)” ismi de verilir, eğer bu kayıp fonksiy-
onu tam üstteki gibi ise ona dayanaklı kayıp (hinge loss) denir. Üstte görülen max
ifadesi suna eşittir,


1 − yi · (w · xi ) eğer yi · (w · xi ) < 1
Loss(w, xi , yi ) =
0 diğer

Eğer kayıp fonksiyonunun gradyanını alırsak,

7

∂Loss(w, xi , yi ) −yi xi eğer yi · (w · xi ) < 1
∇L = =
∂w 0 diğer

Böylece bir rasgele gradyan iniş (stochastic gradient descent) yaklaşımını kod-
layabiliriz.

wt+1 = wt − η(λwt + ∇L)

ki η gradyanın ne kadar güncellenme yapacağını kontrol eden bir sabittir.


Ufak Toptan Parçalar (Minibatching)
Güncelleme işlemi tüm veri üzerinde, her veri noktası için yapılabilir, ya da gradyan
güncellemeleri toparlanarak belli sayıda adım sonrası bir toplam güncelleme yapılır.
b büyüklüğündeki ufak parça Bt de rasgele seçilir, ve w’ye uygulanır [3].

1 X
 
wt+1 = wt − η λwt + ∇L
b x ,y ∈B
i i t

import numpy as np, pandas as pd

def predict(w, x):


return np.dot(w.reshape((len(x),1)).T,x)

def train_sgd(data, labels, lam, iter, batch_size):


m,n = data.shape; w = np.zeros(n)
idx = range(m)
eta = 0.0001
for t in range(1, iter):
w_delta = np.zeros(n)
np.random.shuffle(idx)
for j in range(batch_size):
i = idx[j]
p = predict(w, data[i,:])
if labels[i]*p < 1.:
w_delta += labels[i]*data[i,:]
w = (1.0 - eta*lam)*w + (eta/batch_size)*w_delta
return w

import numpy as np, pandas as pd, pegasos, zipfile

with zipfile.ZipFile('svmdata.zip', 'r') as z:


df = pd.read_csv(z.open('features.txt'),sep=',')
labels = pd.read_csv(z.open('target.txt'))

print df.shape, labels.shape

data_train = df.head(5413)
data_test = df.tail(1000)
label_train = labels.head(5413)

8
label_test = labels.tail(1000)

from sklearn.metrics import roc_curve, auc


from sklearn.metrics import roc_auc_score

def show_auc(d1, d2):


fpr, tpr, thresholds = roc_curve(d1,d2)
roc_auc = auc(fpr, tpr)
return 'AUC', roc_auc

(6413, 122) (6413, 1)

np.random.seed(0)

for epoch in [10,50,100,200]:


for batch_size in [1,10,100]:
w = pegasos.train_sgd(np.array(data_train),labels=np.array(label_train),
lam=1, iter=epoch,batch_size=batch_size)
pred = pegasos.predict(w, data_train.T)
score = show_auc(np.array(label_train.T)[0], pred[0])
print 'iter', epoch, 'batch', batch_size, 'egitim', score
pred = pegasos.predict(w, data_test.T)
score = show_auc(np.array(label_test.T)[0], pred[0])
print 'iter', epoch, 'batch', batch_size, 'test', score

iter 10 batch 1 egitim ('AUC', 0.80632699788480933)


iter 10 batch 1 test ('AUC', 0.79744266666666663)
iter 10 batch 10 egitim ('AUC', 0.78954806549498469)
iter 10 batch 10 test ('AUC', 0.78614666666666666)
iter 10 batch 100 egitim ('AUC', 0.76682726584846694)
iter 10 batch 100 test ('AUC', 0.76497599999999999)
iter 50 batch 1 egitim ('AUC', 0.75623733098567281)
iter 50 batch 1 test ('AUC', 0.76376266666666659)
iter 50 batch 10 egitim ('AUC', 0.79475937530208407)
iter 50 batch 10 test ('AUC', 0.7964026666666667)
iter 50 batch 100 egitim ('AUC', 0.75772752003431121)
iter 50 batch 100 test ('AUC', 0.75512000000000001)
iter 100 batch 1 egitim ('AUC', 0.78479444205966464)
iter 100 batch 1 test ('AUC', 0.7882906666666667)
iter 100 batch 10 egitim ('AUC', 0.77260941046884191)
iter 100 batch 10 test ('AUC', 0.77070400000000006)
iter 100 batch 100 egitim ('AUC', 0.75931456118589935)
iter 100 batch 100 test ('AUC', 0.75702400000000003)
iter 200 batch 1 egitim ('AUC', 0.71345805340976809)
iter 200 batch 1 test ('AUC', 0.71764000000000006)
iter 200 batch 10 egitim ('AUC', 0.75268880326726773)
iter 200 batch 10 test ('AUC', 0.74913333333333343)
iter 200 batch 100 egitim ('AUC', 0.75917270896628253)
iter 200 batch 100 test ('AUC', 0.75757600000000003)

Hazır bir SVM kodu scikit-learn kütüphanesi karşılaştıralım,

from sklearn.svm import SVC


clf = SVC(kernel='linear',tol=0.1)
clf.fit(np.array(data_train),np.array(label_train))

9
pred = clf.predict(data_train)
print 'egitim',show_auc(np.array(label_train.T)[0], pred)
pred = clf.predict(data_test)
print 'test',show_auc(np.array(label_test.T)[0], pred)

egitim ('AUC', 0.76903032711566288)


test ('AUC', 0.7533333333333333)

Kaynaklar
[1] Blondel, https://gist.github.com/mblondel/586753
[2] Jebara, T., Machine Learning Lecture, Columbia University
[3] Song, et al., Stochastic gradient descent with differentially private updates
[4] Harrington, Machine Learning in Action
[5] Stanford, Stanford, CS246: Mining Massive Data Sets, http://web.stanford.
edu/class/cs246/

10
Log-Bariyer Yöntemi
Bir dışbükey probleme bakalım şimdi, artık tanıdık olan genel form bu,

min f(x) öyle ki


x
hi (x) 6 0, i = 1, .., m
Ax = b

Tüm bu fonksiyonların dışbükey ve iki kere türevi alınabilir olduğunu farz ediy-
oruz. Şimdi log bariyer metotu uygulayacağız, bu ilk göreceğimiz iç-nokta yöntemi
olacak [1, 14:00].
Bu yöntem ile önce eşitsizlik kısıtlamalarına tekabül eden bir log bariyer fonksiy-
onu tanımlamak gerekiyor. Bu fonksiyon,

X
m
φ(x) = − log(−hi (x))
i=1

Tabii log’un negatif değerler üzerinde işletilemeyeceğini biliyoruz, o sebeple üstteki


eksi ile çarpım var (kısıtlamalara göre hi ’ler eksi olmalı, onu da biliyoruz). Bu
fonksiyon ile yapmaya uğraştığımız gösterge (indicator) fonksiyonunu yaklaşıklamak.
φ’nin tanım kümesi h’ye göre harfiyen olurlu olan x’ler.
Şimdi log bariyerin yaklaşıklamayı nasıl yaptığına gelelim. Eşitlik kısıtlamalarını
atlarsak, üstteki minimizasyon problemi şu şekilde de gösterilebilir [1, 15:53],

X
m
min f(x) + Ihi (x)60 (x)
x
i=1

I her hi ’nin sıfırdan küçük olup olmadığına göre 0 ya da çok büyük değerler verir,
bu yüzden üstteki gibi bir temsil, eşitsizlik kısıtlamalarını kullanmakla eşdeğerdir.
Çünkü minimizasyon problemi doğal olarak çok büyük değerlerden kaçacak, ve
böylece kısıtlamalar dolaylı yoldan problem çözümüne dahil olmuş olacak. Altta
kesikli çizgiyle göstergeç fonksiyonu görülüyor,

1
Diğer kavisli çizgiler ise − log(−u) t1 , her t için farklı bir eğri. t büyütüldükçe log
bariyer fonksiyonunu göstergeci daha da iyi yaklaşık temsil etmeye başlıyor /
ona yaklaşıyor [1, 17:08].
Altta farklı µ değerleri için −µ log(−u) fonksiyonun değerlerini görüyoruz. Fonksiyon
görüldüğü gibi I’ya oldukca yakın.

def I(u):
if u<0: return 0.
else: return 10.0

u = np.linspace(-3,1,100)
Is = np.array([I(x) for x in u])

import pandas as pd
df = pd.DataFrame(index=u)

df['I'] = Is
df['$\mu$=0.5'] = -0.5*np.log(-u)
df['$\mu$=1.0'] = -1.0*np.log(-u)
df['$\mu$=2.0'] = -2.0*np.log(-u)

df.plot()
plt.savefig('func_59_barr_02.png')

Herhalde simdi en yapacagimiz tahmin edilebilir, gostergec fonksiyonlariyla ile


calismak zor, o zaman göstergeç toplamları log toplamları olarak yaklaşıksallanabilir,

1X
m
min f(x) + log(−hi (x))
x t i=1

ki t büyük olacak şekilde çünkü o zaman log, göstergeci iyi yaklaşık olarak tem-
sil ediyor, ardından bu yeni pürüzsüz problemi çözüyoruz, eşitsizlik şartlarına

2
ihtiyaç duymadan.
Log-Bariyer Calculus
φ fonksiyonunun bazı özelliklerini dökmek faydalı olur, ileride Newton meto-
tundan bahsettiğimizde bu özellikler faydalı olacak. φ için gradyan ve Hessian,

X
m
1
∇φ(x) = − ∇hi (x)
i=1
hi (x)

Hessian

X
m X
m
1
2
∇ φ(x) = ∇hi (x)∇hi (x) − T
∇2 hi (x)
i=1 i=1
hi (x)

Merkezi gidiş yolu (central path)


Optimizasyon problemimizi 1/t yerine t carpimi ile de gosterebiliriz, yani

min tf(x) + φ(x) öyle ki


x

Ax = b

Herneyse, merkezi yol x∗ (t), t > 0’nin bir fonksiyonudur, yani her t için eldeki
çözümlerin ortaya çıkarttığı yoldur bir bakıma. Her t için problemin çözümünü
KKT koşulları ile karakterize edebiliriz.

Ax∗ (t) = b, hi (x∗ (t)) < 0, i = 1, .., m

X 1
t∇f(x∗ (t)) − ∇hi (x∗ (t)) + AT w = 0
hi (x∗ (t))

Bu koşullar x∗ (t)’nin optimal olmasının ne demek olduğunu tanımlıyor. İki den-


klemdeki ilk denklem ana olurluktan geliyor, eşitlik sınırlamalarına tekabül eden
tek ikiz değişken var, w, onun işareti üzerinde kısıtlama yok çünkü eşitlik kısıtlaması.
Durağanlık koşulu ikinci denklemde, ona nasıl eriştik? Problemin Lagrangian’i

tf(x) + φ(x) + wT (Ax − b)

Eğer x’e göre gradyan alıp sıfıra eşitlersek durağanlığı elde ederim. Gradyan
yeterli çünkü buradaki tüm fonksiyonlar dışbükey ve pürüzsüz [1, 24:04].

3
Eğer üstteki problemi bir w için çözersem o zaman merkezi yoldaki bir çözümü
belli bir t için karakterize etmiş / tarif etmiş oluyorum. Umudumuz o ki t’yi son-
suzluğa doğru büyüttükçe üstteki KKT koşullarıyla temsil edilen çözümler ori-
jinal problemimdeki çözüme yaklaşmaya başlayacak. Bu olabilir değil mi? t’yi
büyüttükçe log bariyerin nasıl göstergeç fonksiyonuna benzemeye başladığını bi-
raz önce gördük. Bu tür log bariyerlerden oluşan optimizasyon problemi için de
benzer bir durum olacağını tahmin edebiliriz.
Bu kavramları lineer programlar için yakından görebiliriz. Tüm bu yaklaşımlar
bu arada ilk başta LP’ler için ortaya atılmıştır.
Önemli bir örnek,

X
m
T
min tc x − log(ei − dTi x)
x
i=1

Bu bir standart LP’nin bariyerleştirilmiş hali. Eşitlik kısıtlaması yok, ve bariyer


fonksiyonu çokyüzlü kısıtlama Dx 6 e ifadesine tekabül ediyor. Bu problemi
belli bir t için çözersem, t’yi büyütürsem, bunu ardı ardına tekrar edersem umudum
orijinal LP’nin çözümüne yaklaşmak.

Resimde görüldüğü gibi, ortadan başlıyoruz, t = 0’da diyelim, ve t’yi büyüttükçe


yolda ilerliyoruz, ve sonuca erişiyoruz. Gidiş pürüzsüz, ve LP’lerin karakterinden
biliyoruz ki nihai sonuç çokyüzlümün (polyhedra) ekstrem noktalarının birinde
olmalı. Yarı yolda t = 10’daki bir nokta gösteriliyor, nihai sonuç belki t = 100’da
[2, 26:59]
KKT koşulu üzerinden durağanlığı temiz bir şekilde gösterebiliyoruz, ya da iç
nokta ve ortada, merkezde bir yol takip edilmesini zorlama bağlamında, merke-
zlik şartı da deniyor buna, gradyan alınınca

X
m
1
0 = tc − di
i=1
ei − dTt x( t)

Bu demektir ki gradyan ∇(x∗ (t)), −c’ye paralel olmalıdır, ya da {x : cT x =

4
cT x∗ (t)} hiper düzlemi φ’nin x∗ (t)’deki konturuna teğet durmalıdır [1, 28:12].
Ikiz noktalar
Birazdan merkezi yoldan ikiz noktalar alabileceğimizi göreceğiz. Bu çok faydalı
olacak çünkü bu ikiz noktaları bir ikiz boşluğu hesaplamak için kullanacağız.
Merkezi yoldayken bu yoldaki noktalar x ∗ (t)’leri kullanarak olurlu ikiz nok-
talar hesaplayabiliriz. Orijinal probleme tekrar bakarsak, bu problem için ikiz
değişkenleri elde etmek için her eşitsizlik için bir ui ’ye, her eşitlik şartı için bir
vi ’ya ihtiyacım var. Onları nasıl tanımlarım? Merkezi yol üzerindeki çözümler
üzerinden,

1
u∗i (t) = , i = 1, .., m, v∗ (t) = w/t
thi (x∗ (t))

w bariyer problemi için KKT koşullarını çözerken elde ettiğim değişken idi.
Niye üsttekiler orijinal problem için olurlu? Bunu görmek kolay, ilk önce, u∗i (t)’nin
her ögesi harfiyen pozitif, çünkü hi (x∗ (t))’nin her ögesi harfiyen negatif. Bu
bariyer probleminin ana olurluk şartından geliyor. Ayrıca (u∗ (t), v∗ (t)) Lagrange
ikiz fonksiyonu g(u, v)’nin tanım kümesinde (domain). Hatırlarsak Lagrange ik-
izi formülize ettiğimizde tanım kümesinde bazı dolaylı sınırlamalar elde ediyor-
duk. Tarif itibariyle

X
m

∇f(x (t)) + ui (x∗ (t))∇hi (x∗ (t)) + AT v∗ (t) = 0
i=1

Yani x∗ (t), Lagrangian L(x, u∗ (t), v∗ (t))’i tüm x’ler üzerinden minimize edeceği
için g(u∗ (t), v∗ (t)) > −∞. Bu direk durağanlık şartından geliyor işte. O kadar
bariz birşey ki aslında bazen kafa karıştırıyor. Merkezi yol probleminden çözdüğümüz
durağanlık koşulu şöyleydi,

X 1
t∇f(x∗ (t)) − ∗
∇hi (x∗ (t)) + AT w = 0
hi (x (t))

Bir x∗ çözümü ve w olduğunu farz ediyoruz. Tüm formülü t ile bölersem,

X 1 w
∇f(x∗ (t)) − ∗
∇hi (x∗ (t)) + AT = 0
thi (x (t)) t

Tek yaptığımız “üstteki orijinal problemdeki durağanlık şartına çok benziyor”


demek, değil mi, çünkü

X −1 T w
∇f(x∗ (t)) + ∇h i (x∗
(t)) + A =0 (4)
thi (x∗ (t)) t
|{z}
| {z }
ui v

5
desem, orijinal problemin durağanlık şartına benzeyen bir ifade elde etmiş olu-
rum [2, 33:48]. Demiştik ki üstteki ui , v tanımları üzerinden orijinal problem için
olurlu ikiz noktaları alabiliyoruz.
Soru: niye orijinal problem için optimal noktaları elde etmedim? Biraz önce
gördük, durağanlık koşulunu tatmin ettim, ana, ikiz olurluk var.. ama.. tamam-
layıcı gevşeklik tatmin edilmedi. Çok önemli. Onun yerine ne var? ui hi (x) = 0
olması lazım, onun yerine ne var? Tanım itibariyle ui = −1/t.. var. O zaman
sıfıra yakınsak çok yakınsak bölüm büyür, dolaylı olarak t’yi büyüttükçe orijial
problemin KKT koşullarını yaklaşıksallamış oluruz. O zaman log bariyer prob-
lemini çözmüş olmamıza rağmen belli bir t değer için orijinal problem için çözüm
olmamasının sebebi tamamlayıcı gevşekliğin tatmin edilmiyor olması.
Ama elimizdekiler hala çok faydalı, çünkü herhangi bir anda merkez yol üzerinde
t’nin fonksiyonu olarak ne kadar alt optimal olduğumuzu sınırlamak mümkün
oluyor. Bunun için sadece ikiz boşluğunu hesaplıyoruz, o kadar. O zaman u∗ , v∗ ’da
Lagrange ikiz fonksiyonu hesaplıyorum, ve f∗ ile bu Lagrange farkını buluyo-
rum, ve ikiz boşluğu hesaplanmış oluyor. (4)’te gördük ki x∗ Lagrangian’i u∗ , v∗ ’da
minimize eder, o zaman ikizi alttaki gibi hesaplayarak

X
m
g(u∗ (t), v∗ (t)) = f(x∗ (t)) + u∗i (t)hi (x∗ (t)) + v∗ (t)T (Ax∗ (t) − b)
i=1

Büyük toplamdaki ikinci terim sıfır, çünkü merkezi yolda Ax∗ her zaman b’ye
eşittir. Birince terimde, ui ’i −1/t’ye eşitledik, ve bu m kere toplanacak, sonuç

= f(x∗ (t)) − m/t

Yani göstermiş olduk ki merkezi yolun optimallikten olan uzaklığı en fazla m/t
olacaktır,

f(x∗ (t)) − f∗ 6 m/t

Üstteki bariyer metorun işlediğine dair ispata en yakın sonuç, bize diyor ki eğer
herhangi bir t için bariyer problemini çözersem optimalliğe yakınlık her zaman
m/t’den küçük olur. t’yi isteğe bağlı olarak büyüttükçe o ölçüde optimalliğe
yaklaşmış olurum.
Merkezi yolu yorumlamanın bir diğer yolu “sarsıma uğratılmış KKT koşulları”
denen bir teknik üzerinden. Şimdiye kadar gördük ki merkez yol ve ona tekabül
eden ikiz değerler (4)’teki durağanlık şartını çözüyor. ui > 0, hi (x) 6 0, ve Ax =
b. Tamamlayıcı gevşeklik haricinde tüm koşullar tatmin. Esas KKT koşullarında

u∗i (t) · h∗i (t) = 0, i = 1, .., m

6
olurdu, biz onun yerine

u∗i (t) · h∗i (t) = −1/t, i = 1, .., m

dedik. Yani bir anlamda log bariyer fonksiyonunu unutuyoruz, onun yerine şu
probleme bakıyoruz,

X
m

∇f(x (t)) + ui (x∗ (t))∇hi (x∗ (t)) + AT v∗ (t) = 0
i=1

u∗i (t) · h∗i (t) = −1/t, i = 1, .., m

hi (x∗ (t)) 6 0, i = 1, .., m, Ax∗ (t) = b

ui (x∗ (t)) > 0

Ve t’yi büyüterek üstteki problemi çözüyorum. Yani olurluğu, durağanlığı tam


olarak, tamamlayıcı gevşekliği ise yaklaşık olarak çözmüş oluyorum, ve yaklaşıksallığı
gittikçe büyüyen t’ler üzerinden daha sıkı hale getiriyorum. Yani log bariyer
tekniği ile sarsıma uğratılmış KKT koşulları sınırlı problemleri çözmenin iki yolu.
Niye ufak t ile başlayıp büyütüyorum [2, 02:19]? Çünkü pratikte bu iyi işliyor.
Niye işlediğini görmek zor değil, t küçükken tüm fonksiyon oldukca pürüzsüz,
ve onun üzerinde Newton adımları rahat işler. Ama t’yi büyüttükçe onun kon-
trol ettiği fonksiyon kısımlarını gittikçe daha az pürüzsüz yapmaya başlıyorum,
ama bu çok kötü değil çünkü bu noktada çözüm bölgesine kabaca yaklaşmış ol-
malıyım.
Yakınsama analizi (convergence analysis)
Teori
Diyelim ki merkezleştirme adımlarını kesin olarak çözebiliyoruz, yani, diyelim ki
ne zaman Newton metotunu uygularsam mükemmel bir sonuç alıyorum. Tabii
ki bu gerçekte olmuyor ama farz edelim. O zaman, sadece t’yi her adımda µ ile
çarpmamızın doğal sonucu olarak ve ikizlik boşluğununun m/t olması sebebiyle
k adım sonrası alttakini görürdük,

m
f(x( k)) − f∗ 6
µk t0

Bu ifade diyor ki istenen  seviyesinde bir doğruluğa erişmek için

log(m/(t(0) ))
log µ

7
tane merkezleştirme adımına ihtiyacımız var.
Olurluk metotu (feasibility method)
Bariyer metotunun bir noktadan başlaması gerekir ve bu nokta olurlu olmalıdır.
Olurlu derken

hi (x) < 0, i = 1, .., m, Ax = b

şartlarına uyan bir noktadan bahsediyorum. Fakat ya öyle bir nokta elimizde
yoksa? Başta olurlu olan bir noktayı bulmanın kendisi de zor bir problem. Böyle
bir noktayı elde etmek için olurluk metotu denen bir yöntem kullanmak gereke-
cek. Boyd’un kitabı [4, Bölüm 11] bu metota “1. Faz (Phase I)” ismi veriyor, prob-
lemin kendisini çözmeye “2. Faz” diyor. Pratikte bariyer metotunu kullanmak
isteyenler bunu hatırlamalı.
Harfiyen olurlu bir noktayı nasıl buluruz? Kulağa biraz dolambaçlı gibi gelebilir
ama bu noktayı bulmak için ayrı, farklı bir optimizasyon problemi daha kurarız,
onu da bariyer metotu ile çözeriz. Tabii illa bariyer metotu olması gerekmez,
ana-çift iç-nokta yöntemi de olabilir, ama her halükarda alttaki problemi çözeriz.
Bu problemde elimizde iki tane değişken grubu var, x, s. Problem [2, 23:02],

min s öyle ki
x,s

hi (x) 6 s, i = 1, .., m
Ax = b

Amaç harfiyen negatif bir s elde etmek, böylece hi (x) 6 s üzerinden ana prob-
lemin eşitsizlik şartları tatmin olacak, ayrıca Ax = b’e uygun bir başlangıç noktası
elde edilmiş olacak ki bu da ana problem için gerekli.
Bu problemi bariyer metotu ile çözmek oldukca kolay, ana problemin kendisi
kadar zor değil. Niye? İki sebep: ilki, üstteki problemi çözmek için de harfiyen
olurlu bir başlangı noktası lazım, ama bu noktayı bulmak aslında çok kolay. Bana
tek gereken eşitlik kısıtlaması Ax = b’yi tatmin eden bir x bulmak, ama bu lineer
bir sistem çözümü, her lineer cebir paketi bunu çözer. Ardından elde edilen x
ile hi (x)’i hesaplamak, ve bunların en büyüğünü artı mesela 0.01 diyerek kullan-
mak [2, 24:00]. Elde edeceğimiz sonuç üstteki problem için harfiyen olurludur,
eşitsizlik kısıtlamalarına harfiyen uygun. Şimdi elimde bir başlangıç x’i ve s’i var,
ve buradan başlayarak bariyer metotunun adımlarını uygulayabilirim. İşin güzel
tarafı durma şartımız çok basit, s’in her ögesinin negatif olduğunu gördüğüm
anda şak diye durabilirim, yani üstteki programın “optimal” olmasıyla ilgilen-
miyorum sonuçta bana tek gereken ana problemim için olurlu bir başlangıç nok-
tası. Çoğunlukla yapılan tarif edilen şekilde x, s bulmak ve bunu ardı ardına yap-
mak ta ki tamamen negatif elde edilene kadar ve o noktada durulur, ana prob-
leme dönülür.

8
Alternatif olarak şu problem de çözülebilir,

min 1T s, öyle ki
x,s

hi (x) 6 si , i = 1, .., m
Ax = b, s > 0

Bu metotun avantajı eğer sistem olurlu değilse hangi kısıtlamanın harfiyen yerine
getirilemediğini bize söyler. Dezavantaj çözmesinin biraz daha zor olabilmesi.
Ekler
Bir diğer başlangıç noktası bulma metotu, Faz I yaklaşımı daha [5]. Burada

min t, öyle ki
Ax = b, x > (1 − t)1, t>0

problemini çözüyoruz, ki değişkenler x ve t ∈ R. Eğer üstteki problemde t < 1


olacak şekilde olurlu bir x, t bulabilirsek, o zaman elimizdeki x orijinal problem
için de harfiyen olurlu olacaktır. Argümanın tersi de geçerli, esas LP harfiyen
olurludur sadece ve sadece t∗ < 1 ise ki t∗ Faz I probleminin optimal değeri.
Ama şimdi üstteki problem için nasıl başlangıç değeri buluruz sorusu var, ama bu
daha basit. Ax0 = b’ye çözüm olan herhangi bir x0 ’yu alırız, ve t0 = 2 − mini x0i
seçeriz. Tabii eğer mini x0i < 0 değil ise, yani tüm xi ’lar pozitif ise, o zaman iş
bitti demektir, x0 zaten harfiyen olurlu. Değil ise log bariyer ile devam edeceğiz,
problemi standart forma çevirmek için z = x + (t − 1)~1 diyebiliriz,

z = x + t~1 − ~1

Ya da

x = z − t~1 + ~1

Bunu Ax = b üzerinde uygularsak,

A(z − t~1 + ~1) = b

Az − At~1 = b − A~1

Eşitliğin solundakiler yerine x’i genişletip t için yeni bir hücre yaratabiliriz, ve
A’ya yeni kolon ekleriz, bu kolondaki her öge mevcut A’nin satırlarının toplamının
negatifi olur. Bedel vektörü de c = [0, 0, ..., 1] haline gelir, son öğe t için.

9
Standard LP çözen bariyer metot temelli [3] kod alttadır.

import numpy as np

def lp_acent(A,b,c,x_0):
b = b.flatten()
c = c.flatten()
ALPHA = 0.01
BETA = 0.5
EPSILON = 1e-6
MAXITERS = 100
if (np.min(x_0)<=0) and (np.linalg.norm>1e-3):
print ('failed' )
return 0
lambda_hist = []
x = x_0
for iter in range(MAXITERS):
g = c-np.power(x,-1)
w = np.linalg.solve(np.dot(np.dot(A,np.diag(np.power(x,2))),A.T),
np.dot(np.dot(-A,np.diag(np.power(x,2))),g))
dx = np.dot(-np.diag(np.power(x,2)),np.dot(A.T,w)+g)
lambdasqr = np.dot(-g.T,dx)
lambda_hist.append(lambdasqr/2)
if lambdasqr/2 <= EPSILON:
break
t = 1
while np.min(x+t*dx)<=0:
t =BETA*t
while np.dot(c.T,np.dot(t,dx))- \
np.sum(np.log(x+t*dx))+np.sum(np.log(x))-\
ALPHA*t*np.dot(g.T,dx)>0:
t = BETA*t
x = x+t*dx
if iter == MAXITERS:
print ('ERROR: MAXITERS reached')
else:
return x,w,lambda_hist

def lp_barrier(A,b,c,x_0):
T_0 =1
MU = 20
EPSILON = 1e-3
n = len(x_0)
t = T_0
x = x_0.flatten()
history = []
while True:
x_star, nu_star,lambda_hist = lp_acent(A,b,t*c,x)
x = x_star
gap = n/t
history.append(lambda_hist)
if gap<EPSILON:
break
t = MU*t
return x_star,nu_star,gap

10
def lp_solve(A,b,c):
m,n = A.shape
nsteps = np.zeros((2,1))
x0 = np.linalg.lstsq(A,b)[0]
t0 = 2+np.max([0,-np.min(x0)])
if np.min(x0)>0.0:
print ('Ax=b solution already feasible')
x_0 = x0
else:
print ("phase I")
A1 = np.hstack((A,np.dot(-A,np.ones((n,1)))))
b1 = b-np.dot(A,np.ones((n,1)))
z0 = x0+t0*np.ones((n,1))-np.ones((n,1))
c1 = np.vstack((np.zeros((n,1)),1))
z_star,nu_star,gap = lp_barrier(A1,b1,c1,np.vstack((z0,t0)))
if z_star[n] >= 1:
print ('Problem is infeasible')
exit()
x_0 = z_star[0:n]-(z_star[n]*np.ones((n,1))).flatten()+\
np.ones((n,1)).flatten()

x_star,nu_star,gap = lp_barrier(A,b,c,x_0)
return x_star,gap,nsteps

Örnek olarak uyduruk bir problem seçtik, problem özellikle başta olurlu nokta
bulamayacak şekilde ayarlandı, böylece gidip kendimizin bulması gerekiyor.

import numpy as np
from scipy.optimize import linprog
import barr

import barr

A = [[1., 1., 1., 0.],


[1., 3., 0., 1.],
[9., 1., -3., 1.]]
b = [[5., 7., -1]]
c = [[-1., -5., 0., 0. ]]

A = np.array(A)
b = np.array(b).T
c = np.array(c).T

x_star,gap,nsteps = barr.lp_solve(A,b,c)

print ('log bariyer ==========')


print (x_star)

res = linprog(c, A_eq=A, b_eq=b)


print ('linprog ===============')
print (res)

phase I

11
[[1.44060995]
[3.1918138 ]
[3.37720706]
[1. ]
[2.00321027]]
log bariyer ==========
[4.37502314e-01 2.18747454e+00 2.37502314e+00 7.40628401e-05]
linprog ===============
con: array([ 2.05213624e-11, 2.05719886e-11, -9.18283227e-11])
fun: -11.37499999994356
message: 'Optimization terminated successfully.'
nit: 4
slack: array([], dtype=float64)
status: 0
success: True
x: array([4.3750000e-01, 2.1875000e+00, 2.3750000e+00, 1.0991855e-11])

Şimdi daha önce de çözdüğümüz bir örneğe tekrar bakalım,

min −x1 − 5x2 öyle ki


x
x1 + x2 + x3 = 5
x1 + 3x2 + x4 = 7
x1 , x2 , x3 , x4 > 0

A = np.array([[1, 1, 1, 0],
[1, 3, 0, 1]])
b = np.array([5,7])
c = np.array([-1, -5, 0, 0 ])
A = np.array(A)
b = np.array(b).T
c = np.array(c).T

x_star,gap,nsteps = barr.lp_solve(A,b,c)

print ('log bariyer ==========')


print (x_star)

res = linprog(c, A_eq=A, b_eq=b)


print ('linprog ===============')
print (res)
Ax=b solution already feasible
log bariyer ==========
[1.87451194e-04 2.33324585e+00 2.66656670e+00 7.49883368e-05]
linprog ===============
con: array([1.18571819e-11, 1.18527410e-11])
fun: -11.66666666664022
message: 'Optimization terminated successfully.'
nit: 4
slack: array([], dtype=float64)
status: 0
success: True
x: array([1.15454732e-13, 2.33333333e+00, 2.66666667e+00, 3.96953400e-12])

12
Bu durumda Ax0 = b çözümü başlangıç için yeterliydi ve o kullanıldı.
Gradyan ve Hessian
Pek çok yerde kullanılan bir eşitsizlik görelim, mesela bütün xi < 0 olduğu bir
durum, yani hi (x) = −x. O zaman bariyer neye benzer?

X
n
φ(x) = − log xi
i=1


1/x1
∇φ(x) = −  ...  = −X−1~1
 
1/xn

Burada X matrisi
 
x1
X = diag(x) = 
 .. 
. 
xn

ve ~1 sembolu tamamen 1’lerden oluşan matris.


Hessian
 
1/x21
∇2 φ(x) = 
 ..  = X2

.
1/x2n

Eski Anlatım

min f(x), öyle ki,


x

ci (x) > 0, i = 1, 2, .., m

ci ile gösterilen eşitsizlik içeren (üstte büyüklük türünden) kısıtlamalar olduğunu


düşünelim. Bu problemi nasıl çözeriz?
Bir fikir, problemin eşitizliklerini bir gösterge (indicator) fonksiyonu üzerinden,
Lagrange yönteminde olduğu gibi, ana hedef fonksiyonuna dahil etmek, ve elde
edilen yeni hedefi kısıtlanmamış bir problem gibi çözmek. Yani üstteki yerine,
alttaki problemi çözmek,

X
m
min f(x) + I(ci (x))
x
i=1

13
ki I pozitif reel fonksiyonlar için göstergeç fonksiyonu,


0 u60
I(u) =
∞ u>0

Bu yaklaşımın nasıl işleyeceğini kabaca tahmin edebiliriz. I fonksiyonu 0’dan


büyük değerler için müthiş büyük değerler veriyor, bu sebeple optimizasyon
sırasında o değerlerden tabii ki kaçınılacak, ve arayış istediğimiz noktalara doğru
kayacak. Tabii x1 > 3 gibi bir şart varsa onu x1 − 3 > 0 şartına değiştiriyoruz ki
üstteki göstergeci kullanabilelim. Bu yaklaşıma ”bariyer metotu” ismi veriliyor
çünkü I ile bir bariyer yaratılmış oluyor.
Fakat bir problem var, göstergeç fonksiyonunun türevini almak, ve pürüzsüz ra-
hat kullanılabilen bir yeni fonksiyon elde etmek kolay değil. Acaba I yerine onu
yaklaşık temsil edebilen bir başka sürekli fonksiyon kullanamaz mıyız?
Log fonksiyonunu kullanabiliriz. O zaman eldeki tüm ci (x) > 0 kısıtlamalarını

X
m
− log ci (x)
i=1

ile hedef fonksiyonuna dahil edebiliriz, yeni birleşik fonksiyon,

X
m
P(x; µ) = f(x) − µ log ci (x)
i=1

olur. Böylece elde edilen yaklaşım log-bariyer yaklaşımı olacaktır. Mınımizasyon


sırasında hem başta bariyerden kaçınilmiş olunacak, hem de µ küçükdükçe hedefin
geri kalanında istenilen minimal değerlere doğru kayılmış olunacak.
Algoritma olarak optimizasyon şu şekilde gider;
1) Bir x ve µ değerinden başla.
2) Newton metotu ile birkaç adım at (durma kriteri yaklaşıma göre değisebilir)
3) µ’yu küçült
4) Ana durma kriterine bak, tamamsa dur. Yoksa başa dön
Bu yaklaşımın dışbükey (convex) problemler için global minimuma gittiği ispatlanmıştır
[4, sf. 504].
Örnek
min(x1 + 0.5)2 + (x2 − 0.5)2 problemini çöz, x1 ∈ [0, 1] ve x2 ∈ [0, 1] kriterine göre.
Üstteki fonksiyon için log-bariyer,

14
P(x; µ) = (x1 + 0.5)2 + (x2 − 0.5)2 − µ log x1 + log(1 − x1 ) + log x2 + log(1 − x2 )
 

Bu formülasyonu nasıl elde ettiğimiz bariz herhalde, x1 > 0 ve x1 6 1 kısıtlamaları


var mesela, ikinci ifadeyi büyüktür işaretine çevirmek için eksi ile çarptık, −x1 >
1, ya da 1 − x1 > 0 böylece log(1 − x1 ) oldu.
Artık Newton yöntemini kullanarak sanki elimizde bir kısıtlanması olmayan fonksiyon
varmış gibi kodlama yapabiliriz, P’yi minimize edebiliriz. Newton yönü d için
gereken Hessian ve Jacobian matrislerini otomatik türevle hesaplayacağız, belli
bir noktadan başlayacağız, ve her adımda d = −H(x)−1 ∇f(x) yönünde adım at-
acağız.

from autograd import numpy as anp, grad, hessian, jacobian


import numpy.linalg as lin

x = np.array([0.8,0.2])
mu = 2.0
for i in range(10):
def P(x):
x1,x2=x[0],x[1]
return (x1+0.5)**2 + (x2-0.5)**2 - mu * \
(anp.log(x1) + anp.log(1-x1) + anp.log(x2)+anp.log(1-x2))

h = hessian(P)
j = jacobian(P)
J = j(np.array(x))
H = h(np.array(x))
d = np.dot(-lin.inv(H), J)
x = x + d
print (i, x, np.round(mu,5))
mu = mu*0.1

0 [0.61678005 0.34693878] 2.0


1 [-0.00858974 0.486471 ] 0.2
2 [-0.02078755 0.49999853] 0.02
3 [-0.18014768 0.5 ] 0.002
4 [-0.49963245 0.5 ] 0.0002
5 [-0.50002667 0.5 ] 2e-05
6 [-0.50000267 0.5 ] 0.0
7 [-0.50000027 0.5 ] 0.0
8 [-0.50000003 0.5 ] 0.0
9 [-0.5 0.5] 0.0

Görüldüğü gibi 5. adımda optimal noktaya gelindi, o noktada µ oldukca küçük,


ve bariyerle tanımladığımız yerlerden uzak duruldu, optimal nokta x1 = −0.5, x2 =
0.5 bulundu.
Kaynaklar
[1] Tibshirani, Convex Optimization, Lecture Video 15, Part 1, https://www.youtube.
com/channel/UCIvaLZcfz3ikJ1cD-zMpIXg

15
[2] Tibshirani, Convex Optimization, Lecture Video 15, Part 2, https://www.youtube.
com/channel/UCIvaLZcfz3ikJ1cD-zMpIXg
[3] Bao, LP-Solver, Github, https://github.com/rayjim/python_proj/blob/
master/hm_8/lp_solver.py
[4] Boyd, Convex Optimization
[5] Boyd, Convex Optimization, Solutions to additional exercises

16
Ana-Çift İç Nokta Metotları (Primal-Dual Interior-Point Methods)
Şimdiye kadar gördüğümüz problem tiplerini hatırlayalım şimdi ve çözme zorluğu
açısından sıralayalım. En üstte, en basit olan karesel problemlerdi,

1
min xT Qx + cT x
x 2

formunda oluyorlardı. Bu problemler en basiti, eğer Q pozitif yarı-kesin ise. Basit


çünkü gradyanı alıp sıfıra eşitliyorum, pat diye sonucu buluyorum.
Sonraki seviye, biraz daha zor, üstteki probleme Ax = b formunda eşitlik kısıtlaması
getirmek. Bu problemi de kapalı / analitik halde (closed-form) çözebiliriz, KKT
koşullarını kullanarak. Ax = b ifadesini ek değişkenler üzerinden kritere ekleriz,
Lagrangian’ı oluştururuz, KKT koşulunda iki tane öğe olur, durağanlık, ve ana
olurluk, bu iki öğeyi eşzamanlı olarak çözerek sonuca ulaşırız, koca bir lineer
sistemdir bu.
Bir sonraki pürüzsüz minimizasyon, yani üstteki kriterin yerine f(x) kullanmak
ki f(x) bir pürüzsüz fonksiyon. Bu durumda Newton metotu kullanıyoruz, bu
metot Ax = b kısıtlamasında f(x) minimizasyonunu birkaç adımda çözmeye
uğraşıyor, bunu her adımda f(x)’e bir karesel yaklaşıklama yaparak başarıyor.
Sonraki seviye ise iç nokta metotları, eşitlik kısıtlamalarına ek olarak hi (x) 6
0, i = 1, .., m formunda eşitsizlik kısıtlamaları eklemek. Bu derste bu tür prob-
lemleri ana-çift yöntemi ile çözeceğiz, daha önceki bir derste bariyer yöntemi iç
nokta metotu ile çözdük.
Genel olarak yaptığımız herhangi bir seviyedeki problemi çözmeye uğraştığımızda
onu bir önce seviyedeki probleme indirgemek, problemi belli adımlara bölerek
her adımda nasıl işlediğini bildiğimiz önceki seviyedeki tekniği uygulamak. Bariyer
metotunda öyle oldu mesela, eşitsizlik problemini bariyer terimini kritere ekley-
erek bilinen Newton adımlarıyla onu çözmeye uğraştık.
Ana-çift metotu biraz daha farklı olacak. Onu öğrendiğimizde göreceksiniz ki
bir problemi açık bir şekilde başka bir probleme indirgemediğini göreceksiniz [1,
5:55]. Bu tekniği sarsıma uğratılmış KKT koşulları ışığında ele almak lazım, ana
prensibi bu.
[bariyer metot özeti atlandı]
Ana-çift metotu, bariyer metodundan farklı olarak, t parametresinin güncellemeden
önce sadece tek Newton adımı atar. Yani ana-çift metotunda da yaklaşıksallamanın
kuvvetini kontrol eden bir t var, ama o belli bir t üzerinden yakınsama oluncaya
kadar Newton adımı atmak yerine her t için tek Newton adımı atılıyor. Bu de-
mektir ki dış döngü, iç döngü farkı yok, her şey tek bir döngü içinde.
Bir diğer fark ana-çift döngüsünde giderken üretilen (ziyaret edilen) noktalar illa
olurlu olmayabiliyor. Yapısı itibariyle metot döngüsü sırasında eşitsizlik kısıtlamalarını
tatmin eder, fakat her zaman eşitlik kısıtlamalarını tatmin etmeyebilir. Hatta

1
bazen ikiz olurlu noktalar bile mevcut olmayabilir, bu daha ciddi bir durum.
Hatırlarsak bariyer metotunda ikiz olurlu nokta her zaman vardı ve bu noktayı
bir ikiz boşluğu hesaplamak için kullanabiliyorduk. Bu boşluğu hesaplamak ko-
laydı, her noktada m/t <  değerindeydi.
O zaman ana-çift ile bu hesap yoksa, ne zaman duracağımızı tam bilmiyoruz de-
mektir, demek ki akıllıca uydurma (heuristic) yaparak bir durma şartı bulmamız
lazım.
Pozitif bağlamda ana-çift metotları daha verimli çalışır. İspatına girmeyeceğiz
ama ana-çift yakınsaması lineerden daha iyidir.
Negatif olarak ana-çift metotlarını kabaca, sezgisel kavramak bariyer metotu kadar
direk olmayabilir. Şahsen bu alanda araştırmacı olan ben bile ana-çift metot
adımlarının temelii hatırlamakta bazen zorlanıyorum, bariyer metotunu hatırlamak
basit, kısıtlamanın log’unu alıp kritere ekliyorsunuz, sonra Newton metotu uygu-
luyorsunuz [1, 13:35].
Detaylara gelelim. KKT koşul sarsımını hatırlarsak, bariyer metotunu KKT koşullarında
bir sarsım olarak görebiliyorduk, şu ifadelerde

X
m
∇f(x) + ui ∇hi + AT v = 0 (1)
i=1

ui · hi (x) = (−1/t)1, i = 1, .., m

hi (x) 6 0, i = 1, .., m, Ax = b

ui > 0

Normal sartlarda bloktaki ikinci ifade yerine

ui · hi (x) = 0, i = 1, .., m (2)

olacaktı. Değişen tamamlayıcı gevşeklik yani.


Ana problem neydi?

min f(x) öyle ki


x
Ax = b
hi (x) 6 0, i = 1, .., m

Bu problemin KKT şartları görülen blokta, durağanlık için gradyan alıp sıfıra
eşitlenir, (1) elde edilir, tabii f, hi ’in pürüzsüz ve dışbükey olduğu farz edilir, o

2
sebeple gradyan yeterli, altgradyana gerek yok, vs. Tek değiştirdiğimiz tamam-
layıcı gevşeklik ve onun artık sıfıra eşit olmasını şart koşmuyorum, ufak başka
bir değere, ve doğru işarete sahip olan başka bir değere eşit olmasını zorluyorum,
ui · hi (x) = (−1/t) şartı bu. 1/t gibi bir değerin sebebi aslında log(x)’in türevinin
1/ log(x) olmasıyla alakalı, çünkü log bariyerleştirilmiş kriterin türevini alıp sıfıra
eşitleyince ve ikiz değişkenleri uygun şekilde tanımlayınca log bariyer meto-
tunun orijinal KKT koşulları yerine üstteki şekilde bir problemi çözülebildiğini
görmüştük [1, 16:19], ve t büyütüldükçe görülen değiştirilmiş tamamlayıcı gevşeklik
esas versiyonuna daha da yaklaşıyordu.
Ana-çift metotlarına erişmenin bir diğer yolu sarsımın ortaya çıkarttığı denklem-
leri birarada çözmek ve Newton adımını ona göre atmak [1, 22:55].
Denklemler ayrı ayrı olarak

rdual = ∇f(x) + Dh(x)T u + AT v (6)

rcent = − diag(u)h(x) − 1/t

rprim = Ax − b

Sarsım denklem sistemini sıfıra eşitlemek amacıyla matris formunda düzenlersek,

 
∇f(x) + Dh(x)T u + AT v
r(x, u, v) =  − diag(u)h(x) − 1/t  (3)
Ax − b

ki

   
h1 (x) Dh1 (x)T
h(x) =  . . .  Dh(x) =  ...  (4)
T
hm (x) Dhm (x)

r(x, u, v)’yu sıfıra eşitliyoruz, yani bir anlamda

0 = r(x + ∆x, u + ∆u, v + ∆v)

çözülecek, bunu 1. derece Taylor açılımı ile yaklaşıklarım,

 
∆x
≈ r(x, u, v) + Dr(x, u, v)  ∆u 
∆v

3
Üstteki denklemde (3) ve (4) öğelerini kullanarak özyineli şekilde dönersem gayrı-
lineer denklemi çözmüş olurum. Notasyonu biraz degistirirsek, y = (x, u, v) ile,

0 = r(y + ∆y) ≈ r(y) + Dr(y)∆y

ve ∆y için çözmek istiyoruz.


Ya da, genel bir F için F(y) = 0 çözümü, yani “kök bulmak” amacıyla her döngü
adımında bir ∆y hesaplayabilmek istiyoruz. Şu şekilde

F(y + ∆y) ≈ F(y) + DF(y)∆y

yaklaşıklarsak, ve kök amaçlı F(y) = 0 olmalı ama F(y + ∆y) = 0 da denebilir,

0 ≈ F(y) + DF(y)∆y

−F(y) = DF(y)∆y

∆y = −(DF(y))−1 F(y)

Ya da

DF(y)∆y = −F(y)

Bu problemde F yerine r var.

Dr(y)∆y = −r(y)

O zaman (3)’teki r(y)’nin türevi, yani Jacobian’ı gerekiyor. Üsttekini şöyle yazıyoruz,

P
∇2 f(x) + m 2
    
i=1 ui ∇ hi (x) Dh(x)T AT ∆x rdual
 − diag(u)Dh(x) − diag(h(x)) 0   ∆y  =  rcent  (5)
A 0 0 ∆v rprim

Büyük Jacobian’ı nasıl elde ettik? Mesela (3)’ün ilk satırına bakalım,

∇f(x) + Dh(x)T u + AT v

var, onun x, u, v’ye göre türevlerini almak bize iki üstteki matrisin 1. satır 1. 2.
ve 3. kolonunu veriyor, mesela x’e göre türev alınca bir Pmüstteki2 ifadede 1. ve
T 2
2. terimin türevi alınır, A v yokolur, bu bize ∇ f(x) + i=1 ui ∇ hi (x) verir [1,

4
28:43]. Aynı şekilde devam edersek görülen matrisi elde ederiz. Tüm sistemi ∆y
için çözünce de istediğimiz Newton yönünü elde ederiz.
Bu yönteme ana-çift denmesinin sebebi üstte görülüyor aslında, çünkü dikkat ed-
ersek hem ana hem ikiz değişkenleri aynı sistemde, aynı anda çözüyoruz. Değil
mi? Denklem sistemi KKT koşularının formülize edilmesinden geldi, ve bu koşullarda
ana ve ikiz değişkenler aynı yerde mevcuttur, ve çözerken tüm x, u, v için çözüyoruz.
Not: Bu yaklaşımla bariyer metotuna erişmek mümkün, o durumda sistemden u
çıkartılır, ve geri kalanlar çözülür.
Metotu algoritmik olarak görmeden önce bir konudan daha bahsetmek istiyo-
rum; alternatif ikizlik boşluğu. Bu gerçek ikizlik boşluğu değil, çünkü daha önce
belirttiğimiz gibi bu metotta ikiz değişkenler her zaman olurlu olmayabiliyor.
Bariyer metotu için ikizlik boşluğu basitti, m/t çünkü ui = −1/(thi (x)), i =
1, .., m tanımlamıştık ve bu ikiz olurlu idi. Alternatif boşluk için sanki ikiz olurluk
varmış gibi yapıyoruz, ve

X
m
η = −h(x)T u = − ui hi (x)
i=1

hesabını yapıyoruz. Eğer üstteki hesabı bariyer problemi için yapıyor olsaydık,
ui = −1/t tanımlamış olacaktık ve o zaman bariyer metotu için olan boşluğu
elde edecektik. Ana-çift yönteminde böyle değil tabii, sistemi çözerken ui için de
çözüm yapıyoruz, onu önceden tanımlamıyoruz, fakat üstteki formu kullanarak
alternatif ikizlik boşluğunu elde edebiliriz. η her zaman pozitif olacak, çünkü
kendimizi her zaman hi (x) 6 0 olacak şekilde kısıtlayacağız, ve ui > 0 zaten, o
zaman çarpımlarının ekşi ile çarpılması pozitif sonuç verir.
Tüm bunları durma şartı için nasıl kullanırız? Her ne kadar ui ’lar olurlu olmaya-
bilse bile yine de boşluğu hesaplıyoruz, ardından ikiz değişkenlerin olurluğa ne
kadar yakın olduğunu ayrı bir yerde hesaplıyoruz. Yani eğer alternatif boşluk
az, ve olurluğa yakınlık varsa, akıllıca bir uydurma ile kullanarak durma / dur-
mama kararı verebiliriz. Gerçi bu teknik uydurmadan biraz daha iyi aslında, ana-
çift metotunun yakınsadığına dair matematiksel ispatlar var, fakat terminolojik
olarak bu boşluk hesabı gerçek bir boşluk hesabı değil.
Artık metotu tanımlayabiliriz. Bir harfiyen olurlu x(0) ile başla, yani bu nokta
hi (x(0) ) < 0, ve Ax(0) = b. Ayrıca u(0) > 0, v(0) herhangi bir değer. Alternatif
ikizlik boşluğu η(0) = −h(x(0) )T u(0) olarak tanımla [1, 45:21].
t’yi büyütmek için µ > 1 kullanıyoruz. Her döngü sonunda eski t’yi µ ile çarpıp
yeni t elde edeceğiz.
Adımlar
1) t = µm/η(k−1) tanımla.
2) Ana-çift güncelleme yönü ∆y’yi hesapla (nasıl yapılacağını gördük, (5)’teki

5
lineer sistemi çözerek).
3) Geri iz sürme (backtracking) tekniği ile adım büyüklüğü s’yi hesapla (birazdan
nasıl yapılacağını göreceğiz)
4) y(k) = y(k−1) +s·∆y ile y’yi güncelle. Yani bu hesapla tüm ana, ikiz değişkenleri
güncellemiş oluyoruz, x, u, v.
5) Alternatif ikizlik boşluğunu hesapla η(k) = −h(x(k) )T u(k) .
6) Ana ve ikiz artıklar ufak ise, yani eğer η(k) <  ise ve (||rprim ||22 + ||rdual ||22 )1/2 <
 ise dur.
rprim hatırlarsak eşitlik sınırlamasından ne kadar uzak olduğumüz. rdual ise
durağanlık şartıydı, onun sıfırdan ne kadar uzak olduğuydu. Niye ona “ikiz
(dual)” etiketi verdik? Bunun ikiz olurluk ile ne alakası var? Burada biraz nüans
var..
Not: artık kelimesini kullandık daha önce rdual ikiz artık, rprim ana artık.
Hatırlarsak u, v üzerindeki kısıtlamalar nelerdi? u > 0, ve v herhangi bir şey
olabilir. Ama dolaylı bir kısıtlama daha var aslında, o da u, v’nin Lagrange iki
fonksiyonunun tanım alanında olma zorunluluğu.. Ve bu kısıtlamalar işte (6)’dan
başlayan üç denklemde aslında belirtiliyor. Yani, çünkü eğer alttaki sıfır ise

∇f(x) + Dh(x)T u + AT v = 0

bu sadece ve sadece doğru olabilir x eğer x üzerinden L(x, u, v)’i minimize ediy-
orsa. Ki bu durumda

g(u, v) = L(x, u, v)

doğru olur. Yani x Lagrangian’ı minimize ediyorsa, tanım itibariyle L(x, u, v) eksi
sonsuzluk değildir. Değil mi? Çünkü eksi sonsuzluğa gidiş olmasın diye ik-
izde spesifik kısıtlamalar getirdik. Ve bu da demektir ki u, v Lagrangian’ın tanım
alanında olmalı.
Geriye İz Sürme
Üstteki algoritmada #4 adımında bir adım atıldığını gördük, fakat bu adım atılırken
s’nin nasıl bulunacağını anlatmadık. Adım atılırken y+ = y + s∆y ile, hi (x) 6 0,
ve ui (x) > 0 şartlarının hala geçerli olmasını garantilemek istiyoruz, ve s’yi bu
olacak şekilde seçeceğiz. Tabii y+ = y + s∆y derken

x+ = x + s∆y

u+ = u + s∆y

6
v+ = v + s∆y

demek istiyoruz. Bu seçim şöyle yapılabilir, önce s’yi her öge için ui > 0, i =
1, .., m olacak sekide mümkün en büyük adımdan başlarız. Bu çözüm kolaydır,
çünkü her ui için her ∆ui bizi sıfıra yaklaştırıyor mu, eğer yaklaştırıyorsa sıfıra
gelmeden ne kadar uzağa gidebiliriz sorusunuz sorabiliriz, ve tüm bu uzaklıklar
arasından en ufak olanı s seçimi için başlayacağımız en büyük uzaklık olacaktır.
Matematiksel olarak

smax = min 1, min{−ui /∆ui : ∆ui < 0}

Tabii harfiyen olurluk istiyoruz, yani u > 0 o zaman bulunan büyüklüğün 0.999’ü
kadarını alırız. Bu değeri alınca oradan “geriye iz sürmeye” başlarız, yani küçülte
küçülte bu sefer h şartlarını da tatmin eden bir s aramaya başlayabiliriz. Bu ara-
mayı yaparken u işaretini tatmin edeceğimizden eminizdir çünkü en büyük s’yi
özellikle u için ayarladık.
Döngünün bu aşamasında her küçültme sonrası alttaki şartları da kontrol edeceğiz,
şu şekilde;
s = βs yap, ta ki
1 - hi (x+ ) < 0, i = 1, .., m.
2 - ||r(x+ , u+ , v+ )||2 6 (1 − αs)||r(x, u, v)||2
olana kadar. 2. şartta eşitsizliğin sol tarafı sarsıma uğratılmış KKT koşulları, onu
1 − αs oranında azaltıyorum.
Ya da şu şekilde bakabiliriz, 1. kontrolda s’i ana olurluk tatmin oluncaya kadar
azalt. Ondan sonra 2. adım üzerinden normal geriye iz sürme gerçekleştir.
Artik elimizde ana-cift metotunu kodlamak icin gereken her sey var. Bir ornek
uzerinde gorelim, standart form LP.

min cT x, öyle ki
x

Ax = b
x>0

ki c ∈ Rn , A ∈ Rm×n , b ∈ Rm .
Ikiz

max öyle ki
u,v

AT u + u = c

7
u>0

Bu formu ezberlemek aslında faydalı olabilir çünkü optimizasyonda başka yer-


lerde bu formu görebilmek faydalı olabiliyor.
Ana-çift metotu bu problem üzerinde işleyecek, ve bize olurluğa çok yakın olan
hem ana hem de ikiz problem için bir çözüm verecek. Ax = b, ya da AT u +
u = c şartını tam olarak tatmin etmiyor olabilirim ama onlara yakın bir yerde
olacağım. Tabii ana-çift metotu işleyişi sırasında doğal olarak bu şartlara yakın
durmayabilir, o sebeple artıkları kontrol ediyoruz.
Şimdi bu konunun tarihi hakkında biraz konuşalım. Lineer programları ilk çözen
araştırmacı Dantzig, simplex adlı bir metodu keşfetti. Hala bu yöntem LP çözmek
için en yaygın metotdur. Ne yazık ki onu LP’ler ötesine genelleştirmek mümkün
değil, o sebeple bu derste onu işlemedik. İç nokta metotları, kıyasla, çok daha
geniş bir problem sınıfında geçerlidir, Newton metotu, gradyan inişi, hep bu
bağlamda devreye girer, vs.
Tabii simplex değişik bir mahluktur, “direk yöntem” denen bir metot sınıfındadır,
şimdiye kadar gördüğümüz metotlarda olduğu gibi döngü içinde daha iyi, daha
iyi çözüme gitmiyor, en iyi, kesin çözümü bulmaya uğraşıyor [tabii lineerlik bu-
rada faydalı herhalde, ayrıksal şekilde seçenek arama açısından, ama diğer yan-
dan lineerlik ötesine geçilemiyor].
Simplex iyi isler fakat bir sure sonra anlasildi ki en-kotu durum cetrefilligi oldukca
kotu.
İç-nokta metotları simplex’den sonra geliştirildi, burada 70’ler, 80’lerde müthiş
bir aktivite oldu. Khachiyan ve Karmarkar burada önemli isimler, LP’ler için
ilk ispatlanabilir polinom zamanlı çözümü geliştirdiler. Khachiyan’ın metotu
elipsoid yakasımını kullanıyordu, teorik olarak çok kuvvetliydi ama pratikte ne
yazık ki böyle olmadığı görüldü, fakat en azından alternatif bir şekilde LP çözülebileceğini
gösterdi. Karmarkar’ın buluşu en önemlisi, buluşu bugün gördüğümüz ana-
çift iç nokta yöntemine benziyordu, ispatlanabilir polinom hızdaydı, ve pratikte
oldukca verimliydi. Karmarkar’ın yaklaşımı iç-nokta alanında bir araştırma pat-
lamasına sebep oldu.
Örnekle devam edelim. Bir LP’yi ana-çift yöntemi ile çözeceğiz ve farklarına
bakacağız. Standart form LP’nin KKT koşulları,

AT v + u = c
xi ui = 0, i = 1, .., n
Ax = b
x, u > 0

İç-nokta yöntemleri ilk ve son iki şarta uyacak şekilde ayarlanır ve döngü içinde
yavaş yavaş 2. şartı yerine getirmeye uğraşır [2, 13:47].

8
Sarsıma uğratılmış KKT şartları, üstteki formülde tamamlayıcı gevşeklik için eşitlikte
1/t kullanarak elde edilir,

AT v + u = c
xi ui = 1/t, i = 1, .., n
Ax = b
x, u > 0

Sonra üstteki tüm eşitlik sınırlamalarını alıyorum (eşitsizlikleri döngü sırasında


tatmin etmeye uğraşacağım) ve onları bir matriste istifliyorum,

0 = rpd (x, u, v)

 
AT v + u − c
=  diag(x)u − (1/t) 
Ax − b

Sonra matrisin türevini alıyorum, bir lineer yaklaşıklama yaratıyorum, güncelleme


yönünü buluyorum, geriye iz sürme yapıyorum, vs [2, 15:42].
Genel olarak ana-çift yönteminin (log bariyere nazaran) daha büyük bir sistemi
çözdüğünü söyleyebiliriz, 0 = rpd (y + ∆y) ≈ rpd (y) + Drpd (y) + Drpd (y)∆y
diyoruz, ve alttaki sistemi çözüyoruz,

  
0 I AT ∆x
 diag(u) diag(x) 0   ∆u  = −rpd (x, u, v)
A 0 0 ∆v

Güncelleme için her t ile tek bir adım atıyorum,m adım y+ = y + ∆s (tabii s > 0
için çizgi araması yaparak) ama tek bir kez. Sonra t = µt ile t’yi güncelliyorum
[1, 18:13].
Ekler
LP Kodu
Altta şimdiye kadar anlatılan metotlar ile çözüm yapan ve sonucu linprog çağrısı
ile karşılaştıran bir kod [5] görüyoruz. Çözülen problem [4, sf. 209]

min −x1 − 5x2 öyle ki


x

x1 + x2 + x3 = 5
x1 + 3x2 + x4 = 7
x1 , x2 , x3 , x4 > 0

9
import numpy as np
from scipy.optimize import linprog
from numpy.linalg import matrix_rank

def solve(c, A, b, epsilon=0.0001):


if matrix_rank(A) < min(A.shape[0], A.shape[1]):
print('A is not full rank, dropping redundant rows')
_, pivots = sympy.Matrix(A).T.rref()
A = A[list(pivots)]
print('Shape of A after dropping redundant rows is {}'.format(A.shape))

m = A.shape[0]
n = A.shape[1]

x = np.ones(shape=(n, ))
l = np.ones(shape=(m, ))
s = np.ones(shape=(n, ))

k = 0

while abs(np.dot(x, s)) > epsilon:


k += 1
primal_obj = np.dot(c, x)
dual_obj = np.dot(b, l)
print('iteration #{}; primal_obj = {:.5f}, dual_obj = {:.5f}; duality_gap = {:
(k, primal_obj, dual_obj, primal_obj - dual_obj))
sigma_k = 0.4
mu_k = np.dot(x, s) / n

A_ = np.zeros(shape=(m + n + n, n + m + n))
A_[0:m, 0:n] = np.copy(A)
A_[m:m + n, n:n + m] = np.copy(A.T)
A_[m:m + n, n + m:n + m + n] = np.eye(n)
A_[m + n:m + n + n, 0:n] = np.copy(np.diag(s))
A_[m + n:m + n + n, n + m:n + m + n] = np.copy(np.diag(x))

b_ = np.zeros(shape=(n + m + n, ))
b_[0:m] = np.copy(b - np.dot(A, x))
b_[m:m + n] = np.copy(c - np.dot(A.T, l) - s)
tmp = np.dot(np.dot(np.diag(x), np.diag(s)), np.ones(shape=(n, )))
b_[m + n:m + n + n] = np.copy( sigma_k * mu_k * np.ones(shape=(n, )) - tmp )

delta = np.linalg.solve(A_, b_)


delta_x = delta[0:n]
delta_l = delta[n:n + m]
delta_s = delta[n + m:n + m + n]

alpha_max = 1.0
for i in range(n):
if delta_x[i] < 0:
alpha_max = min(alpha_max, -x[i]/delta_x[i])
if delta_s[i] < 0:
alpha_max = min(alpha_max, -s[i]/delta_s[i])
eta_k = 0.99
alpha_k = min(1.0, eta_k * alpha_max)

10
x = x + alpha_k * delta_x
l = l + alpha_k * delta_l
s = s + alpha_k * delta_s

diff = np.dot(A, x) - b
print('Ax - b = {}; ideally it should have been zero vector'.format(diff))
print('norm of Ax - b is = {}; ideally it should have been zero'.format
(np.linalg.norm(diff)))

return x

A = np.array([[1, 1, 1, 0],
[1, 3, 0, 1]])

b = np.array([5,7])

c = np.array([-1, -5, 0, 0 ])

res = solve(c,A,b)
print (res)

res = linprog(c, A_eq=A, b_eq=b, options={"disp": True})

print (res)
iteration #1; primal_obj = -6.00000, dual_obj = 12.00000; duality_gap = -18.00000
iteration #2; primal_obj = -9.21750, dual_obj = -1.11750; duality_gap = -8.10000
iteration #3; primal_obj = -11.15521, dual_obj = -9.33695; duality_gap = -1.81826
iteration #4; primal_obj = -11.60327, dual_obj = -11.70816; duality_gap = 0.10489
iteration #5; primal_obj = -11.64091, dual_obj = -11.69203; duality_gap = 0.05113
iteration #6; primal_obj = -11.65622, dual_obj = -11.67707; duality_gap = 0.02084
iteration #7; primal_obj = -11.66243, dual_obj = -11.67089; duality_gap = 0.00846
iteration #8; primal_obj = -11.66495, dual_obj = -11.66838; duality_gap = 0.00344
iteration #9; primal_obj = -11.66597, dual_obj = -11.66736; duality_gap = 0.00140
iteration #10; primal_obj = -11.66638, dual_obj = -11.66695; duality_gap = 0.00057
iteration #11; primal_obj = -11.66655, dual_obj = -11.66678; duality_gap = 0.00023
Ax - b = [0. 0.]; ideally it should have been zero vector
norm of Ax - b is = 0.0; ideally it should have been zero
[3.50107272e-05 2.33331700e+00 2.66664799e+00 1.40040490e-05]
Primal Feasibility Dual Feasibility Duality Gap Step Path Para
1.0 1.0 1.0 - 1.0
0.1105388427842 0.1105388427842 0.1105388427842 0.8919387648961 0.1105388
0.001400532337055 0.00140053233704 0.00140053233704 0.9918943193656 0.0014005
7.115191880125e-08 7.11519194345e-08 7.115191920093e-08 0.9999491966235 7.1151920
3.556266503391e-12 3.557079864332e-12 3.557332206583e-12 0.9999500067836 3.5575959
Optimization terminated successfully.
Current function value: -11.666667
Iterations: 4
con: array([1.18571819e-11, 1.18527410e-11])
fun: -11.66666666664022
message: 'Optimization terminated successfully.'
nit: 4
slack: array([], dtype=float64)
status: 0
success: True
x: array([1.15454732e-13, 2.33333333e+00, 2.66666667e+00, 3.96953400e-12])

11
QP Kodu
[3]’den odev sorusu 11.24 cozumu olarak altta ana-çift yöntemi ile bir QP nasıl
çözülür görüyoruz. QP şu formda,

min(1/2)xT Px + qT x öyle ki
x

Ax 6 b

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import numpy.linalg as lin
import scipy.linalg as slin

MAXITERS = 200;
TOL = 1e-6;
m=3;n = 3
RESTOL = 1e-8;
MU = 10;
ALPHA = 0.01;
BETA = 0.5;
x = np.zeros((n,1));

b = np.ones((n,1))*10.
q = np.ones((n,1))*3.

A = np.array( [[2, 3, 5],


[3, 4, 5],
[4, 5, 3]] )

P = np.array( [[1, 2, 4],


[2, 4, 4],
[1, 1, 1]] )

s = b-np.dot(A,x);
z = 1./s;

for iters in (range(MAXITERS)):


gap = np.dot(s.T,z)
res = np.dot(P,x) + q + np.dot(A.T,z)
if (gap < TOL) & (lin.norm(res) < RESTOL):
break
tinv = gap/(m*MU)

tmp1 = -np.vstack((np.hstack((P, A.T)),


np.hstack((A, np.diag( (-s/z).T[0] )))))
tmp2 = np.vstack(( np.dot(P,x)+q+np.dot(A.T,z), -s+tinv*(1.0/z) ))
sol = lin.solve(tmp1, tmp2)
dx = sol[0:n]
dz = sol[n:n+m]
ds = -np.dot(A,dx)
r = np.vstack((np.dot(P,x)+q+np.dot(A.T,z),
z*s-tinv))

12
step = np.min([1.0, 0.99/np.max(-dz/z)]);
while (np.min(s+step*ds) <= 0):
step = BETA*step
print (step)

newz = z+step*dz
newx = x+step*dx
news = s+step*ds

tmp1 = np.dot(P,newx)+q+np.dot(A.T,newz)
tmp2 = newz*news-tinv
newr = np.vstack((tmp1,tmp2))
while (lin.norm(newr) > (1-ALPHA*step)*lin.norm(r)):
step = BETA*step;
newz = z+step*dz
newx = x+step*dx
news = s+step*ds
newr = np.vstack((np.dot(P,newx)+q+np.dot(A.T,newz),
newz*news-tinv))

x = x+step*dx
z = z +step*dz
s = b-np.dot(A,x)

print (x)

[[-4.50000029]
[ 2.25000012]
[-0.75000002]]

Kaynaklar
[1] Tibshirani, Convex Optimization, Lecture Video 16 (Part 1), https://www.youtube.
com/channel/UCIvaLZcfz3ikJ1cD-zMpIXg
[2] Tibshirani, Convex Optimization, Lecture Video 16 (Part 2), https://www.youtube.
com/channel/UCIvaLZcfz3ikJ1cD-zMpIXg
[3] Boyd, Convex Optimization I, http://web.stanford.edu/class/ee364a/
[4] Wright, Linear Programming with MATLAB
[5] Kamal, Linear Program Solvers, https://github.com/hasan-kamal/Linear-
Program-Solvers

13
Tam Varyasyon ile Gürültüyü Yoketmek (Total Variation Denoising)
Bir sinyalden, görüntüden gürültüyü silmek için optimizasyon kullanılabilir. Ori-
jinal sinyal x’in y = Bx + n ile bir n gürültüsü eklenerek bozulduğu (corrupted)
farzedilebilir (B bir değişim matrisidir, tutarlı, bilinen değişimleri temsil eder) biz
eldeki y ile x’i kestirmeye uğraşırız. Fakat literatürde iyi bilindiği üzere x’i y’den
tahmin etmeye uğraşmak kötü konumlanmış (ill-posed) bir sorudur. Çözüm ola-
bilecek pek çok x bulunabilir, bu sebeple arama alanını bir şekilde daraltmak
gerekir, ve bunun için bir tür düzenlileştirme / regülarizasyon (regularization)
kullanılması şarttır [3].
Bir sayısal resimden gürültü çıkartma alanında iyi bilinen bir yöntem problemi
çift hedefli bir halde konumlandırmak [4],

X
n−1
||x − xcor ||2 , φtv (x) = |xi+1 − xi | (1)
i=1

Burada xcor ∈ Rn bize verilen bozulmuş sinyal, x ∈ Rn ise bulmak istediğimiz,


gürültüsü çıkartılmış sinyal, φtv ise tam varyasyon fonksiyonu. Üstteki iki hedefi
minimize etmek istiyoruz, böylece aynı anda hem sinyalin kendi içindeki varyasy-
onu azaltan hem de bozulmuş sinyale mümkün olduğunca yakın duran bir gerçek
x elde edebilelim.
Her iki hedef fonksiyonunu birleştirip tek bir fonksiyon haline getirip onu kısıtlanmamış
(unconstrained) bir optimizasyon problemi olarak çözebiliriz,

ψ = ||x − xcor ||22 + µφtv

ki µ bizim seçeceğimiz bir parametre olabilir. Çözüm için mesela Newton meto-
dunu kullanabiliriz, fakat tek bir problem var, Newton ve ona benzer diğer op-
timizasyon metotları için türev almak gerekli, fakat φtv ’deki L1-norm’unun (tek
boyutta mutlak değer fonksiyonu) x = 0’da türevi yoktur (birinci terimdeki Oklit
normunun karesi alındığı için onun iki kere türevi alınabilir). Bu durumda φtv ’yi
yaklaşık olarak temsil edebilirsek, onun da türevi alınır hale gelmesi sağlayabiliriz.
Bu yeni fonksiyona φatv diyelim,

X
n−1
p 
φatv = 2 + (xi+1 ) − xi − 
i=1

ki  > 0 yaklaşıklamanın seviyesini ayarlıyor. Bu fonksiyonun iyi bir yaklaşıklama


olduğunu görmek zor değil, toplam içindeki kısmı deneyerek görelim,

import numpy as np

eps = 1e-6
mu = 50.0

1
def norm_tv(x):
return np.sum(np.abs(np.diff(x)))

def norm_atv(x):
return np.sum(np.sqrt(eps + np.power(np.diff(x),2)) - eps)

xcor = np.random.randn(1000)

print (norm_tv(xcor))
print (norm_atv(xcor))

1103.2561038302395
1103.2571969067808

Üstteki fonksiyonun iki kez türevi alınabilir. Şimdi analitik şekilde devam etmeden
önce pür sayısal açıdan bir çözüme bakalım. Üstteki fonksiyonları direk kodla-
yarak ve sayısal türev üzerinden işleyebilen bir kütüphane çağrısıyla hedefi min-
imize edelim, eldeki sinyal,

import pandas as pd
df = pd.read_csv('xcor.csv',header=None)
xcor = np.reshape(np.array(df[0]), (5000,1))
plt.plot(range(len(xcor)), xcor)
plt.savefig('func_60_tvd_01.png')

Kütüphane çağrısı ile

x0 = np.zeros(len(xcor))

from scipy.optimize import minimize, Bounds, SR1, BFGS

def phi(x):
return np.sum(np.power(x-xcor, 2)) + mu*norm_atv(x)

2
opts = {'maxiter': 400, 'verbose': 2}

res = minimize (fun=phi,


x0=x0,
options=opts,
jac='2-point',
hess=BFGS(),
method='trust-constr'
)

plt.plot(range(5000), res.x)
plt.savefig('func_60_tvd_02.png')

Sonuç fena olmadı. Fakat üstteki yaklaşımın hesabı uzun sürecektir, eğer el-
deki problem hakkında bazı ek şeyler biliyorsak, bu bilgileri dahil ederek elde
edilen çözüm daha hızlı olabilir. Mesela analitik olarak türevler Jacobian ve Hes-
sian bulunabilir, Newton adımı elle kodlanabilir, ayrıca problemdeki matrislerde
muhtemel bir seyreklikten (sparsity) faydalanılabilir.
Hedef fonksiyonu, ψ(x) diyelim, için birinci ve ikinci türev,

∇ψ(x) = 2(x − xcor ) + µ∇φatv (x), ∇2 ψ(x) = 2I + µ∇2 φatv (x)

Zincirleme Kuralı uygulandı tabii, ve şimdi φatv üzerindeki türevleri bulmak


gerekiyor. Sorun değil, daha önceki yaklaşıklamayı bunun için yapmıştık zaten.
Yaklaşık fonksiyonu genel olarak belirtirsek,

p
f(u) = 2 + u2 − 

Bu fonksiyonun 1. ve 2. türevi

3
f 0 (u) = u(2 + u−1/2 ), f 00 (u) = 2 (2 + u2 )−3/2

Şimdi bir F tanımlayalım,

X
n−1
F(u1 , ..., un−1 ) = f(ui )
i=1

Yani F(u) u’nun bileşenlerinin yaklaşık L1 norm’unun toplamıdır. Nihai amacımız


bu tanımdan bir φatv ifadesine ulaşmak. F’in gradyanı ve Hessian’ı

f 0 (u1 ) . . . f 0 (un−1 )
 
∇F(u) =

∇2 F(u) = diag f 00 (u1 ) . . . f 00 (un−1 )


 

Eğer bir ileri farklılık matrisi D tanımlarsak,


 
−1 1
 −1 1 
D=
 
 ... ... 

−1 1

O zaman φatv (x) = F(Dx) diyebiliriz. Bir x vektörünü üstteki matris ile sol-
dan çarpınca öğeleri x2 − x1 x3 − x2 . . . şeklinde giden bir yeni vektör elde
edeceğimizi doğrulamak zor değil. Yine Zincirleme Kuralını uygularsak,

∇φatv (x) = DT ∇F(Dx), ∇2 φatv (x) = DT ∇2 F(Dx)D

Hepsini bir araya koyarsak

∇ψ(x) = 2(x − xcor ) + µDT ∇F(Dx)

∇2 ψ(x) = 2I + µDT ∇2 F(Dx)D

Kodlamayı alttaki gibi yapabiliriz,

import pandas as pd
import scipy.sparse as sps
import scipy.sparse.linalg as slin

MU = 50.0
EPSILON = 0.001

4
ALPHA = 0.01;
BETA = 0.5;
MAXITERS = 100;
NTTOL = 1e-10;

n = len(xcor)
data = np.array([-1*np.ones(n), np.ones(n)])
diags = np.array([0, 1])
D = sps.spdiags(data, diags, n-1, n)

x = np.zeros((len(xcor),1))

for iter in range(MAXITERS):


d = D.dot(x)
val1 = np.dot((x-xcor).T,(x-xcor))
val2 = np.sqrt(EPSILON**2 + np.power(d,2))
val3 = EPSILON*np.ones((n-1,1))
val = np.float(val1 + MU*np.sum(val2 - val3))
grad1 = 2*(x-xcor)
grad2 = MU*D.T.dot(d / np.sqrt(EPSILON**2 + d**2))
grad = grad1 + grad2
hess1 = 2*sps.eye(n)
hess2 = EPSILON**2*(EPSILON**2+d**2)**(-3/2)
hess2 = hess2.reshape((n-1))
hess3 = sps.spdiags(hess2, 0, n-1, n-1)

hess = hess1 + MU*hess3.dot(D).T.dot(D)


v = slin.spsolve(-hess, grad)
v = np.reshape(v, (n,1))
lambdasqr = np.float(np.dot(-grad.T,v))
if lambdasqr/2 < NTTOL: break
t = 1;
while True:
tmp1 = np.float(np.dot((x+t*v-xcor).T,(x+t*v-xcor)))
tmp2 = MU*np.sum(np.sqrt(EPSILON**2+(D*(x+t*v))**2)-EPSILON*np.ones((n-1,1)))
tmp3 = val - ALPHA*t*lambdasqr
if tmp1 + tmp2 < tmp3: break
t = BETA*t

x = x+t*v

plt.plot(range(n),xcor)
plt.plot(range(n),x,'r')
plt.savefig('func_60_tvd_03.png')

5
Çok daha iyi bir gürültüsüz sonuç elde ettik, üstteki bu işlem çok daha hızlı.
Görüntüden Gürültü Silmek
Aynen tek boyutlu sinyalden gürültü silebildiğimiz gibi iki boyutlu görüntüden
de gürültü silmek mümkün. Bu durumda tam varyasyon

X
m X
n
(|Ui,j − Ui−1,j | + |Ui,j − Ui,j−1 |)
i=2 j=2

olabilir, yani her pikselin bir yanindaki ve bir altındaki pikselle olan uzaklığının
L1-norm’unu almak. Üstteki hesabı yapmak için aslında yine daha önce hesapladığımız
D matrisini kullanabiliriz. Bir X imajı üzerinde DX hesabı, yani D ile soldan
çarpım dikey farklılıkları, sağdan çarpım XD ise yatay farklılıkları verecektir.

import scipy.sparse as sps

X = [[1, 2, 3, 4],
[5, 6, 7, 8],
[1, 2, 3, 4],
[5, 6, 7, 8]]

X = np.array(X)
print (X)
n = X.shape[0]
data = np.array([-1*np.ones(n), np.ones(n)])
diags = np.array([0, 1])
D = sps.lil_matrix(sps.spdiags(data, diags, n, n))
print (D.todense())
print ('Dikey Farklilik')
print (D.dot(X))
print ('Yatay Farklilik')
print (D.transpose().dot(X.T))

6
[[1 2 3 4]
[5 6 7 8]
[1 2 3 4]
[5 6 7 8]]
[[-1. 1. 0. 0.]
[ 0. -1. 1. 0.]
[ 0. 0. -1. 1.]
[ 0. 0. 0. -1.]]
Dikey Farklilik
[[ 4. 4. 4. 4.]
[-4. -4. -4. -4.]
[ 4. 4. 4. 4.]
[-5. -6. -7. -8.]]
Yatay Farklilik
[[-1. -5. -1. -5.]
[-1. -1. -1. -1.]
[-1. -1. -1. -1.]
[-1. -1. -1. -1.]]

L1 norm yaklaşıksallığı için daha önceki yöntemi kullanabiliriz.


Gradyan almak için ise bu sefer tensorflow paketini kullanacağız [5]. Bir vektöre
göre değil bir matrise göre türev alıyoruz, bunu sembolik yapmak yerine sembo-
lik yaklaşım kadar kuvvetli olan otomatik türev ile gradyanı elde edebiliriz.
Üstteki tüm hesapları TF ile bir hesap grafiği içinde kodlayıp, tf.gradients ile
hedef fonksiyonunun gradyanını alacağız, ve standart gradyan inişi optimiza-
syonu ile bir noktadan başlayıp gradyan yönü tersinde adım atarak minimum
noktaya varmaya uğraşacağız.

from skimage import io


import tensorflow as tf

MU = 50.0
EPSILON = 0.001
n = 225

img = io.imread('lena.jpg', as_gray=True)


io.imsave('lenad0.jpg', img)
img = io.imread('lena-noise.jpg', as_gray=True)
io.imsave('lenad1.jpg', img)
xorig = tf.cast(tf.constant( io.imread('lena-noise.jpg', as_gray=True)),dtype=tf.float
x = tf.placeholder(dtype="float",shape=[n,n],name="x")

D = np.zeros((n,n))
idx1, idx2 = [], []
for i in range(n):
idx1.append([i,i])
if i<n-1: idx2.append([i,i+1])
idx = idx1 + idx2
ones = [1.0 for i in range(n)]
ones[n-1] = 0
negs = [-1.0 for i in range(n-1)]
negs[n-2] = 0
vals = ones + negs

7
vals = np.array(vals).astype(np.float32)
D = tf.SparseTensor(indices=idx, values=vals, dense_shape=[n, n])

diff = tf.square(tf.norm(xorig-x, ord='euclidean'))

Ux = tf.sparse_tensor_dense_matmul(D, x)
Uy = tf.sparse_tensor_dense_matmul(tf.sparse_transpose(D), tf.transpose(x))
Uy = tf.transpose(Uy)

fUx = tf.reduce_sum(tf.sqrt(EPSILON**2 + tf.square(Ux)) - EPSILON)


fUy = tf.reduce_sum(tf.sqrt(EPSILON**2 + tf.square(Uy)) - EPSILON)

phi_atv = fUx + fUy

psi = diff + MU*phi_atv


g = tf.gradients(psi, x)
g = tf.reshape(g,[n*n])

init = tf.global_variables_initializer()

sess = tf.Session()

sess.run(init)

def tv(xvec):
xmat = xvec.reshape(n,n)
p = sess.run(psi, {x: xmat} )
return p

def tv_grad(xvec):
xmat = xvec.reshape(n,n)
gres = sess.run(g, {x: xmat} )
return gres

x0 = np.zeros(n*n)
xcurr = x0

N = 130
for i in range(1,N):
gcurr = tv_grad(xcurr)
gcurr /= gcurr.max()/0.3
chg = np.sum(np.abs(xcurr))
xcurr = xcurr - gcurr

xcurr /= xcurr.max()/255.0
io.imsave('lenad2.jpg', np.reshape(xcurr,(n,n)))

8
Yine total varyasyon kullanan ama farklı optimizasyon çözücüyle hesabı yapan
bir yöntem tlv_prim_dual.py kodunda [1], sonuç (soldaki)

Ayrıca cvxpy adlı bir paket üzerinden aynı şeyi kodlayabiliriz, yani

1X X
n
minn (yi − βi )2 + λ |βi − βj |
β∈R 2
i=1 (i,j)∈E)

import cvxpy

lam = 35.0

u_corr = plt.imread("lenad1.jpg")

rows, cols = u_corr.shape

U = cvxpy.Variable(shape=(rows, cols))

obj = cvxpy.Minimize(0.5 * cvxpy.sum_squares(u_corr-U) + lam*cvxpy.tv(U))

prob = cvxpy.Problem(obj)

prob.solve(verbose=True, solver=cvxpy.SCS)

plt.imshow(U.value, cmap='gray')
plt.imsave(lena4.jpg', U.value, cmap='gray')

Üstteki sağdaki resim bu sonucu gösteriyor. Bu yaklaşımda cvxpy.tv ile tam


varyasyon hesabını yapan kütüphanenin kendi iç çağrısını kullandık.
Kaynaklar

9
[1] Mordvintsev, ROF and TV-L1 denoising with Primal-Dual algorithm, https://
github.com/znah/notebooks/blob/master/TV_denoise.ipynb
[2] Chambolle, An introduction to continuous optimization for imaging, https://
hal.archives-ouvertes.fr/hal-01346507/document
[3] Afonso, Fast Image Recovery Using Variable Splitting and Constrained Optimiza-
tion, http://www.lx.it.pt/˜mtf/Afonso_BioucasDias_Figueiredo_twocolumn_
v7.pdf
[4] Boyd, Additional Exercises for Convex Optimization https://web.stanford.
edu/˜boyd/cvxbook/bv_cvxbook_extra_exercises.pdf
[5] Bayramli, Bilgisayar Bilim, Yapay Zeka, Tensorflow

10
Ağ Akış Problemleri (Network flow problems)
Daha önce işlediğimiz [3] ağ akış konusunu biraz daha genişletelim. Sailco adlı
hayali bir şirket düşünelim, bu şirket yelkenli tekne (sailbot) üretiyor. Problem
şöyle, önümüzdeki 4 ay içinde alttaki üretim sayısını gerçekleştirmesi gerekiyor
(müşteri talebi)

Ay 1 2 3 4
Üretilen tekne sayısı 40 60 70 25

Birinci ayda 40, ikinci ayda 60, vs.. Şirketin bir deposu da var, bitmiş teknelerin
teslim etmeden önce tutuldukları yer burası. 1. ayın başında bu depoda 10
tane tekne var. Her ay kaç tane tekne (ve nasıl) üretileceğini hesaplamam lazım,
burada işçi türü ve depoda olanlar sayıyı etkiler tabii, mesela bir ayda 10 tane
üretmem gerekiyorsa ve depoda zaten 10 tane varsa, hiç üretim yapmama gerek
yok. Ama gelecekte çok fazla üretmem gerektiğini biliyorsam ekstra yapıp onları
depoda tutabilirim, ki sonra gönderebileyim.
İşçi kısıtlaması şöyle, normal işçiyle 400 lira / tekne üzerinden fazla mesai ile 450
lira / tekne üzerinden üretim yapabilirim. Tek bir tekneyi depoda tutmak 20 lira.
Ayrıca normal işçi ile ayda sadece 40 tekne yapabiliyorum, eğer o ayda daha fazla
tekne yapmam gerekiyorsa fazla mesai kullanmam şart.
Problem şöyle, öyle bir üretim ve depolama takvimi planla ki önümüzdeki 4 ay-
daki üretimi minimum masrafla yapabileyim.
Karar değişkenleri neler olacak? Görüyorum ki bu tür problemlerle uğraşan bazı
öğrenciler genelde az sayıda değişken kullanmaya meyilli, mesela “X ayında
üretilecek tekne sayısı” gibi, ve beklenti o ki formüller işin gerisini halletsin.
Yani mesela ilk ay bariz zaten, depoda 10 tane tekne var, geri kalanını ilk ayda
normal işçilere yaptırırım çünkü bu en ucuzu. O zaman o ayda üretilen tekne
sayısı değişkeni yeter, vs. Fakat göreceğiz ki bu tür yaklaşımlar aslında işi daha
zorlaştırıyor. İşimize yaramayabilecek ekstra değişkenler tanımlamak, sonra o
değişkenleri kısıtlayıp probleme uygun şekilde dahil etmek daha kolay.
Biz de böyle yapacağız. Bir sürü değişken; mesela X ayı için kaç tane “normal
işçi teknesi” üretilmesi gerektiği, yani bu sayı sadece normal işçiler tarafından
üretilecek tekneleri kontrol edecek, fazla mesai için farklı olacak.. Her ay de-
poda kaç tekne tutulduğu ayrı sayılacak, her şey bir değişken olacak. Belki bu
değişkenlerden bazıları fuzuli, hatta başka bir şeyi tekrar ediyor sanki, başka
değişkenlerden türetilebilir gibi geliyor, olsun, yine de ekstra değişkeni koyun,
ama diğer yandan aklınızdaki o kuralı probleme sınırlama olarak dahil edin. Lit-
eratürde bu değiskenlere karar değiskenleri deniyor ama aslında onlarin direk
karar verdiğimiz şeyler olmasına gerek yok.
Değişkenler şöyle,
x1 , x2 , x3 , x4 : her ayda normal işçilik ile üretilen tekne sayısı

1
y1 , y2 , y3 , y4 : her ayda fazla mesai ile üretilen tekne sayısı
h1 , h2 , h3 , h4 , h5 : her ay başında depoda olan tekne sayısı. 5 ay var çünkü ay so-
nundaki sayıyı h5 değişkeninde tutuyoruz. Tabii problemi iyi anlayanlarımız
farketmiştir ki bu değişkende sıfır değeri olmalı, tüm tekneler gönderilmiş ol-
malı.
Parametreler
Bunlar değişken değil dikkat, dışarıdan tanımlanan parametreler. Başta gördüğümüz
sayılar bunlar, her ay müşteriden gelen talep,
d1 , d2 , d3 , d4 : her ay için talep (demand).
Kısıtlamalar
0 6 xi 6 40, ki i = 1, 2, 3, 4: normal işçilikle üretilebilecek tekne sayısı, çünkü
üstte belirttik, o tür üretimin sınırı bu
yi > 0: fazla mesai ile üretilebilecek tekne sayısı sınırsız. Tabii ki negatif tekne
üretilemez, o sebeple sıfırdan büyüklük var.
hi + xi + yi = di + hi+1 : teknelerin muhafazası denklemi. Burada diyoruz ki
her ay başında depodaki tekneler artı normal ve fazla mesai işçilik ile ürettiğim
teknelerin toplamı, o aydaki talep ve sonraki aya kalacak depodaki teknelerin
toplamı ile aynı olmalı.
Ayrıca h1 = 10 olduğunu biliyoruz.
Önceki noktayı tekrar vurgulamak gerekirse üstteki h değişkenlerini belki tanımlamam
fuzuli, onları h, d’ler üzerinden de tanımlayabilirdim. Ama bu şekilde yapmak
çok daha açık.
[atlandi]
Bu problemin lineer program olduğunu görebiliyoruz, ama hiçbir ağ akışı filan
göstermedim. O zaman dersimizin başlığı niye ağ akışı? Çünkü bu problemi bir
ağ yapısı içinden akış olarak görmek te oldukça doğal. Ağdaki 1,2,3,4 düğümleri
aylar olacak, ve tekneler o aylar içinden “akıyorlar”, eğer bir ay sonrasında de-
poya bir tekne koyuyorsak sanki o tekne geleceğe doğru gönderiliyor, sonraki
aya veriliyor, o sebeple aylar arasındaki oklar hi .

2
Tabii tüm tekneler bir aydan ötekine akmıyor, müşterilerin (customers) talebine
göre o aydan onlara da belli sayıda tekne “akıyor”, di ile gösterilenler. Her aya
giren akış üretim, R ile gösterilen normal işçilikle, OT ile gösterilen fazla mesai
ile. Bu resimle problemi bir ağ akışı olarak göstermiş olduk.
Daha önce gördüğümüz muhafaza denklemi bu resimde daha bariz hale geldi,
çünkü bu resimle aslında şunu söylüyoruz, her ay düğümüne giren akışlar çıkış
akışlarına eşit olmalı. Bu hem kuvvetli bir ifade ama aynı anda bariz. Düğümler
içinde bir şey tutmamalı, oradan sadece akış var.
Bugün genel olarak göreceğimiz konu minimum bedel akış problemleri olacak,
ki üstteki problem bunun bir örneği. Pek çok optimizasyon problemi yönlü bir
ağ üzerindeki akış olarak görülebiliyor.
Alttaki gibi bir ağ düşünelim,

8 tane düğümü var, bazı kenarları var. Bu ağdaki karar değişkenleri her kenar-
daki akış. Dikkat, karar değişkeni düğümde değil, kenarda. Bulmak istediğimiz
bu akış çünkü, bilahere karar değişkenleri. Bu kenarların her birinde ne kadar
akış var?
Her kenardaki akışın bir bedeli olabilir, ayrıca her kenarın bir kapasite sınırlaması
olabilir (bedeli ne olursa olsun üzerine çıkılamayacak bir eşik değeri). Bedel
örneği olarak mesela bir kenar 2 lira/birimlik olabilir diğeri 10 lira/birim be-
delinde olabilir. O zaman ilk kenardan 5 birim göndermek istersem bunun bana
bedeli 10 lira ikincisinden gondermek istersem 50 lira olacak. Her kenarın akış
bedeli, kapasitesi bizim dışarıdan bir parametre ile tanımladığımız bir şey olacak
tabii ki. Kapasitenin illa sınırlanmış olması gerekmez, sınırsız da olabilir.
Her düğüm bir akış kaynağı (source) da olabilir, yani akışı kendi içinden “doğuruyor”
olabilir. Bazı düğümler akışı yutuyor olabilir, onlara akış gelir ve yokolur, bu
düğümlere alıcı (sink) diyebiliriz. O zaman önceki gördüğümüz sadece aktarıcı
düğümlere ek olarak bu iki tip düğümü de kullanabiliriz. Üstteki resimde en sol-
daki iki düğüm kaynak gibi duruyor, oradan sadece çıkan akış görüyoruz. En
sağdaki ise alıcı, ona akış sadece giriyor.
Optimizasyon probleminin sorduğu soru şu olacak, “en minimum bedelli akış
hangisi?”. Pek çok türlü akış olabilir, bizim aradığımız bedeli en az olan. Bugün
göreceğimiz tüm problemler birer minimum bedelli akış problemi olarak formülize
edilebilir. İlk önce en başta gördüğümüz problemi ağ yapısına tercüme edeceğiz,
sonra diğer göreceğimiz problemlerin birer LP olup olmadığına bakacağız.
Düğümleri numaralandıralım,

3
Her akışı, karar değişkenini xij olarak gösterebiliriz, ki (i, j) ∈ ε, 1’den 3’e akış
x13 olacak. Akış bedeli cij . Toplam bedel her akış çarpı o akışın bedeli toplanmış
hali. Kapasite sınırları pij 6 xij 6 qij ile gösterilebilir, her kenarın bir alt bir de
üst sınırı olabilir (pij çoğu problem için sıfırdır). Muhafaza denklemi, her düğüm
k için [1, 26:22]

X X
xkj − xik = bk , ∀k ∈ N
j∈N i∈N

Toplam bedel

X
cij xij
(i,j)∈ε

Üstteki ifade üzerinden toplam bedeli minimize eden akışı bulabiliriz.


Bu bir lineer program değil mi? Bedel lineer, lineer eşitlik, eşitsizlik sınırlamaları.
Evet bu bir LP.
Formel ve öz bir şekilde yazmak gerekirse,

X
min cij xij öyle ki
xij ∈R
(i,j)∈ε
X X
xkj − xik = bk , ∀k ∈ N
j∈N i∈N

pij 6 xij 6 qij

Şimdi muhafaza kısıtlamasına dönmek istiyorum, aslında bu formülü matris for-


munda yazmanın çok güzel bir yolu var.

4
Matrise A sembolü verilir çoğunlukla ve ona oluş, geliş (incidence) matrisi denir.
Örnek olarak sonuncu satıra bakalım, bu satır 8’inci düğüme olanları gösteriyor,
−x68 − x78 hesabı var, eksi işareti düğüme giriş göstergesi, ve sonuç b8 ’e eşit.
A’da sadece 0, -1 ve +1 değerleri vardır ve eldeki düğüm kadar satırı vardır, ve
eldeki kenar kadar kolonu vardır. Dikkat geliş matrisi sadece ağ yapısını kodlar,
kenarlardan giden akış miktarı hala xij değerlerinin kendisinde.
Eğer gereken yerde vektörler de kullanırsak en öz haliyle model şöyle,

min cT x, öyle ki
x∈R|ε|

Ax = b
p6x6q

Denge konusundan bahsedelim, minimum bedelli akış probleminin “dengeli” ol-


ması durumu var. Üstteki örnekteki gibi bir problemi düşünürsek, bazı düğümle
kaynak, bazıları alıcı, tüm düğümlerdeki girenler çıkanlar sıfıra toplanır, o za-
man tüm kaynakların toplamının da tüm talebin toplamına eşit olması beklenir.
Çünkü ekstra kaynak varsa mesela tüm denklemleri tatmin etmek mümkün ol-
maz. Bunu ispatlayabiliriz, geliş matrisinin bir özelliği tüm kolonlarının toplamının
sıfır olması, yani 1T A = 0. Ayrıca Ax = b’nin de doğru olduğunu biliyoruz çünkü
çözeceğimiz sistemin bir kısıtlaması bu formül. O zaman alttaki de doğru olmalı,

1T Ax = 1T b = 0

Eşitliğin sağındaki 1T b tüm b öğelerinin toplamı demek, yani

X
bi = 0
i∈N

olmalı. Demek ki tüm arz tüm talebe eşit olacak. O zaman size b’sı sıfıra toplan-
mayan bir minimum bedel akış problemi verirsem bu problem olurlu olmaya-
caktır. Toplam sıfır ise bu probleme “dengeli problem” deniyor. Tabii dengeli

5
bir modelin de illa olurlu olması şart değil, mesela öyle kapasite sınırlamaları ge-
tirebilirsiniz ki olurluluk mümkün olmaz, ama denge yoksa problem kesinlikle
olurlu değildir.
Ama bazen dengesiz problemleri de ufak değişiklikler ile çözmek mümkün oluyor,
mesela bazı =’leri 6 yaparak, ki bunun karşılığı ağa bir kukla (dummy) düğüm
eklemek olabilir .. Ya da pay bırakma (slack) değişkenleri ekleyip bazı eşitsizlikleri
eşitlikge çevirerek..
Örnek Alanlar
Ne kadar çok problemin minimum akış problemi olabildiği şaşırtıcı olabilir.

• nakliyat problemleri (transportation)

• görev verme / atama problemleri (assignment)

• aktarmalı gemi nakliyatı (transshipment)

• en kısa yol problemleri (shortest path)

• maksimum akış problemleri (max-flow)

Nakliyat
Hedef belli bir mali birkaç kaynak noktasından farklı varış noktalarına ulaştırmak.
Kaynaklar bir sürü depo, ambar olabilir, varış noktası farklı müşteriler olabilir,
ürünlerin depodan müşterilere gitmesi gerekiyor. Ama mesela ambar 1’den müşteri
2’ye gönderim olabilir, ya da ambar 4’ten aynı müşteriye.. ? Karar verilmesi
gerekiyor, her müşterinin kendine göre talebi var, her nakliyat yolunun farklı be-
deli var, yolların kapasite limitleri var, depoların arz limitleri var, bu problem en
az bedelli talebi tatmin eden nakliyat kararını verecek.

Örnek şöyle olabilir, Millco’nun (hayali bir şirket) üç tane bakır işleme fabrikası
var, üç tane de maden bölgesi var. Nakliyatın bedeli km başına 2 lira. Madenler
ve fabrikalar arası mesafeler alttaki gibi, o zaman her talebi tatmin edip en az
nakliyat masrafı için hangi nakliyat planı takip edilmeli?

6
Maden Fabrika 1 Fabrika 2 Fabrika 3 Maden başına
günlük
maksimum
kamyon
sevkiyatı
1 8 15 50 20
2 10 17 20 30
3 30 26 15 45
Fabrika talebi 30 35 30

İlk kontrol edebileceğimiz faktör acaba ağ dengeli mi? Tüm arz toplamı tüm talep
toplamı ile aynı mı? Evet. O zaman  üstteki çözülebilecek bir problem olabilir.
Düğümleri 1 2 3 A B C olarak düzenleyeyim, kaynaklar bir blok olarak
önce, alıcılar sonra. Geliş matrisi altta [1, 43:55],
Bu tamamen bağlantılı (full connected) bir çiziti temsil ediyor, yani herhangi bir
maden düğümünden herhangi bir fabrika düğümüne gitmenin yolu var. Çözüm
A B C
1 20 0 0
2 10 20 0
3 0 15 30

Biz de linprog ile kontrol edelim,

A = [[ 1, 1, 1, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 1, 1, 1, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 1, 1, 1],
[-1, 0, 0, -1, 0, 0, -1, 0, 0],
[0, -1, 0, 0, -1, 0, 0, -1, 0],
[0, 0, -1, 0, 0, -1, 0, 0, -1]]

b = [ 20, 30, 45, -30, -35, -30 ]

c = [ 8, 15, 50, 10, 17, 20, 30, 26, 15]

A = np.array(A); b = np.array(b); c = np.array(c)

from scipy.optimize import linprog

res = linprog(-c, A_eq=A, b_eq=b)


print (np.round(res.x))

[ 0. 0. 20. 0. 20. 10. 30. 15. 0.]

Bu örnekteki b’de hiç sıfır öğesi yok, niye? Çünkü bu ağ yapısında talep ve arz
tüm düğümlerde tanımlı, yani her düğüm ya bir kaynak ya da alıcı. Böyle ol-
mayabilirdi, arada geçiş düğümleri olsaydı onlar üzerinde muhafaza mantığı se-
bebiyle sıfır tanımı yapmak gerekebilirdi.
Atama (Assignment Problems)

7
Bu tür problemler nakliyat problemine benzer, ama n tane çalışanım n tane yapılacak
işim var. Amaç her n kişiye birer görev vermek. Diyelim ki her çalışanın her
görev için farklı tercihi var, mesela ev işlerinde bulaşık, çöp atmak, duvar boya-
mak için A, B kişileri 1 ile 10 arasında tercih belirtmiş olabilir. Amaç her işi bir
kişiye atamak, öyle ki tüm işler yapılsın aynı anda herkes olabildiği kadar mutlu
olsun.
Bu problem de nakliyat problemi gibi! Ama şimdi akış 1 ya da 0. Her kaynağa 1
giriyor, her alıcıdan 1 çıkıyor. Kenarlar üzerinde hiç kısıtlama yok.
Ama bazılarımız sorabilir, 0.2 insanı bir göreve, 0.8 insani diğerine gönderme gibi
bir sonuç ta istemem, bir tür tam sayı kısıtlaması da olmalı bu problemde, yani
her kenardaki akış ya 0 ya da 1 olmalı. Bu tür kısıtlamaları ileride işleyeceğiz.
Örnek görelim, bir yüzücü antrenörüyüz diyelim, eğittiğimiz 5 yüzücü arasından
bayrak yarışı için seçme yapmamiz gerekiyor. Bayrak yarışında her gidiş gelişte
ardı ardına dört ayrı stil gerekiyor, dört farklı yüzücü bu stillerde yarışabiliyor,
bir gidip geliş sonrası bir yüzücü diğerine bayrağı aktarıyor. Stiller sırtüstü (back-
stroke), kurbağalama (breaststroke), kelebek (butterfly), serbest stil (freestyle).
Her stil bir turda kullanılınca toplam tüm stilleri en çabuk kullanmış olan takım
kazanıyor. Elimizdeki yüzücülerin bu her alandaki geçmişteki zamanlarını biliy-
oruz, bu o yüzücülerin her stildeki kuvvetleri bir bakıma,

Şu mümkün; bir süper yüzücümüz olabilir her stilde en iyi o’dur. Ama bu tek
adamı 4 kez, her stilde kullanamayız, her stil için farklı birini seçmemiz lazım.
Bu iyi yüzücüyü tabii ki bir stil için kullanmak isteriz, ama hangisi için? Optimal
sonuç için bir dengeleme yapmak lazım.
Bu bir atama / görevlendirme problemi işte, her yüzüş stilini birine “atıyorum”.
Bu arada elimizde 4 stil ama 5 yüzücü var, yani bir yüzücü görevsiz kalacak. Bir
kısıtlama var, o da bir yüzücü birden fazla stilde yarışamaz.
Üstteki resimde kırmızı renk yapılan tercihi belirtiyor [1, 54:08].
Bu konu kodlaması hakkında daha fazla detay ekler bölümünde.
Aktarmalı gemi nakliyatı
Bu tür nakliyat problemlerinde bir mali kaynaktan alıcıya direk göndermeye ek
olarak arada bir depoda da tutmamız mümkün, bu durum tabii ki lojistik planla-
mada değişiklikler getirebilir. Amazon gibi şirketler bunu sürekli yapıyor mesela,
bir ürünü önce büyük bir antrepoya gönderiyorlar, oradan başka bir yere aktarma

8
yapıyorlar.

Orta kısımda sarımsı renkle görülen aktarma noktaları. Normal aktarma prob-
lemlerinde olduğu gibi kaynak, alıcı var, arz ve talep sınırları var, kenarlarda
sınırlar olabilir, aktarma noktaları için giren ve çıkan birbirini dengelemeli, yani
muhafaza denklemi onlar için geçerli [1, 56:00]. Aslında başta gördüğümüz Sailco
problemi bir aktarmalı nakliyat problemi.. Depo var, üretici, alıcı var..
En kısa / en uzun yol problemleri
En kısa yol problemleri de minimum bedel akış problemleridir. Size alttaki gibi
bir çizit veriyorum mesela, her kenar, “yol” uzunluğu / zorluğu / bedeli çizitte
veriliyor ve mavi düğümden kırmızı düğüme en kısa bedelle, en kısa şekilde
ulaşmak istiyorum. Bu problemi minimum bedel akış olarak çözmek için elim-
izde sadece tek birimlik akış olduğunu hayal edebiliriz.

Yani mavi düğümün tek birimlik arzı var, kırmızı düğümün tek birimlik talebi
var, ve geri kalan her düğüm aktarıcı, yani girişi, çıkışı muhafaza etmesi gerekiyor.
Kenarların bedeli tabii ki o yolun uzunluğu, kısalığı olarak yorumlanabilir. O
zaman, bu akış problemini çözünce, elde ettiğim akış bana hangi yolun en kısa
olduğunu söyleyecektir. Tabii 1 birimlik arzın bölünüp farklı yönlere gitmesini
istemem ve yine bir tam sayı kısıtlaması gerektiği akla gelebilir. Bu konuya
değineceğiz. Fakat bu problemi bir LP olarak çözünce tam sayı kısıtlaması ol-
masa bile 1/0 bazlı sonuçlar alıyorsunuz. Sihirli bir şey sanki.
[uzun yol atlandi]

9
Maksimum flow problemi de olabilirdi, bir çizit alalım mesela,

Bu çizitteki kenarları kapasite olarak görebiliriz, yani her kenardan ne kadar akış
olabileceği hakkında bir sınır var, mesela üstteki bir su boru hattı ağı olsaydı, her
kenar bir boru olabilirdi ve bu boruların çapına göre, kimisi küçük kimisi büyük,
o borudan ne kadar şu pompalayabileceğimizle alakalı bir kısıtlama var. Amaçım
mavi düğümden kırmızı düğüme mümkün olduğunca fazla şu pompalamak.
Peki çıplak gözle bakınca en fazla ne kadar akış gönderebileceğimizi görebilir
miyiz? Evet. Alıcıya bakarsak en fazla 1+2=3 alabilir, o zaman 3’ten fazla göndermeyiz.
Bu 3 nasıl gönderilecek? 2 hattından 1, 3 hattından 2 birimle belki.. Dikkat bu
problemde yine kaynaktaki akışı bölebiliyoruz.
[maks akışı min akışa çeviren numara atlandı]
Tam sayı çözümleri
Nihayet “sonra değineceğiz” dediğimiz konuya geldik [1, 1:09:21]. Atama prob-
lemi, en kısa yol gibi problemlerde tam sayı sonuçlara ihtiyacımız vardı. Tam sayı
kısıtlama getirmeden tam sayı sonuç elde etmenin bir yolu var. Yani normal bir
LP çözüyorsunuz ve tam sayı bazlı sonuçlar elde ediyorsunuz. Bu nasıl oluyor?
Anlatmadan önce biraz lineer cebire dalmak gerekiyor.
Tanım
Bir matris A tamamen tekbirimseldir (totally unimodular -TU-) eğer A’nin her
mümkün kare altmatrisinin determinantı 0, 1 ya da -1 ise. Hatırlarsak deter-
minantlar kare matrisler üzerinde hesaplanan şeyler, burada tüm karesel altma-
trislerden bahsediyoruz, ve onların determinanti belirttiğimiz gibi ise matris TU
diyoruz.
Aslında TU’luğun kontrolü biraz çetrefil olabilir, düşünürsek bir matris ne kadar
buyurse o kadar mümkün altmatrisi olur. Ama bir matris tamamen 0,1,-1 öğelerinden

10
oluşuyorsa bu kontrol belki daha kolay olur..?
Alttaki matrislerde mesela soldaki TU, ama sağdaki değil.

   
1 1 0 1 1 1
,
−1 0 1 −1 0 1

Tamam. Şimdi bir teori daha göreceğiz, resim iyice ortaya çıkacak.
Teori
Eğer bir matris A TU ise ve b bir tam sayı vektör ise, o zaman {x : Ax 6 b}
çözümündeki x tam sayı kordinatlarında olacaktır. Yani üstteki şartlar yerindeyse
Ax 6 b çokyüzlüsünün (polyhedron) tüm köşeleri tam sayı noktalarındadır. Bu
teoriyi ispatsız veriyoruz. Ve, bir LP için eğer elimizde tüm köşeleri tam sayı
kordinatlar olan bir çokyüzlü var ise, o LP’nin çözümünün tam sayılar olacağını
biliyoruz.
O zaman, eğer elimde matris A’sı tamamen tekbirimsel olan bir LP var ise, o
zaman tam sayı çözümler elde etmem garanti, tabii b de tamamen tam sayılar
içeriyorsa.
Ve nihai zirveye geldik: tüm geliş matrisleri tamamen tekbirimseldir.
Yani bir ağ akış problemindeki geliş matrisi tamamen tekbirimsel. Ayrıca eğer o
problemin b vektörü de tam sayı ise sonuç muhakkak tam sayılar içerecek.
Bu çok önemli bir sonuç.
O zaman bir minimum bedel akış problemindeki arzlar tam sayı ise, talepler tam
sayı ise, ve tam sayı kenar kapasiteleri içeriyorsa, bu bir minimum bedel tam sayı
akışıdır.
Ekler
Kısayol problemine örnek olarak [2]’deki probleme bakalım.

Başlangıç 's’den bitiş x’e en kısa yol hangisi? Düğümlere s = 1,t = 2,y = 3,x =
4,z = 5 olarak birer indis verelim, ve x = [x12 , x13 , x23 , x24 , x32 , x34 , x35 , x45 , x51 , x54 ]

11
vektörünü tanımlayalım. Geliş matrisini ağdaki bağlantılara göre yapıp çözersek,

A = [
[ 1, 1, 0, 0, 0, 0, 0, 0, 0, 0],
[ -1, 1, 1, -1, 0, 0, 0, 0, 0, 0],
[ 0, -1, -1, 0, 1, 1, 0, 0, 0, 0],
[ 0, 0, 0, -1, 0, -1, 0, 1, 0, -1],
[ 0, 0, 0, 0, 0, 0, -1, -1, 1, 1]]

# tek birim yolla, 1'den arz, 4'ten tek birim talep et


# geri kalanlarda giris-cikis muhafaza
b = [1, 0, 0, -1, 0]

c= [10, 5, 2, 1, 3, 9, 2, 4, 7, 6]
A = np.array(A); b = np.array(b); c = np.array(c)

from scipy.optimize import linprog

res = linprog(c, A_eq=A, b_eq=b)


res = np.round(res.x)
print (res)

[0. 1. 0. 1. 1. 0. 0. 0. 0. 0.]

Sonuçta x13 , x24 , x32 kenarlarının 1 değerini aldığını görüyoruz, bu yollar en kısa
yolun parçalarıdır, demek ki 1-3, 3-2, ve 2-4 yolu en kısa yoldur. Orijinal prob-
lem çözümünde [2] sonucun [’s’, ’y’, ’t’, ’x’] olduğunu görmüştük. Yani aynı
sonuca varmış olduk. Dijkstra algoritmasının bir ayrıksal algoritma olduğunu
unutmayalım, ama üstteki LP bazlı yaklaşım sürekli (continuous) alanda opti-
mizasyon araçları ile aynı sonuca varıyor!
Yüzücüler
Daha önceki problemi yazılımla çözelim. Atama problemleri aslında oldukca
standart, çünkü iş-işçi ağ yapısı hep aynı, arada aktarma olmayan bir ağ yapısı.
Bu yapıyı n tane iş n tane işçi için mekanik bir şekilde yaratabiliyoruz. Bu sebe-
ple çözüm yapan linear_sum_assignment çağrısı sadece bir bedel matrisi alıyor,
gerisini kendi hallediyor.
Bir pürüz nokta, elde işten fazla işçi varsa, mesela yüzme örneğinde olduğu gibi,
5 tane yüzücü, 4 tane stil varsa ortaya çıkar. O zaman numara şudur, bedel matri-
sine bir ’boş stil’ satırı ekleriz [4, sf. 40], oradaki tüm bedeller sıfır olur, yani diğer
işler için optimal olmayan bir kişiyi buraya atamak için algoritmayi yönlendirmiş
oluruz bir bakıma ve yine problemi standart bir şekilde çözeriz.

from scipy.optimize import linear_sum_assignment

raw = [ [37.7, 32.9, 33.8, 37.0, 35.4],


[43.4, 33.1, 42.2, 34.7, 41.8],
[33.3, 28.5, 38.9, 30.4, 33.6],
[29.2, 26.4, 29.6, 28.5, 31.1] ]
raw = np.array(raw)
raw = np.vstack( (raw, np.zeros((1,5))) )

12
print (raw)
row_ind, col_ind = linear_sum_assignment(raw)
print (col_ind)
print (row_ind)
print (raw[row_ind, col_ind].sum())

[[37.7 32.9 33.8 37. 35.4]


[43.4 33.1 42.2 34.7 41.8]
[33.3 28.5 38.9 30.4 33.6]
[29.2 26.4 29.6 28.5 31.1]
[ 0. 0. 0. 0. 0. ]]
[2 3 1 0 4]
[0 1 2 3 4]
126.2

Sonuca bakarsak David sırtüstü stiline atanmış, Tony kurbağalamaya atanmış..


ve Ken hiçbir şeye atanmamış. Bu sonuçların daha önceki tablodaki kırmızı
seçimler aynı olduğunu görebiliriz.
Problemin matematik yapısına gelelim, ufak bir örnek, elde c1 , c2 , p1 , p2 şeklinde
c ile müşteriler p ile ürünleri eşlediğimizi düşünürsek, ağ yapısında düğümler
tüm müşteriler, tüm ürünler, yani c1 , c2 , p1 , p2 ve tüm kenarlar ise (c1 , p1 ), (c1 , p2 ),
(c2 , p1 ), (c2 , p2 ) gibi olurdu. Burada yine tek birim kaynaktan, müşterilerden
gönderilen tek birimlik yükün bir alıcı ürün tarafından alındığını düşünüyoruz,
o zaman geliş matrisi satırlar düğümler, kolonlar kenarlar olacak şekilde,

 
1 1 0 0
 0 0 1 1 
 
 −1 0 −1 0 
0 −1 0 −1

olurdu, tabii ki b = [1, 1, −1, −1]. Üstteki matriste kalıp belli oluyor herhalde,
satırların müşteri kısmında her ürün başına tamamen birler var, ürünler kısmında
blok blok yanyana birim matrisleri.. Üstteki matrisi ötomatik olarak yaratmak
mümkün. Hatta şimdi Lineer Programlar, Örnekler yazısındaki problemi ağ mantığı
çözelim,

C = [[17,10,12],[9,8,10], [14,4,7]]
C = np.array(C)
print (C)

n = 3
X = np.zeros((2*n,n**2))
X[0,0:n] = np.ones((1,n))
X[1,n:n+n] = np.ones((1,n))
X[2,2*n:2*n+n] = np.ones((1,n))
X[3:6,0:3] = -np.eye(n,n)
X[3:6,3:6] = -np.eye(n,n)
X[3:6,6:9] = -np.eye(n,n)
print (X)

13
b = [1, 1, 1, -1, -1, -1]

from scipy.optimize import linprog


res = linprog(C.flatten(), A_eq=X, b_eq=b)
res = np.round(res.x)
print (res)

[[17 10 12]
[ 9 8 10]
[14 4 7]]
[[ 1. 1. 1. 0. 0. 0. 0. 0. 0.]
[ 0. 0. 0. 1. 1. 1. 0. 0. 0.]
[ 0. 0. 0. 0. 0. 0. 1. 1. 1.]
[-1. -0. -0. -1. -0. -0. -1. -0. -0.]
[-0. -1. -0. -0. -1. -0. -0. -1. -0.]
[-0. -0. -1. -0. -0. -1. -0. -0. -1.]]
[0. 0. 1. 1. 0. 0. 0. 1. 0.]

Aynı sonuca eriştiğimizi görüyoruz. Not: hem üstteki geliş matrisi hem de diğer
LP yazısındaki problemin tamamen tekbirimsel olduğuna dikkat, bu sebeple her
iki problem de tamsayı çözümü veriyor.
5 yüzücü için ve yine sıfırlı satırı ekleyip, yüzücü problemini de aynı şekilde
çözebilirdik.
Kaynaklar
[1] Lessard, Introduction to Optimization, CS/ECE/ISyE 524, Lecture 5, University of
Wisconsin-Madison, https://laurentlessard.com/teaching/524-intro-
to-optimization
[2] Bayramli, Bilgisayar Bilim, Dijkstra Algoritması ile En Kısa Yol
[3] Bayramli, Fonksiyonel Analiz ve Optimizasyon, Çifteşlik, İkizlik (Duality)

14
Yükseklik Fonksiyonu (Tepeler) Arasından En Düz, Optimal Yürüyüş Yolunu
Bulmak
Elimizde bir alan içindeki yükseklikleri veren bir fonksiyon f(x, y) olduğunu
düşünelim. Acaba verili bir başlangıç ve bitiş noktası arasındaki en “rahat” gidiş
yolunu nasıl buluruz?
Yükseklikler bir E(x, y) fonksiyonunda olsun. Yolları nasıl temsil ederiz? Bir
parametrik eğri kullanabiliriz, mesela

x(t) = a0 + a1 t + a2 t2 + a3 t3

y(t) = b0 + b1 t + b2 t2 + b3 t3

İstediğimiz derecede polinom parametrize eğrileri nasıl yaratacağımızı biliyoruz


[3]. Böylece doğru, optimal bir yolu bulmak demek a0 , a1 , a2 , a3 , b0 , b1 , b2 , b3 kat-
sayılarını doğru bulmak demek olacaktır. Bir optimizasyon problemi yani.
Peki o zaman optimize, minimize edilecek bedel fonksiyonu ne olmalı? Burada
farklı yaklaşımlar olabilir. Kimisi eğri altına düşen yüksekliklerin toplamını bir
çizgi entegrali ile hesaplamak isteyebilir. Fakat bu yaklaşım yüksekliklerden
genel olarak uzak dursa da mesela çok inişli çıkışlı yolları hala tercih eder, ama
bu tür yolların yürüyüş olarak yorucu olacağını biliyoruz. 1000 metrelik bir tep-
eye çıkıp onun üzerinde düz yürümek habire 1000 metreyi inmek çıkmaktan çok
daha rahat.
Şu şekilde bir bedel belki daha iyi; Bir eğriyi düşünelim, onun z eksenindeki
yansıması da bir eğridir, x, y düzlemindeki yansıması bir başka eğri. Bu eğrilerin
uzunluğunu hesaplarsak [2] ve dikey yöndeki uzunluğu yatay olan uzunluğu
farklı ağırlıklarla çarpıp toplarsak bu bir bedeli temsil eder. Ağırlık dikey/yatay
uzunluklar için 5/1 oranında olabilir, o zaman yatay yöndeki bir uzunluk / kate-
dilen yol dikeye göre 5 kat daha tercih edilir olur.
Önce yükseklikleri ve eğrileri iki örnek üzerinde görelim. Bir rasgele tepe, ve bir
rasgele yol çiziyoruz,

from mpl_toolkits.mplot3d import Axes3D


from scipy.spatial.distance import cdist
from matplotlib import cm

def gfunc(x, y):


s1 = 2.2; x1 = 2.0; y1 = 2.0
g1 = np.exp( -4 *np.log(2) * ((x-x1)**2+(y-y1)**2) / s1**2)
return g1 * 10.0

def plot_surf_path(a0,a1,a2,a3,a4,b0,b1,b2,b3,b4):

D = 50
x = np.linspace(0,5,D)

1
y = np.linspace(0,5,D)
xx,yy = np.meshgrid(x,y)
zz = gfunc(xx,yy)

fig = plt.figure()
ax = fig.gca(projection='3d')
ax.set_xlim(0,5)
ax.set_ylim(0,5)
surf = ax.plot_wireframe(xx, yy, zz,rstride=10, cstride=10)

t = np.linspace(0,1.0,100)

x = a0 + a1*t + a2*t**2 + a3*t**3 + a4*t**4


y = b0 + b1*t + b2*t**2 + b3*t**3 + b4*t**4

ax.plot3D(x, y, gfunc(x,y),'r.')

# 1. gidis yolunun tanimi, uzun yoldan dolanarak gidiyor


a1,a2,a3 = 1.5, 8.1, 4.0
b1,b2,b3 = 0.3, 0.4, 23.3
a0,b0=(1.0,1.0)
ex,ey=(0.3,4.0)
a4 = ex - a0 - (a1+a2+a3)
b4 = ey - b0 - (b1+b2+b3)
test_coefs1 = (a0,a1,a2,a3,a4,b0,b1,b2,b3,b4)
plot_surf_path(a0,a1,a2,a3,a4,b0,b1,b2,b3,b4)

plt.savefig('calc_multi_40_elev_01.png')

Eğer üstteki gidiş yoluna kuşbakışı, iki boyutlu ortamda bakmak istersek,

t = np.linspace(0,1.0,100)
x = a0 + a1*t + a2*t**2 + a3*t**3 + a4*t**4
y = b0 + b1*t + b2*t**2 + b3*t**3 + b4*t**4
plt.xlim(0,5.0)
plt.ylim(0,5.0)
plt.plot(x,y)
plt.savefig('calc_multi_40_elev_02.png')

2
Bu biraz önce bahsettiğimiz yatay düzlemdeki yansıma.
Şimdi ikinci bir gidiş yoluna bakalım, başlangıç noktası aynı ama bitiş farklı,

# 2. gidis yolunun tanimi, dik cikip iniyor


a1,a2,a3 = 1.5, 3.0, 1.0
b1,b2,b3 = 0.0, 1.0, 1.0
a0,b0=(1.0,1.0)
ex,ey=(0.3,4.0)
a4 = ex - a0 - (a1+a2+a3)
b4 = ey - b0 - (b1+b2+b3)
test_coefs2 = (a0,a1,a2,a3,a4,b0,b1,b2,b3,b4)
plot_surf_path(a0,a1,a2,a3,a4,b0,b1,b2,b3,b4)
plt.savefig('calc_multi_40_elev_03.png')

Bu yolları tabii ki rasgele parametreler üzerinden yarattık, bunlar optimal yollar


değiller.
Optimallik için gereken uzunluk hesabına gelelim. Bu hesap için formül, dikey
için Iv yatay için Ih

3
Z t=1
s  2
dz
Iv = 1+ dt
t=0 dt

Z t=1
s 2  2
dx dy
Ih = + dt
t=0 dt dt

Formülde görülen dz/ dt, dx/ dt ve dy/ dt, parametrik eğri üzerinden alınacak
tabii ki. Problem çözümü açısından dz/ dt hesabı külfetli olabilir, çünkü z =
f(x, y) yükşelik fonksiyonundur. Üstteki örnekteki yükseklik fonksiyonu basit,
ama daha çetrefil durumlarda da kullanabileceğimiz bir yaklaşım daha iyi olur.
Bu sebeple dz/ dt türevini hesapsal yapacağız.
Ama yatay türevler dx/ dt ve dy/ dt için, türevi almak, kare, toplam, karekök
hesaplarını sembolik olarak yapabiliriz, çünkü bu formül polinom, formu şimdiden
belli.

import sympy

vars = 't a0 a1 a2 a3 b0 b1 b2 b3 gamma x y'


t, a0, a1, a2, a3, b0, b1, b2, b3, gamma, x, y = sympy.symbols(vars)

xdef = a0 + a1*t + a2*t**2 + a3*t**3 + a4*t**4


ydef = b0 + b1*t + b2*t**2 + b3*t**3 + b4*t**4

dxdt = sympy.diff(xdef,t)
print (dxdt)
dydt = sympy.diff(ydef,t)
print (dydt)
sqrtdef = sympy.sqrt(sympy.diff(xdef,t)**2 + sympy.diff(ydef,t))
print (sqrtdef)

a1 + 2*a2*t + 3*a3*t**2 - 57.2*t**3


b1 + 2*b2*t + 3*b3*t**2 - 84.0*t**3
sqrt(b1 + 2*b2*t + 3*b3*t**2 - 84.0*t**3 + (a1 + 2*a2*t + 3*a3*t**2 - 57.2*t**3)**2)

Entegraller Iv , Ih hesapları da sayısal yapılacak.


Hepsini bir araya koyarsak, uzunluklar (entegraller) üzerinden bir bedel elde
ediyoruz, ve bu bedeli minimize edecek eğri parametrelerini bulmak için ise opti-
mizasyon işletiyoruz. Optimizasyon kısıtlamalar içerecek, eğri parametrelerinin
-5/+5 arasında olmasını istiyoruz mesela.

from scipy.optimize import minimize, Bounds, SR1, BFGS


import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from scipy.spatial.distance import cdist
from matplotlib import cm
import util

4
def trapz(y, dx):
vals = y[1:-1]
vals = vals[vals>0.0]
return (y[0]+np.sum(vals*2.0)+y[-1])*(dx/2.0)

def find_path(ex,ey,a0,b0):

def calc_int(pars):
a1,a2,a3,b1,b2,b3=pars
a4 = ex - a0 - (a1+a2+a3)
b4 = ey - b0 - (b1+b2+b3)
def gfunc(t):
t = t[0]
x = a0 + a1*t + a2*t**2 + a3*t**3 + a4*t**4
y = b0 + b1*t + b2*t**2 + b3*t**3 + b4*t**4
s1 = 2.2; x1 = 2.0; y1 = 2.0
g1 = np.exp( -4 *np.log(2) * ((x-x1)**2+(y-y1)**2) / s1**2)
return g1*10.0
ts = np.linspace(0.0,1.0,100)
dzs = np.array([util._approx_fprime_helper([t],gfunc)[0] for t in ts])
tmp = np.sqrt(1.0+(dzs**2.0))
Iv = trapz(tmp, 1/100.)
tmp = np.array([b1 + 2*b2*t + 3*b3*t**2 - 112.0*t**3 + (a1 + 2*a2*t + 3*a3*t**
tmp = tmp[tmp>0.0]
tmp = np.sqrt(tmp)
Ih = trapz(tmp, 1/100.)
res = Iv*5 + Ih*1
return res

LIM = 5.0
# rasgele secilmis baslangic degerleri
a1,a2,a3 = 0,0,0
b1,b2,b3 = 0,0,0
x0 = a1,a2,a3,b1,b2,b3

opts = {'maxiter': 300, 'verbose': 0}


res = minimize (fun=calc_int,
x0=x0,
method='trust-constr',
hess = BFGS (),
bounds=Bounds([-LIM, -LIM, -LIM, -LIM, -LIM, -LIM],
[LIM, LIM, LIM, LIM, LIM, LIM]),
options=opts)

return res

a0,b0=(1.0,1.0)
ex,ey=(0.3,4.0)
res = find_path(ex,ey,a0,b0)
print ('res',res)
print ('res',res['x'])

a0,b0=(4.0,1.0)

5
ex,ey=(1.0,4.0)
res = find_path(ex,ey,a0,b0)
print ('res',res)
print ('res',res['x'])

res barrier_parameter: 6.400000000000003e-06


barrier_tolerance: 6.400000000000003e-06
cg_niter: 1604
cg_stop_cond: 2
constr: [array([-1.08548354, -0.36789632, -0.20897387, 0.2395503 , 0.298
0.00380265])]
constr_nfev: [0]
constr_nhev: [0]
constr_njev: [0]
constr_penalty: 1.0
constr_violation: 0.0
execution_time: 50.29004144668579
fun: 33.11613644482912
grad: array([-1.38273935, -0.50301313, 0.79182863, 1.80994987, 2.2042
2.09085321])
jac: [<6x6 sparse matrix of type '<class 'numpy.float64'>'
with 6 stored elements in Compressed Sparse Row format>]
lagrangian_grad: array([-1.2659412 , -0.46518832, 0.73288924, 1.67502195, 2.0393
1.93597495])
message: 'The maximum number of function evaluations is exceeded.'
method: 'tr_interior_point'
nfev: 2723
nhev: 0
nit: 301
niter: 301
njev: 0
optimality: 2.0393846199040575
status: 0
success: False
tr_radius: 1.8588829764195948e-08
v: [array([ 0.11679815, 0.03782481, -0.05893939, -0.13492793, -0.164
-0.15487826])]
x: array([-1.08548354, -0.36789632, -0.20897387, 0.2395503 , 0.2986
0.00380265])
res [-1.08548354 -0.36789632 -0.20897387 0.2395503 0.29868552 0.00380265]
...
res [-0.3061632 4.76223126 4.99872105 0.41013189 4.9713953 4.9745472 ]

Bir optimal sonuç bulundu. Grafikleyelim,

a1,a2,a3,b1,b2,b3 = -1.08548354, -0.36789632, -0.20897387, 0.2395503, 0.29868552,


a4 = ex - a0 - (a1+a2+a3)
b4 = ey - b0 - (b1+b2+b3)
plot_surf_path(a0,a1,a2,a3,a4,b0,b1,b2,b3,b4)
plt.savefig('calc_multi_40_elev_04.png')

6
Yol oldukca optimal duruyor. Gereksiz iniş çıkış yok, ve yatay mesafe de mini-
mize edilmiş.
İkinci örnek

a0,b0=(4.0,1.0)
ex,ey=(1.0,4.0)
a1,a2,a3,b1,b2,b3 = -0.3061632, 4.76223126, 4.99872105, 0.41013189, 4.9713953,
a4 = ex - a0 - (a1+a2+a3)
b4 = ey - b0 - (b1+b2+b3)
plot_surf_path(a0,a1,a2,a3,a4,b0,b1,b2,b3,b4)
plt.savefig('calc_multi_40_elev_05.png')

Görüldüğü gibi yol tepeden uzak durmaya uğraşmış.


Farklı Eğri Yöntemi ve Bitiş Noktası Sınırlaması
[3]’te alternatif bir eğri şekli daha gördük, lineer parçalı ya da sigmoid bazlı
parametrize eğriler. Bir parametrize eğriyi

x = a0 + a1 σ(t, u1 ) + a2 σ(t, u2 ) + ...

7
x = b0 + b1 σ(t, v1 ) + b2 σ(t, v2 ) + ...

modelleyebilirdik, u1 , u2 , .. eksen x için ilmik noktaları, v1 , v2 , .. eksen y için ilmik


noktaları olabilirdi ve biraz değiştirilmiş sigmoid σ ifadesi

1
σ(x, k) = (x − k)
1 + exp(−α(x − k))

Bilindidigi gibi normal sigmoid ifadesi

1
σ(x) =
1 + exp(−αx)

ve α büyüdükçe 0’dan 1’e geçiş sertleşir.


Bu şekilde parametrize edilmiş eğri ile pek çok farklı şekil ortaya çıkartılabilir.
Bitis noktasini da farkli bir sekilde optimizasyon kisitlamasi uzerinden zorluy-
oruz [3].

from scipy.optimize import minimize, Bounds, SR1, BFGS


import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
import util

rho = 7.0
def sig(x,a):
return (x-a)*1/(1+np.exp(-rho*(x-a)))

def trapz(y, dx):


vals = y[1:-1]
vals = vals[vals>0.0]
return (y[0]+np.sum(vals*2.0)+y[-1])*(dx/2.0)

def plot_surf_path(a0,a1,a2,a3,b0,b1,b2,b3):

D = 50
x = np.linspace(0,5,D)
y = np.linspace(0,5,D)
xx,yy = np.meshgrid(x,y)
zz = gfunc(xx,yy)

fig = plt.figure()
ax = fig.gca(projection='3d')
ax.set_xlim(0,5)
ax.set_ylim(0,5)
surf = ax.plot_wireframe(xx, yy, zz,rstride=10, cstride=10)

t = np.linspace(0,5.0,100)

8
def sigx(t):
t = t[0]
x = a0 + \
a1*sig(t,1) + \
a2*sig(t,2) + \
a3*sig(t,3)
return x

def sigy(t):
t = t[0]
y = b0 + \
b1*sig(t,1) + \
b2*sig(t,2) + \
b3*sig(t,3)
return y

xs = np.array([sigx([tt]) for tt in t])


ys = np.array([sigy([tt]) for tt in t])

ax.plot3D(xs, ys, gfunc(xs,ys),'r.')

def find_path(ex,ey,a0,b0):

def calc_int(pars):
a1,a2,a3,b1,b2,b3=pars
def sigx(t):
t = t[0]
x = a0 + \
a1*sig(t,1) + \
a2*sig(t,2) + \
a3*sig(t,3)
return x

def sigy(t):
t = t[0]
y = b0 + \
b1*sig(t,1) + \
b2*sig(t,2) + \
b3*sig(t,3)
return y

def gfunc(t):
t = t[0]
x = sigx([t])
y = sigy([t])
s1 = 2.2; x1 = 2.0; y1 = 2.0
g1 = np.exp( -4 *np.log(2) * ((x-x1)**2+(y-y1)**2) / s1**2)
s2 = 1.2; x2 = 4.0; y2 = 1.0
g2 = np.exp( -4 *np.log(2) * ((x-x2)**2+(y-y2)**2) / s2**2)
return g1*10.0 + g2*10.0

ts = np.linspace(0.0,5.0,100)
dzs = np.array([util._approx_fprime_helper([t],gfunc)[0] for t in ts])

9
tmp = np.sqrt(1.0+(dzs**2.0))
Iv = trapz(tmp, 5./100)
dxs = np.array([util._approx_fprime_helper([t],sigx)[0] for t in ts])
dys = np.array([util._approx_fprime_helper([t],sigy)[0] for t in ts])
tmp = np.power(dxs,2) + np.power(dys,2)
tmp = tmp[tmp>0.0]
tmp = np.sqrt(tmp)
Ih = trapz(tmp, 5./100)
res = Iv*5.0 + Ih*1.0
#print (res)
return res

LIM = 2.0

a1,a2,a3,b1,b2,b3 = 0.1, 0.1, 0.1, 0.1, 0.1, 0.1


x0 = a1,a2,a3,b1,b2,b3

opts = {'maxiter': 50, 'verbose': 0}

def conx(x):
aa1,aa2,aa3,bb1,bb2,bb3 = x
a = a0+aa1*(5.0-1.0)+aa2*(5.0-2.0)+aa3*(5.0-3.0)-ex
return a

def cony(x):
aa1,aa2,aa3,bb1,bb2,bb3 = x
b = b0+bb1*(5.0-1.0)+bb2*(5.0-2.0)+bb3*(5.0-3.0)-ey
return b

cons = [{'type':'eq', 'fun': conx}, {'type':'eq', 'fun': cony}]

res = minimize (fun=calc_int,


x0=x0,
method='trust-constr',
hess = BFGS (),
bounds=Bounds([-LIM, -LIM, -LIM, -LIM, -LIM, -LIM],
[ LIM, LIM, LIM, LIM, LIM, LIM]),
constraints=cons,
options=opts)

return res

a0,b0=(1.0,1.0)
ex,ey=(4.0,2.0)
res = find_path(ex,ey,a0,b0)
print ('res',res)
print ('res',res['x'])

Sonuc
0.54188089 0.15991385 0.17636745 -0.20027426 0.26754927 0.4992246

import pandas as pd
import numpy as np

10
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from scipy.spatial.distance import cdist
from matplotlib import cm

rho = 7.0
def sig(x,a):
return (x-a)*1/(1+np.exp(-rho*(x-a)))

def gfunc(x, y):


s1 = 2.2; x1 = 2.0; y1 = 2.0
g1 = np.exp( -4 *np.log(2) * ((x-x1)**2+(y-y1)**2) / s1**2)
s2 = 1.2; x2 = 4.0; y2 = 1.0
g2 = np.exp( -4 *np.log(2) * ((x-x2)**2+(y-y2)**2) / s2**2)
return g1*10.0 + g2*10.0

def plot_surf_path(a0,a1,a2,a3,b0,b1,b2,b3):

D = 50
x = np.linspace(0,5,D)
y = np.linspace(0,5,D)
xx,yy = np.meshgrid(x,y)
zz = gfunc(xx,yy)

fig = plt.figure()
ax = fig.gca(projection='3d')
ax.set_xlim(0,5)
ax.set_ylim(0,5)
surf = ax.plot_wireframe(xx, yy, zz,rstride=10, cstride=10)

t = np.linspace(0,5.0,100)

def sigx(t):
t = t[0]
x = a0 + \
a1*sig(t,1) + \
a2*sig(t,2) + \
a3*sig(t,3)
return x

def sigy(t):
t = t[0]
y = b0 + \
b1*sig(t,1) + \
b2*sig(t,2) + \
b3*sig(t,3)
return y

xs = np.array([sigx([tt]) for tt in t])


ys = np.array([sigy([tt]) for tt in t])

ax.view_init(elev=45, azim=-113)
ax.plot3D(xs, ys, gfunc(xs,ys),'r.')

11
a1,a2,a3,b1,b2,b3=0.54187919, 0.15991569, 0.17636809, -0.20027283, 0.26755009, 0.4
a0,b0=(1.0,1.0)
plot_surf_path(a0,a1,a2,a3,b0,b1,b2,b3)
#plt.show()
plt.savefig('calc_multi_40_elev_06.png')
# -113,45

Sadece 3 tane ilmik noktası tanımladık, bu noktalar vektörel notasyon ile çoğaltılabilir.
Fakat optimizasyon gayet optimal bir yolu bulabildi, bu örnekte iki tane tepe var,
ama onların arasından geçerek sonuca ulaştı.
Bitiş noktalarını cebirsel değil conx ve cony adlı iki sınırlama tabiri ile zorladık.
Polinom bazlı eğride bazı türevleri sembolik olarak almıştık, burada tüm türevler
sayısal bazlı fakat sigmoid bazlı parametrik eğrilerin de sembolik türevini kullan-
mak zor değil. Burada hızlı kodlama amaçlı bunu yapmadık.
Kaynaklar
[1] Bayramlı, Sayısal Bilim, Sayısal Entegrasyon (Numerical Integration)
[2] Bayramlı, Çok Boyutlu Calculus, Ders 6, Eğri Uzunluğu
[3] Bayramlı, Çok Boyutlu Calculus, Ders 5, İki Nokta Arasında Parametrize Edilmiş
Eğri
[4] Bayramlı, İstatistik ve Veri Analizi, Dairesel Baz Fonksiyonları (Radial Basis Func-
tions -RBF-)
[5] Bayramlı, Fonksiyonel Analiz ve Optimizasyon, Newton-umsu Metotlar, DFP,
BFGS

12
Ekler
Yunan Harfleri

You might also like