Masalah pencarian vektor basis ideal dari sebuah sinyal telah dapat diformulasikan sebagai proses optimisasi berkendala (constrained optimization) P1. Tulisan ini akan terlebih dahulu membahas secara sekilas konsep optimisasi linier, khususnya LP (Linear Programming), dan metode pemecahannya. Meskipun kendala dalam P1 sebenarnya bersifat tak-linier, pengaturan parameter yang tepat dan batas-batas yang sesuai dapat mengubahnya menjadi permasalahan pemrograman linier. Suatu contoh pencarian basis ideal dari sinyal hasil bentukan sepasang ortobasis dipakai untuk menunjukkan kegunaan LP. Jika batasan sparsity terpenuhi, LP dapat menemukan seluruh basis penyusun sinyal sehingga sinyal dapat direkonstruksi secara eksak.
Pemrograman Matematika dan Optimisasi
Didalam optimisasi ada suatu fungsi objektif yang akan dioptimumkan; dibuat minimum atau maksimum. Kendala memberi batas wilayah dimana fungsi ini berlaku. Dari berbagai macam metoda optimisasi yang ada, salah satu yang memiliki pemakaian luas adalah pemrograman linier (LP/Linier Programming), suatu bentuk khusus dari pemrograman matematika (Mathematical Programming). Bahkan metoda Simpleks yang ditemukan oleh G. Dantzig untuk mencari solusi masalah LP dinobatkan sebagai satu dari sepuluh algoritma terbaik abad keduapuluh.
LP pada dasarnnya merupakan masalah pencarian nilai optimum dari suatu fungsi linier dengan kendala yang juga berbentuk linier. Berikut ini contoh sederhana dari permasalahan LP:
Tentukan harga
dan
yang meminimumkan nilai
, dengan syarat bahwa
,
, dan
.
Masalah diatas dapat dituliskan kedalam bentuk baku sebagai berikut:
minimize
subject to:
,
,
.
Nilai yang akan dioptimalkan disebut sebagai fungsi obyektif, dalam soal diatas adalah . Pemecahan masalah ini dapat dilakukan secara grafis dengan cara menggambarkan semua kendala, lalu mencari titik dimana nilai obyektif mencapai optimum dalam daerah solusi:
Gambar 1. Ilustrasi pencarian titik optimum dalam LP
Pada Gambar 1 diatas, daerah yang diarsir adalah pasangan yang memenuhi semua kendala yang diberikan atau disebut juga feasible region. Kita harus mencari satu titik dimana nilai fungsi obyektif mencapai optimal. Pada LP, solusi selalu terletak di pojok wilayah daerah atau titik simpul. Program Matlab berikut dapat dipakai untuk mencari solusinya:
%pemrograman linier untuk masalah sederhana % min c’x s.t. Ax<=b; x1>=1, x2>=1 %—————————————— c=[1;-1]; % koefisien fungsi obyektif A=[1 1; 1 -1]; %matriks A b=[10; 5]; % kendala lb=[1 1] ; %batas bawah x1 dan x2 [x, fval,exitflag,output,lambda]=linprog(c,A,b,[],[],lb); disp(sprintf(‘x1= %f x2=%f\n’,x(1),x(2))); %tampilkan
Dari eksekusi program akan diperoleh nilai yang akan menghasilkan nilai fungsi objektif paling kecil, yaitu -8. Posisi titik optimum ini terletak dipojok paling kiri atas dari politop yang menyatakan daerah solusi.
Metoda simpleks dari Dantzig melakukan perunutan setiap tepian wilayah hingga ditemukan titik optimal yang selalu terletak di sudut atau verteks dari politop. Dengan demikian, dapat ditunjukkan bahwa pada kondisi terburuk, metoda ini akan memiliki kompleksitas yang tumbuh secara eksponensial. Namun kebanyakan masalah praktis dapat dipecahkan dengan cukup cepat, karena kompleksitas rata-ratanya cukup kecil hingga dapat ditangani.
Masalah pertumbuhan kompleksitas perhitungan dalam metoda Simpleks akhirnya dapat diatasi oleh Narendra Karmakar dengan metoda interior point (IPM), yang memiliki kompleksitas polinomial. IPM tidak hanya dipakai pada optimisasi linier, kasus lain yang taklinier-pun dapat dipecahkan dengan metoda ini asalkan daerah solusi bersifat konveks. IPM mencapai kompleksitas polynomial karena tidak lagi merunut tepian daerah solusi, tapi masuk menerobos kedalam wilayah ini sampai solusi yang dicari dapat ditemukan.
Masalah optimisasi seperti diatas dapat dituliskan dalam bentuk umum sebagai berikut:
minimize
subject to:
bahkan dengan dengan menggunakan slack variables
, i = 1, 2, …, m
LP dapat dituliskan dalam bentuk matriks yang lebih ringkas, yaitu
minimize
subject to
Masalah mencari nilai minimum suatu fungsi obyektif dapat diubah menjadi pencarian maksimum fungsi obyektif yang lain dan demikian pula sebaliknya. Dengan demikian, pencarian nilai minimum diatas memiliki solusi yang sama dengan masalah dual-nya, yaitu pencarian nilai maksimum. Jika fungsi objektif dan kendala tidak lagi linier, fungsi dari peubah x ini dapat ditulis sebagai c(x) dan kendala dapat ditulis sebagai .
Metode Basis Pursuit dengan Pemrograman Linier
Metoda basis pursuit merumuskan pencarian basis ideal didalam kamus-basis
berdimensi NxM sebagai masalah pemrograman konveks:
(P1):
Telah diketahui sejak lama bahwa optimisasi non-linier l1 seperti ini ekivalen dengan LP
jika dilakukan substitusi sebagai berikut
M↔2M; x↔
; c↔[1 1 …. 1; 1 1… 1]; A↔
; b↔s
Artinya, kamus-basis digabung dengan nilai negatif dari kamus tersebut untuk menggantikan peran matriks A, batas kendala b digantikan dengan sinyal s, panjang vektor solusi dibuat menjadi dua-kalinya, sedangkan fungsi objektif adalah penjumlahan masing-masing koefisien vektor solusi sparse dan dimensi kolom diperbesar menjadi duakali-nya.
Cara ini selanjutnya akan dipakai untuk memecahkan masalah dekomposisi sinyal s terdahulu yang terdiri dari dua impuls dan dua vektor basis DCT. Sebagai tambahan, sinyal ini tercampur dengan derau acak Gaussian. Berikut ini kode Matlab-nya.
%———————————————– %Basis pursuit on overcomplete basis %Using Matlab Optimization Toolbox %To search for solution … modified %———————————————– %length of signal clear;close all;clc; N=64; %signal dimension over_factor=2; %over complete factor nAtoms=N*over_factor; %create pair of orto-basis dictionary D1=eye(N,N); D2=dct(eye(N,N)); D=[D1;D2]‘; %create a signal with N_support’ N_support=4; pN=[8 32 73 125]; %dpt diganti dng indeks acak jika perlu x=zeros(N,1); X=zeros(nAtoms,1);%’transformed-domain signal for k=1:N_support; x=x+D(:,pN(k)); X(pN(k))=1; end; x0=x; figure(1);plot(x0);title(‘Original Signal’); %perform measurement, >> add noise derau=randn(N,1); y = x0 + 5*derau/(derau’*derau); min_y=min(y); D_pos=-D; %define dictionary A A=zeros(N,2*over_factor*N); A(:,1:over_factor*N)=D; A(:,over_factor*N+1:2*over_factor*N)=D_pos; %Basis Pursuit on random basis f=ones(2*nAtoms,1); lb=zeros(2*nAtoms,1); alpha=linprog(f,[],[],A,y,lb); figure(2);plot(1:nAtoms,X,’r:’,1:nAtoms,alpha(1:nAtoms),’b–’); legend(‘original’,'alpha’); %obtain a few largest component, by sorting alpha [z,imax]=sort(alpha(1:nAtoms)); %Reconstruct estimated signal x_hat=zeros(N,1); for k=1:N_support; x_hat=x_hat+ D(:,imax(nAtoms-k+1)); end; x_hat1=D*alpha(1:nAtoms); figure(3);plot(1:N,x0,’k.’,1:N,y,’b-’,1:N,x_hat,’r:’,1:N,y-x0,’g-’,1:N,x_hat1,’k–’); legend(‘original’,'noisy’,'estimated’,'noise-level’,'D*alpha’); figure(4);plot(1:N,y-x0,’r-’,1:N,x_hat-x0,’b-’,1:N,x_hat1-x0,’k-’); legend(‘initial error’,'estimation error’,'D*alpha error’);
Gabungan pasangan sistem-basis impulse-DCT menghasilkan sebuah kamus-basis berukuran 64×128. Batas sparsity Elad-Bruckstein untuk pasangan basis ini adalah sekitar (0.9).8 atau sekitar 7. Dengan hanya mengambil 4 buah vektor basis penyusun, yaitu vektor pada urutan ke 8, 32, 73, dan 125 haruslah P1 dapat menemukan solusi eksak-nya.
Gambar 2. Vektor basis terpilih didalam kamus basis
Gambar 2 menunjukkan vektor basis terpilih oleh P1 yang tepat berhimpit dengan basis penyusun sinyal. Dengan demikian seluruh komponen sinyal telah berhasil ditemukan. Disamping itu, koefisian basis lainnya jauh lebih kecil daripada komponen basis penyusun. Komponen ini biasanya dihilangkan dengan peng-ambangan (tresholding).
Gambar 3. Sinyal asal dan hasil rekonstruksi
Gambar 4. Sinyal kesalahan
Berbagai sinyal dibandingkan dalam Gambar 3. Terlihat bahwa sebenarnya tingkatan sinyal derau (kurva berwarna hijau) cukup tinggi jika dibandingkan dengan sinyal asalnya (titik-titik hitam), menghasilkan distorsi yang signifikan (sinyal warna biru). Namun demikian, karena semua koefisien berhasil ditemukan, sinyal dapat direkonstruksi secara eksak. Hal ini ditunjukkan pada Gambar 4, dimana sinyal kesalahan (biru) berharga nol.
Catatan: Beberapa browser menerjemahkan karakter ‘prime’ secara salah sehingga program yang ada di blog ini tidak bisa langsung di-copy paste dari halaman web ke Command Window Matlab untuk dijalankan. Perbaiki terlebih dahulu kesalahan ini sebelum menjalankan program.