Friday, December 27, 2019

Membuka (terjemah) Quran di Terminal

Hari ini saya iseng mencari-cari aplikasi yang bisa menampilkan Al-Quran di command line alias terminal. Apa manfaatnya? (1) Ketika disebutkan surat dan ayatnya, misal 7:37, kita segera tahu arti ayat tersebut (dalam bahasa inggris); (2) Ketika membaca Quran (yang tidak ada terjemahannya), kita juga bisa langsung tahu artinya. Ternyata ada aplikasi ini Github. Langsung cus saya coba. Berikut tutorial singkatnya.

Friday, December 13, 2019

Tes Signifkansi (Paired t-test) dengan LibreOffice Calc

Tes Signifikansi

Tes signifikansi digunakan untuk menilai apakah dua hal (benar-benar) berbeda. Menggunakan logika penalaran (logical reasoning), kita tidak bisa menilai dua hal secara subyektif. Misal, A dan B itu berbeda, karena tidak sama persis. Tidak demikian. Kita harus berbicara berdasarkan data. Nah bagaimana menunjukkan kalau A dan B itu berbeda dengan data? Tes signifikansi-lah salah satu caranya.

Perlu dicatat, sebelum saya lanjutkan tulisan ini, banyak kritik atas penggunaan tes signifikansi. Salah satunya adalah tulisan ini. Sebagai solusinya, penulis artikel tersebut menyarankan penggunaan confidence level. Saya tidak akan membahas hal tersebut (meskipun saya setuju). Prinsip saya, mempelajari apa yang sedang digunakan (meski dianggap salah atau tidak layak), tetap bermanfaat sehingga kita tahu kekurangannya.

Paired t-test

Ada beberapa macam t-test: paired,  two samples with equal variance, dan two samples with unequal variance. Kali ini saya akan membahas paired t-test, karena itu yang saya pakai. Pair t-test digunakan untuk mengecek dua proses (misal sebelum dan sesudah improvement),  Asumsi yang dipakai adalah bahwa bahwa perbedaan rataannya 0.  Paired t-test baik dipakai jika:

  • Proses/metode yang berbeda pada subyek yang sama
  • Tidak ada data outlier

One-tail vs Two-tail dan p-value

Analisis One-tail vs Two-tail dilihat dari kurva distribusinya. Perhatikan gambar di bawah ini. Jika memakai two-tail (ini yang akan dipakai) kita memakai dua sisi-nya. Jika memakai satu-sisi maka hanya dipakai setengah sisinya. Memakai two-tail, dengan confidence level 95% maka significance leevel-nya adalah 5% atau 0.05. Inilah batas nilai p-value (asserting p-value=0.05). Jika nilai p-value di bawah nilai batas tersebut, maka null hypothesis kita tolak dan alternatif hypothesis kita terima (artinya: perbedaan yang kita dapatkan signifikan).


Monday, December 02, 2019

Panduan Berpikir Kritis

Tulisan ini merupakan ringkasan dari sebuah buku: Asking the Right Questions, A guide to critical thinking, yang ditulis oleh M. Neil Browne dan Stuart M. Keeley dari Bowling Green State University. Buku tersebut cukup sukses dan banyak dipakai, dari S1 hingga S3; terbukti dari cetakannya yang memasuki edisi ke-11. Meski telah memasuki edisi ke-11, ringkasan ini saya buat berdasarkan edisi ke-7 karena strukturnya lebih runtut dan mudah dipahami.

Berpikir kritis, menurut definisi buku tersebut, adalah mengacu pada tiga dimensi seperti pada gambar di bawah ini. Ketiganya harus terpenuhi, dan untuk memenuhinya "menanyakan pertanyaan yang tepat" adalah kuncinya.


Manfaat Berpikir Kritis
Berpikir kritis bermanfaat untuk meningkatkan kemampuan menulis dan berbicara karena akan menuntun anda ketika:
  1. Bereaksi kritis atas tulisan, baik di buku, website, jurnal maupun makalah.
  2. Menilai kualitas dari sebuah pemaparan (kuliah, presentasi, dll)
  3. Membentuk argumen
  4. Membuat essai
  5. Berpartisipasi pada diskusi (kelas, dll)

Prinsip Berpikir Kritis

Prinsip yang dimaksudkan disini adalah nilai, standar acuan. Lebih lengkapnya:
Values are unstated ideas that people see as worthwhile.
They provide standards of conduct by which we measure the quality of human behavior.
Dari definisi diatas, maka prinsip-prinsip berpikir kritis adalah sebagai berikut:
  1. Merdeka. Pemikiran anda tidak dikekang oleh siapapun dan apapun.
  2. Keingintahuan. Untuk 'mendulang emas' dalam hidup, anda harus mendengar dan membaca.
  3. Legowo. Bisa menerima perbedaan dan mengakui jika tidak tahu.
  4. Respek. Menghormati (pendapat) orang lain.

The right questions: Pertanyaan yang tepat

Menanyakan pertanyaan yang tepat adalah isi bab-bab dalam buku ini. Berikut adalah pertanyaan yang seharusnya mampu dijawab dan ditanyakan pada saat yang tepat oleh seorang pemikir kritis.

Thursday, November 28, 2019

A (Muslim) Trip to Lanzhou, China

This trip was a conference trip, APSIPA 2019. This year APSIPA conference was held in Lanzhou City, Gansu Province, China.

Departure

I depart from Kansai Airport. Because the flight is in the morning, at 9 am, I stay one night in Kansai AP (first cabin hotel) before departure. A prayer room is available on the 3rd floor. The halal ざ-udon on the second floor is what I always visited when departing from Kansai. For subuh prayer, I can do it in my bed. Although it is very small, we can use it to stand face to qibla. Another choice is to do it in a private area of the bathroom. One of the bathrooms in First Cabin Kansai has a large space (about 3 x 1.5 m outside shower room).

Transit in Beijing (BCIA, Beijing Capital Int'l Airport)

China is complicated (compared to Japan). The security is very strict. You need to be scanned in a dedicated base. No laptop, tablet, phone, coin, liquid more than 100 ml, should be inside the bag. Separate it. Prohibited items such as a knife, cutter, liquid more than 100 ml, should be moved into the suitcase, not as in cabin baggage.

Prepare the arrival statement card (yellow) in advance before entering the immigration post. The staff (police) also asked about my last boarding pass. Once they passed me to enter China, I can look for space to pray (Dhuhur and Ashr) inside the terminal (T3).

There is no dedicated prayer room in T3. I used the most quite waiting space (near a gate) to pray, behind digital signage advertisements. Some peoples see me when I pray. I think it is no problem. Once finished, I go for waiting the time in a space near my gate.

There is free wifi in BCIA (Beijing Capital Intl Airport). To use it, you must scan your passport in a machine to get id and password. Lanzhou airport also provides free wifi. Note that all Google services are blocked in China. A vpn is required beforehand to use Google service.
 

Stay in AirBnB rented room

I rent a room via AirBnB. It is cheaper than a hotel, just JPY 16000 for 5 days with a similar facility to the hotel. However, although that apartment is very close to the venue, it needs a digital key to enter. Luckily, a friend from Thailand arrives earlier. We call him via free wifi in Crown Plaza Hotel to pick up.

First Walking Course

On the second day, I take a walking course along the Yellow River. I used two different bridges to go and back to my hotel. This is my first impression of real life in China. They have such facilities as the futsal field, parks, and pavement along the river. However, urban areas still lack proper facilities. Some road is not asphalted yet. The image below is my first walking course path in the Lanzhou area. The distance of my walk is 4.3 km.

First walking course path

Saturday, November 16, 2019

Menjadi Logis [5]: Prinsip-prinsip Pemikiran Tidak Logis

Ini adalah ringkasan bab terakhir buku "Being Logical". Bab ke-5 ini berisi prinsip-prinsip pemikiran tidak logis. Ringkasan bab sebelumnya bisa dibaca di sini.

Penalaran yang tidak masuk akal (mis-reasoning), disebut kekeliruan (fallacy), dibagi menjadi dua:
  1. Kekeliruan formal: berkaitan dengan bentuk atau struktur dari argumen.
  2. Kekeliruan informal: selain kekeliruan formal.
Beberapa prinsip yang menyebabkan terjadinya kekeliruan logika adalah sebagai berikut.

1. Menolak anteseden
Prinsip yang digunakan seperti ini.
A ==> B
-A,
Maka, -B

Ini adalah kesimpulan yang salah. Contoh:
Jika Bagus berlari, maka Bagus berpindah tempat.
Bagus tidak berlari.
Maka,  Bagus tidak berpindah tempat.

Tentu saja kesimpulan tersebut salah. Bagus bisa berpindah tempat dengan selain berlari, misalnya dengan berjalan.

2. Menyetujui konsekuensi
Prinsipnya seperti ini,

A ==> B
B,
Maka, A.

Ini juga salah. Contohnya.
Jika Bagus berlari, maka Bagus berpindah tempat.
Bagus berpindah tempat.
Maka, Bagus berlari.

Kesimpulan yang salah, karena untuk berpindah tempat tidak harus berlari.

3. Nilai tengah yang tidak terdistribusi
Dalam silogisme, kesimpulan selalu universal (terdistribusi) bila syarat-syaratnya terpenuhi, salah satunya: pernyataan tengah (premis yang tidak muncul pada kesimpulan) harus universal. Jika syaratnya tidak terpenuhi. Contohnya sebagai berikut:

Beberapa anggota klub motor adalah adalah mahasiswa.
Bagus adalah anggota klub motor.
Maka, Bagus adalah mahasiswa.

4. Equivocation
Kata ekuivokal adalah kata yang memiliki arti lebih dari satu (homonim).
Bagus suka tahu.
Banyak tahu itu tidak baik.
Maka, Bagus tidak baik.

Kesimpulan yang salah, karena yang dimaksud tahu pada premis mayor adalah makanan.

5. Mengulang pertanyaan
A: Apakan pinus itu?
B: Pohon yang memiliki biji pinus.
A: Apakah biji pinus itu?
B: Biji yang ada di pohon pinus

6. Asumsi yang salah

Wednesday, November 13, 2019

"Logika dan Percakapan"-nya Grice beserta Kritiknya

Herbert Paul Grice (13 March 1913 – 28 August 1988) merupakan filsuf bahasa Inggris yang banyak bekerja di bidang implikatur dan semantik. Tulisan ini membahas tulisannya tentang logika dan percakapan (logics and conversation), prinsip didalamnya, beserta kritik terhadap tulisan tersebut.

Logika dan Percakapan

"Berkata" berhubungan erat dengan apa yang diucapkan, tidak termasuk hal-hal lain yang ingin diutarakan pembicara diluar apa yang diucapkan (kecuali hanya apa yang dikatakannya). Berkata adalah ungkapan semantik (makna dari kata). Sederhananya, anda tidak bisa ngomong A tapi yang anda maksudkan B (misalnya seperti ini, "maksudku begini lho...."). Tidak bisa.

Hal ini berbeda dengan membayangkan, menyarankan, menyampaikan, mengindikasikan, dll. Hal-hal tersebut di luar apa yang dikatakan. Berimplikasi (implicating) adalah ungkapan pragmatik (kesesuaian antara apa yang dikatakan dengan apa yang dimaksudkan).

Grice mengusulkan teori implikatur, salah satu aspek kajian pragmatik yang perhatian utamanya adalah mempelajari ‘maksud suatu ucapan’ sesuai dengan konteksnya. Implikatur cakapan dipakai untuk menerangkan makna implisit dibalik “apa yang diucapkan atau dituliskan” sebagai “sesuatu yang diimplikasikan” (implicatum: what is implied)  [3].

Implikatur: Konvensi vs Cakapan

Implikatur, berdasarkan ragamnya, oleh Grice dibagi menjadi dua: implikatur konvensi dan implikatur cakapan. Perhatikan kalimat dalam bahasa Inggris berikut.

“He’s an Englishman, so he’s brave.”

Pada kalimat di atas, kata 'brave' merupakan implikasi dari 'Englishman', tanpa disebutkan secara langsung. Bandingkan dengan contoh.

“She is poor, but she is honest.”

Kata 'honest', pada kalimat diatas merupakan implikasi kebalikan dari kata 'poor'. Namun disini perlu kata 'but', untuk menerangkan pertentangan 'poor' dengan 'honest' untuk membawakan implicatum. Ini adalah contoh implikatur cakapan (conversational implicature) yang mana merupakan bagian dari semantik.

Prinsip Kooperatif (kerja sama)

Monday, November 11, 2019

Menjadi Logis [4]: Sumber pemikiran tidak logis

Ini adalah kelanjutan tulisan sebelumnya, sebuah ringkasan dari buku "Being Logical", Bab ke-4: the source of illogical thinking.

Kesalahan dalam penalaran bisa karena ketidaksengajaan (kecelakaan), atau akibat dari ketidakhatian. Beberapa perilaku dan pandangan berikut perlu dihindari karena bisa mengakibatkan pemikiran yang tidak logis.

1. Skeptis
Sikap skeptis (meragukan) perlu, namun selalu skeptis akan menuntun pada kekeliruan. Contoh skeptis yang diperlukan: Jika datanya meragukan, kita boleh meragukan kesimpulannya. Namun jika kita selalu meragukan argumen orang lain (misal yang tidak kita sukai), akan menjadikan hal tersebut non-logis.

2. Agnostik evasif
Agnostik tidak hanya dalam beragama, tetapi juga dalam berpikir. Orang yang atheis secara tegas tidak mengakui adanya tuhan. Orang agnostik "tidak tahu", apakah tuhan itu ada atau tidak (Setelah mereka meninggal mereka baru tahu, namun itu (menurut saya) sudah telat). Pemikiran yang agnostik mengelak adanya tuhan, namun juga menampik ketidakadaan tuhan, mereka hanya "mengabaikan" sebagai sesuatu yang benar. Bentuk pengabaian ini merupakan akibat kemalasan (untuk mencari tahu).

3. Sinis dan optimis naif
Sikap sinis adalah memberikan penilaian negatif tanpa bukti yang cukup. Sikap naif optimis sebaliknya memberikan penilaian positif tanpa bukti yang cukup. Keduanya tidak logis dan bentuk dari prasangka (prejudice). Prasangka tidak logis karena memberikan kesimpulan sebelum fakta/bukti/premisnya kuat.

Friday, November 08, 2019

Ergonomic touch typing - finger placement revisited

Introduction

If you work with a computer, having a typing skill is a must. You may slow at typing and you think that is not a problem. That is right. But by having precision and fast typing, we can increase our work productivity. It means we use less time to finish the same amount of workload than unproductive work. This article is my sharing of using appropriate finger placement to increase the accuracy and speed of my typing. Please note, accuracy is come first before speed. That is my ultimate goal. As a metric, I used accuracy (%) and word per minute (wpm) to measure my typing accuracy and speed. I evaluate this performance in a month using the keybr.com tool.

Rationale

Every people has a different length and size of fingers. Making a standard layout for finger placement on a computer keyboard (touch typing) may work for some people, but also may not work for other people. For example, the following two images are photographs of my fingers. As you can see, my middle fingers longer than any other fingers with a significant factor; 1 cm from ring finger and 1.5 cm from the index finger.
Fig 1. My fingers on MBP 2012 keyboard
Here the more details.

Thursday, October 31, 2019

Menjadi Logis [3]: Argumen: Bahasa Logika [2]

Tulisan ini adalah kelanjutan tulisan sebelumnya: Menjadi Logis [3]: Argumen: Bahasa Logika [1]. Karena isi dari Bab 3 buku "Being Logical" cukup panjang, saya pecah ringkasannya menjadi dua artikel, agar mudah dibaca dan dipahami.

Saya mulai penomoran itemnya dari 11, melanjutkan tulisan sebelumnya 1-10.

11. Kebenaran Premis
Dalam argumen silogisme ada kesesuaian antara konten dan struktur. Konten akan benar jika premisnya benar. Jika premisnya salah, maka secara konsisten kesimpulannya menjadi salah. Contohnya adalah berikut.

Setiap anjing memiliki tiga kepala.
Corolla adalah anjing.
Corolla memiliki tiga kepala.

Meski secara struktur benar, namun karena premisnya salah, kesimpulannya menjadi salah. Dapat dikatakan, jika inputnya sampah, maka outputnya juga sampah (garbage in, garbage out).

12. Relevansi Premis
Meski premis harus benar, namun itu saja tidak cukup. Kebenaran premis harus relevan dan menjangkau kesimpulan. Contohnya adalah berikut.

Pak XXX merupakan purnawirawan jenderal TNI AD.
Beliau sekarang seorang wirausahawan yang sukses.
Karenanya, beliau seharusnya terpilih menjadi presiden.

Pada pernyataan diatas, premisnya benar (kalimat satu dan dua), namun kurang relevan dengan kesimpulan yang diambil (kalimat 3). Bandingkan dengan argumen berikut.

Pak YYY adalah wirausahawan sukses.
Beliau terpilih menjadi walikota ZZZ dan gubernur AAA selama dua periode.
Melihat kecakapannya memimpin kota dan provinsi, maka beliau layak menjadi presiden.

Argumen kedua ini lebih logis karena ada relevansi antara premis dan kesimpulan.

13. Pernyataan Fakta, Pernyataan Nilai
Pernyataan bisa berupa fakta atau berupa nilai. Contohnya berikut,

Musisi adalah mereka yang piawai memainkan alat musik.
Bagus adalah musisi.
Kesimpulan: Bagus piawai memainkan alat musik.

Bandingkan dengan pernyataan berupa nilai berikut.

Musisi adalah manusia yang sangat unggul.
Bagus adalah musisi.
Kesimpulan: Bagus adalah manusia yang sangat unggul.

Kata unggul sebagai nilai pada argumen di atas samar (vague). Premis dengan pernyataan nilai tidak bisa digunakan secara presisi seperti pernyataan nilai. Untuk mengetes validitas pernyataan nilai, premis tersebut diuji dengan fakta lainnya yang ada, bila cocok maka bisa diterima.

Tuesday, October 29, 2019

Menjadi Logis [3]: Argumen: Bahasa Logika [1]

Tulisan berikut merupakan review Bab ke-3 buku "Being Logical". Review dari bab sebelumnya ada di sini dan di sini. Bab 3 berisi tentang argumen: bahasa logika. Ekspresi konkrit dari penalaran logika adalah argumen. Untuk membuat argumen yang kuat dan efektif, beberapa hal-hal berikut perlu diperhatikan.

1. Membangun Argumen
Perpindahan ke satu ide dari ide yang lain yang telah diketahui kebenarannya, dan menjadikan ide kedua menjadi benar, merupakan inti argumen. Argumen terdiri atas pernyataan-pernyataan, dan pernyataan-pernyataan itulah yang menyampaikan ide dimana perpindahan inferensial (bersifat dapat disimpulkan) terkonsentrasi.

Argumen tersusun atas dua: pernyataan premis dan pernyataan simpulan. Premis adalah pernyataan pendukung. Pernyataan ini merupakan awal argumen dimana kebenaran pernyataan tersebut sudah diketahui. Simpulan adalah pernyataan yang didukung. Premis bisa bermacam-macam, namun simpulan yang baik seharusnya hanya berisi satu hal. Contoh argumen sederhana yang terdiri atas satu pernyataan premis dan satu simpulan.
Karena tidak cocok dengan kepala kantor cabang di Surabaya, Pak Budi dipindahkan ke kantor cabang di Bandung.
Kalimat pertama merupakan premis; alasan, yang dianggap benar. Kalimat kedua adalah simpulan yang menjadi benar karena premisnya benar. Premis adalah dasar dari argumen, dan cakupannya harus bisa mampu menjangkau apa yang disimpulkan.

2. Perpindahan dari universal ke partikular
Perpindahan dari pernyataan universal bisa dilakukan ke pernyataan partikular. Perhatikan contoh berikut.
(i) Semua anjing adalah karnivora. (ii) Beberapa anjing adalah karnivora. 
Karena pernyataan universal (i) adalah benar, maka pernyataan partikular (ii) juga benar. Logika dari prinsip ini cukup sederhana, jika semua anggota dari satu kelas adalah benar, maka sebagiannya juga benar.

3. Perpindahan dari partikular ke universal
Berbeda dengan kaidah sebelumnya, kita tidak bisa secara asa menggeneralisasi dari pernyataan partikular ke pernyataan universal. Perhatikan contoh berikut.
(i) Beberapa wanita adalah ibu. (ii) Semua wanita adalah ibu. 
Pernyataan partikular (i) tentu saja benar, namun tidak dengan pernyataan universal (ii). Untuk berpindah dari pernyataan partikular ke universal dibutuhkan premis yang kuat dan runtut. Perhatikan contoh berikut.
Setiap orang China yang saya temui di sana bermata sipit. Penduduk Lanzhou 99% bermata sipit berdasarkan data sensus tahun 2010. Di beberapa propinsi lain, persentase penduduk bermata sipit juga mendekati 100%. Bisa disimpulkan, sebelum terjadinya perkawinan antar ras, semua penduduk China bermata sipit.

Sunday, October 27, 2019

Menjadi logis [2]: Prinsip Dasar Logika

Tulisan ini adalah kelanjutan tulisan sebelumnya, Menjadi Logis [1]: Menyiapkan Akal untuk Logika. Tulisan ini merupakan bagian terpenting dari catatan seri kuliah "scientific discussion" [1] di JAIST. Tulisan ini saya buat sesederhana mungkin agar bisa dibaca oleh semua orang. Tidak ada kata-kata yang seharusnya tidak ada. Sebaliknya, semua yang harus ada harus tertulis di sini. Semua yang bisa membaca seharusnya mampu memahami tulisan ini.

Setelah kita membiasakan hal-hal untuk menerima logika, langkah selanjutnya adalah mengasimilasikan prinsip-prinsip dasar logika agar menjadi kebiasaan kita. Berikut prinsip-prinsip dasar logika tersebut.

1. Prinsip-prinsip utama
Sains adalah kumpulan pengetahuan terstruktur yang dibangun dari prinsip-prinsip utama. Logika, sebagai sains, juga demikian, dibangun atas prinsip-prinsip utama. Ada empat prinsip utama logika sebagai berikut:
  1. Prinsip identitas: sesuatu adalah apa adanya.
  2. Prinsip pengecualian nilai tengah: antara ada dan tidak ada tidak ada nilai tengah.
  3. Prinsip alasan yang cukup: ada alasan yang cukup untuk semuanya.
  4. Prinsip kontradiksi: tidak mungkin sesuatu menjadi dan tidak menjadi pada satu waktu.
Tiga dari prinsip di atas diusulkan oleh Aristoteles, sedangkan satu dari Leibiniz, yakni prinsip cukup alasan. 

Prinsip identitas (principum identitatis) adalah prinsip yang paling utama diantara yang utama. Secara sederhana, A adalah A, bukan B. Kucing adalah kucing bukan anjing. Segitiga adalah segitiga, bukan segi empat. Semua yang logis harus beridentitas [2]. Sebaliknya, sesuatu yang identitasnya dipertanyakan juga dipertanyakan kelogisannya.

Prinsip kedua mengatakan bahwa tidak mungkin ada kondisi tengah diantara ada dan tidak ada. Sebagai contoh: di dalam kotak ada kucing atau tidak ada kucing, tapi tidak diantaranya (yakni setengah ada dan setengah tidak ada).  B adalah kucing, bukan anjing, tidak mungkin setengah kucing dan anjing.

Prinsip ketiga merupakan prinsip penting dalam logika dan diskusi saintifik, termasuk/khususnya penulisan ilmiah. Harus ada alasan untuk semuanya. Prinsip ini mirip hukum sebab-akibat. Ketika anda mengusulkan metode A, harus ada alasan mengapa A. Ketika anda mengusulkan variabel X, harus ada alasan mengapa variabel X, bukan Y. Kenapa menggunakan contoh kucing dalam kotak, karena contoh tersebut sangat sederhana sehingga mudah dimengerti semua orang. Itu juga alasan untuk contoh sebelum dan sesudah prinsip ini.

Prinsip terakhir -- kontradiksi -- mirip dengan prinsip kedua. Bedanya, kalau dalam prinsip kedua tidak ada nilai tengah, maka dalam kontradiksi tidak mungkin ada dua keadaan dalam satu waktu. Tidak mungkin ada kucing dalam kotak A dan tidak ada kucing dalam kotak A. Tidak mungkin B adalah kucing dan anjing. Contoh pertama dikembangkan oleh Erwin Schrodinger dalam eksperimen pemikirannya: kucing dalam kotak. Menurutnya, tidak mungkin kucing dalam keadaan hidup dan mati bersamaan. Meski probabilitasnya 50:50, tapi tidak bisa dikatakan bahwa kucing hidup dan mati dalam keadaan bersamaan. Harus dibedakan antara probabilitas dan realita. Probabilitas tidak mengubah realita. Realita ada dengan atau tanpa observasi. Inilah logika.

2. Daerah abu-abu, daerah yang dibuat abu-abu
Daerah abu-abu adalah daerah dimana kebenaran tidak secara jelas dapat dinyatakan. Dalam hidup, banyak daerah abu-abu, namun jangan terlalu banyak menggunakannya. Abu-abu, sebagai warna, ada karena perbedaannya sebagai alternatif warna putih dan hitam. Jika dalam hidup kita berada pada situasi dimana tidak ada alternatif yang jelas, secara objektif, bukan berarti tidak ada alternatif yang jelas. Tidak adanya alternatif bukan karena tidak ada, namun karena kita tidak bisa melihatnya. Daerah yang dibuat abu-abu ada karena kita tidak bisa melihat daerah abu-abu, (sebenarnya) disebabkan ketidakpastian kita atau kurangnya pengalaman.

Sebagai contoh, anda berada  pada suatu masalah, menentukan benar atau salah. Anda tidak memiliki pengalaman kalau masalah tersebut benar, namun anda punya pengalaman kalau masalah itu salah. Prinsipnya: negatif hanya dapat dikenali sebagai negatif, "secara tidak pasti", karena positif telah diketahui. Disini ada kemungkinan kepastian. Jika pasti itu mungkin, maka kepastian itu mungkin terjadi, meski tidak pasti. Itulah yang harus dipilih.

Menjadi logis [1]: Menyiapkan akal untuk logika

Ini adalah resume buku "Being Logical: A guide to good thinking", sekaligus referensi utama kuliah "E413: Scietific Discussion 2" di JAIST. Tulisan ini adalah resume Bab 1 buku tersebut. Judul babnya adalah: Preparing for the Mind.

Ada tiga materi utama kuliah ini:
1. Logika dan penalaran
2. Argumentasi
3. Diskusi ilmiah (lisan dan tulisan)

Untuk menjadi logis kita perlu menyiapkan sikap, pandangan dan prosedur praktis agar logika bisa masuk, diterima maupun keluar dari akal kita. Hal-hal tersebut, dibahas dalam Bab 1 buku "Being Logical", adalah sebagai berikut.

1. Memberi atensi
Menjadi atensif adalah hal mutlak diperlukan untuk menerima logika. Banyak kesalahpahaman karena kita tidak menaruh perhatian terhadap apa yang kita dengarkan. Mendengar (hear) saja tidak cukup, harus mendengar secara seksama (listen). Fokus kita bisa dilatih. Dengan melatih fokus kita pada hal-hal kecil, kita akan terhindar dari permasalahan besar.

2. Mendapatkan fakta secara langsung
Fakta bisa didapatkan secara langsung untuk objek riil (benda, tempat, dll), dan tidak langsung untuk suatu kejadian. Contoh: anda mendengar bahwa ada diskon di Matahari. Anda datang ke Matahari dan ternyata memang ada diskon. Bagaimana jika kita tidak bisa mendatanginya langsung. Contoh: Presiden Jokowi menang pemilu 2019. Dengan mendatangi website KPU, kita bisa mengkonfirmasi bahwa fakta itu benar adanya. Jika kita tidak bisa membuktikannya langsung (dengan mendatangi), maka kita perlu mengeceknya secara tidak langsung, dengan perangkat lain, misalnya website pada contoh di atas.

3. Ide dan objek dari ide
Ide dan objek dari ide berbeda. Suatu ide harus dapat direpresentasikan menjadi objek. Contoh kita punya ide mempercepat suatu proses komputasi dengan mem-by pass prosesnya. Ide tersebut direpresentasikan dalam bahasa pemrograman (objek dari ide). Cara terbaik untuk mengklarifikasi ide (apakah berjalan atau tidak) adalah dengan melihat objeknya, berhasil atau tidak.

4. Memperhatikan asal ide
Kita pada dasarnya yakin bahwa ide dari akal kita. Murni dari akal kita? Tidak. Lingkungan berpengaruh. Ide kita muncul karena lingkungan, tempat, waktu dan latar belakang lainnya. Jika gagal menghubungkan ide kita dengan asalnya (ide) secara sistematis, maka ide tersebut menjadi unreliable, tidak terpercaya.

Sunday, September 22, 2019

Banyak Tahu itu Tidak Baik

Pada suatu jamuan makan malam (sekitar akhir 2017) setelah konferensi, saya bercakap-cakap dengan orang Jepang. Beliau bertanya tentang riset saya, dan saya menceritakannya. Saya balik bertanya, untuk bidang "ini", dimana yang terbaik di Jepangnya ya? Sambil menyebutkan nama-nama sensei (professor) yang saya ketahui di bidang tersebut. Dia menjawabnya, sambil menimpali: "Kamu banyak tahu ya...".

Di situlah tersadar, banyak tahu itu tidak baik. Orang Jepang, hanya mengurusi yang menjadi urusannya. Mereka hanya mengetahui apa yang digelutinya. Saya perhatikan teman-teman saya orang Jepang, tidak ada satupun yang mentweet tentang politik, pun urusan lainnya. Bisa jadi, nama menteri nya sendiri pun mereka tidak hafal. Bahkan saya pernah bercakap dengan orang Jepang yang nama kaisarnya sendiripun dia tidak ingat.

Kemudian saya mencari (googling) dengan kata kunci: "Know everything is bad", dan menemukan artikel cukup bagus di link ini:
http://davidsearson.com/2015/11/14/why-knowing-everything-is-a-bad-idea/

Di situ dijelaskan juga, banyak tahu itu merupakan ide yang buruk. Kenapa ide yang buruk? Karena tidak ada artinya, tidak ada maknanya (untuk masa depan). Contoh kasus saya diatas, kalaupun saya tahu nama-nama professor di bidang saya tersebut, apa untungnya buat saya? Untuk mencari tempat postdoc? untuk mencari kerjaan/lowongan? Kalau dicari-cari, pembenaran selalu ada. Dalam link artikel bahasa inggris tersebut, sebenarnya bukan pengetahuan yang lebih penting, tapi hikmah (untuk merencanakan masa depan). Jadi urutannya adalah,

Dari diagram alir diatas, yang kita butuhkan adalah tapis, atau filter. Kita menapis banyak (big) data menjadi pengetahuan, dan menggunakannya untuk merencanakan masa depan menjadi hikmah. Jadi kalau ada kebingungan ketika mengambil sebuah keputusan karena banyaknya pilihan atau informasi, sesungguhnya bukan kebanyakan informasi yang salah, tapi kegagalan filter kita untuk menyaring informasi tersebut.

Bukan karena kebanyakan informasi, tapi karena kegagalan filter.


Implementasi

Lalu bagaimana mengimplementasikan "filter" untuk menapis banyaknya informasi/pengetahuan disekitar kita?
Tombol "unfollow", "unsubscribe", "I don't like this (ads)", adalah beberapa yang saya sukai. Bayangkan kalau kita follow/subscribe 1000 akun (youtube, twitter, fb, dll), dan setiap akun memposting 1 tweet/video/status dalam setiap hari, maka dalam sehari kita menerima 1000 posting, diluar iklan. Jika satu jam dari tiap akun tersebut memposting/share video/status/twitter baru, maka kita akan menerima informasi sejumlah:

24000

Setiap jamnya, diluar iklan.

Aturan saya dalam memfollow/subscribe akun cukup sederhana: "Follow/Subscribe" yang bermanfaat, lainnya: abaikan. Sekalipun itu akun orang terkenal, orang berpengaruh ataupun pejabat. Masa depan, kita tentukan sendiri, dari informasi yang kita dapatkan, dan kita filter.

Banyak mencari tahu juga tidak baik

Internet memudahkan kita untuk mencari tahu. Cukup duduk manis di depan laptop, mengetikkan kata kunci dari apa yang ingin kita ketahui dan whoala! apa yang kita cari tahu kita dapatkan. Ini tidak baik. Pencarian terhadap satu kata kunci akan memicu pencarian-pencarian kata kunci lainnya. Begini logikanya. Dari hasil pencarian satu kata kunci, anda mendapatkan informasi tentang kata kunci A dalam suatu halam internet (web page). Di laman tersebut anda kemudian menemukan istilah lain. Bisa juga anda penasaran apa agama si A, siapa istri si A, siapa mantan si A, dimana A dilahirkan, dst. Memiliki pengetahuan atas pencarian tersebut menyenangkan, sebagaimana makan camilan atau memiliki uang. Begitu kata hasil penelitian [1]. Bahkan, kesenangan mendapatkan atas jawaban dari apa yang kita cari tersebut bisa disetarakan dengan uang [1]. Inilah tantangannya: meredam kesenangan kita mencari tahu dari sesuatu yang tak penting.

Terakhir, less is more, dan diam itu emas (tapi sedikit orang yang bisa melakukannya). Sedikit tahu akan menjadikan kita ahli dan pro di bidang kita masing-masing.

Referensi
[1] Kobayashi, Kenji, and Ming Hsu. "Common neural code for reward and information value." Proceedings of the National Academy of Sciences 116, no. 26 (2019): 13061-13066.

Thursday, September 19, 2019

Numpy Array: merubah nilai tertentu (NaN) menjadi nilai lain

Keterangan ada pada komen (#) di dalam screencast.
TL;DR (too long; didn't read):
 a_without_nan = np.nan(a_with_nan, nan=0) # change NaN to 0


Lebih lengkapnya: 

https://bagustris.blogspot.com/2020/06/menghapus-dan-mengganti-data-nan-pada.html

Sunday, September 15, 2019

Memahami size dan shape NumPy array

NumPy mirip dengan Matlab, jika kita menguasai bentuk matrik yang kita proses, maka akan mudah memahami proses komputasinya.

Langsung saja, perhatikan gambar berikut.



Sehingga, bentuk-bentuk matriks dapat dibagi sebagai berikut:
  1. 1D array, contohnya matrik berbentuk (2, ), (3, ), (4, ).
  2. 2D array, contohnya matrik berbentuk (3, 1), (2,3), (3,3).
  3. 3D array, contohnya matrik berbentuk (3, 1, 1), (3, 2, 3), (4,3,2).
  4. ND array, contohnya matrik berukuran (n, 4, 3, 2), (n, n, 4, 3, 2).
Jika a adalah sebuah NumPy array (disingkat: np array), maka beberapa atribut (perintah) penting dari a adalah:
  • a.ndim: untuk mengetahui banyaknya dimensi dari variabel np array (1D, 2D, dll).
  • a.shape: untuk mengetahui bentuk/shape dari variabel np array (misal (2,3)).
  • a.size : untuk mengetahui total elemen matriks.
  • len(a): untuk mengetahui panjang (baris/axis 0) dari np array, sama dengan a.shape[0].

Perhatikan screen cast berikut untuk implementasinya dengan Python.

Sesuai dengan judul artikel ini, size dan shape merujuk pada ukuran dan bentuk. Ukuran bernilai skalar, yakni banyaknya elemen, sedangkan bentuk bernilai matriks (baris, kolom). Namun kedua istilah tersebut kadang disamakan. Contohnya berikut.
In [1]: a = np.random.randint(0,10, size=(4, 3))                                

In [2]: a.shape                                                                 
Out[2]: (4, 3)

In [3]: a.size                                                                  
Out[3]: 12

In [4]: b = np.zeros(shape=(3, 2))                                              

In [5]: b.shape                                                                 
Out[5]: (3, 2)

In [6]: b.size                                                                  
Out[6]: 6
Jadi sebagai attribut kelas, shape dan size berbeda, sedangkan sebagai argumen keduanya sampai saat ini masih disamakan. Mungkin karena pengaruh bahasa C seperti yang didiskusikan pada forum ini

Untuk memahami pengubahan bentuk matriks pada NumPy array, silahkan baca artikel saya di SainsHack berikut: pengubahan bentuk matriks pada NumPy arrah.

Friday, September 13, 2019

Menghapus data NaN pada Pandas DataFrame

Pada data yang kita gunakan, umumnya ada data yang tidak ada, alias kosong, alias null, atau None, atau umum ditandai dengan NaN pada Python.

Untuk menghapus data NaN, beserta baris pada data nan tersebut perintah dasarnya adalah,

df.dropna()

dimana "df" adalah pandas dataframe. By default, perintah di atas akan menghapus baris yang mana ada data NaN. Jadi yang dihapus adalah barisnya, axis=0. Untuk menghapus kolom yang berisi Nan, gunakan argumen `axis=1`.

df.dropna(axis=1)

Jika kita syaratkan, baris yang dihapus adalah baris yang semuanya berisi nan, tambahkan argumen "how='all'". Sehingga perintahnya menjadi

df.dropna(axis=0, how='all')  # untuk menghapus baris jika semua adalah nan
df.dropna(axis=1, how='all')   # untuk menghapus kolom jika semua isinya adalah nan


Jadi by default, perintah df.dropna() sama dengan df.dropna(axis=0, how='any').
Silakan lihat screencast di bawah ini untuk prakteknya.

By default juga, hasil penghapusan data NaN tidak disimpan (tidak embedded), jadi perlu disimpan dalam variabel baru, misal b = df.dropna(). Jika ingin langsung, gunakan argumen `inplace=True`. Perhatikan screencast di bawah ini untuk lebih jelasnya.



Jika anda lebih suka menggunakan Numpy untuk menghapus data NaN, caranya ada disini: Menghapus dan mengganti data NaN pada Numpy.<

Monday, September 09, 2019

Beberapa shortcut penting Byobu

Saya menggunakan "ssh" untuk mengakses desktop, dimana hampir semua proses komputasi saya lakukan di PC tersebut, bukan di laptop. Keuntungannya, selama saya bisa konek ke jaringan kampus (apato, perpus, dll) saya tetap bisa mengakses desktop, menjalankan simulasi, merubah variabel, dll. Jika berada diluar kampus, saya menggunakan TeamViewer. Untuk memudahkan menggunakan terminal dengan ssh, saya menggunakan perangkat "byobu", sebuah utilitas yang dibuat untuk menjembatani tmux atau screen, perangkat lain untuk memudahkan menggunakan terminal di Linux yang "membisakan" penggunaan terminal dalam beberapa sesi, beberapa jendela, dan menutupnya tanpa harus menghentikan proses yang sedang berjalan (ini penting ketika mengeksekusi perintah di terminal).

Berikut beberapa shortcut penting ketika menggunakan byobu via ssh:

  1. Ctrl A, D : keluar dari ssh tanpa menghentikan proses (=F6)
  2. F2: membuat jendela baru
  3. Alt + Panah Kanan/Kiri: berpindah jendela
  4. Ctrl + F6: keluar dari jendela, split
  5. Fn + F7: enable scroll
  6. Ctrl + C: keluar (dari enable scroll)
  7. Alt + F6: menghentikan ssh dari komputer lain kecuali yang dipakai
  8. F9: menampilkan help (gunakan tab untuk berpindah menu, =Shift+F1)
  9. ketik 'exit': keluar dari sesi

Beberapa shortcut lainnya seperti "Shift+F2" (membagi jendela secara horizontal), "Ctrl + F2" (membagi jendela secara vertikal), tidak saya masukkan karena saya jarang membagi jendela terminal menjadi beberapa bagian (kecuali terpaksa). Jika itu dilakukan, maka untuk berpindah fokus ke jendela samping atau atas/bawah gunakan "Shift+Panah". Selain shortcut di atas saya menggunakan perintah berikut:

byobu-enable: membisakan byobu disetiap koneksi ssh
byobu-disable-prompt: agar prompt lebih singkat (set di bashrc)

Berikut screenshot byobu saya ketika mengetik tulisan ini.


n.b: 
- Byobu tidak terinstall by default pada Ubuntu maupun OS lainnya, untuk menginstall byobu pada turunan debian, gunakan `sudo apt-get install byobu`.

Friday, August 23, 2019

Ketika Laptop Tersiram Air

Seminggu yang lalu laptop saya tersiram air (putih). Awalnya saya menganggap sepele, namun ternyata sangat serius. Efek paling parah: laptop mati total. Efek paling tidak membahayakan: laptop anda bisa berjalan seperti semula. Nah, pertanyaannya: Apa langkah-langkah yang harus segera diambil ketika laptop tersiram air? Berikut tindakan preventif untuk mencegah kerusakan fatal ketika laptop tersiram air.

Daleman laptop saya, MBP 2012, yang tersiram air, masih ada sisa-sisa tetesan air di dalamnya.

1. Segera matikan, cabut kabel power, tahan (hold) power button.
Meski ada air diatas keyboard dan mungkin menghalangi anda untuk mematikan komputer, tetap matikan laptop secara paksa. Cabut kabel charger, tahan tombol power. Semua komputer/laptop bisa dimatikan dengan cara ini.

2. Angin-anginkan dengan posisi terbalik.
Saya mempraktekkan hal tersebut kurang lebih 8 jam sejak laptop saya tersiram air. Letakkan laptop pada posisi "tenda pramuka", dan pasang kipas di bawahnya menghadap ke atas.
Posisi laptop ketika diangin-anginkan, tambahkan kipas angin di bawah laptop tsb (sumber gambar: Wikihow, CC)

3. Buka casing laptop, bersihkan.
Setelah 8 jam saya angin-anginkan, saya coba buka penutup belakang laptop saya. Hasilnya: ada banyak tetesan air di motherboard dan beberapa komponen lainnya. Saya bersihkan sisa-sisa air tersebut, kemudian saya pasang lagi.
Daleman MBP setelah saya lepas motherboard, HDD, CD drive, dll. Tampak: keyboard.

4. Cabut battery, dan komponen-komponen lainnya.
Karena laptop saya memiliki battery di dalam (MBP 2012), untuk mencabut battery saya harus membuka casingnya.

5. Diamkan, angin-anginkan lagi, semakin lama semakin baik.
Ini adalah langkah dimana saya tidak sabar. Ketika selesai saya bersihkan, laptop saya nyalakan. Awalnya saya senang. Kemudian saya matikan, dan tidak bisa nyala lagi! saya coba buka lagi, lepas battery dan nyalakan lagi. Bisa! Namun satu komponen rusak total: Keyboard. Kemungkinan terjadi konslet pada komponen tersebut saat saya menyalakan ulang pertama kalinya sejak tersiram air, karena masih ada sisa-sisa air.  Idealnya, waktu minimum untuk untuk menunggu sebelum kembali menyalakan laptop (menurut saya) adalah 24 jam.

Ini adalah pengalaman saya kesekian kalinya "menyiram" laptop, seingat saya tiga kali. Dan pada ketiganya saya sama-sama harus kehilangan keyboard. Komponen yang relatif lebih murah daripada komponen lainnya. Saya beli keyboard MBP 2012 (model A1278) di AliExpress seharga 350 ribu. Sebelumnya, hal yang sama terjadi pada Lenovo G580 dan e-Machine D725 saya, keduanya harga keyboardnya lebih murah. Pada kasus lain, beberapa komponen seperti battery dan motherboard harus diganti karena tersiram air (konslet).

Untuk langkah lebih lengkap, bisa merujuk ke WikiHow.

Saturday, August 17, 2019

Blogger sebagai media sosial

Saya jenuh dengan media sosial. Setelah Google menutup Google Plusnya, otomatis hanya Twitter media sosial yang banyak saya gunakan. Masalahnya, twitter tidak searchable secara mudah. Padahal banyak yang saya share di media itu saya tujukan untuk saya sendiri. Tentunya kemudahan mencari apa yg saya share, like, dan komen adalah syarat mutlak. Selain Twitter, saya pernah menggunakan Facebook, wordpress dan Tumblr.

Blogger sebagai media sosial

Saya punya ide untuk menggunakan blogger atau blogspot sebagai media sosial saya. Alasannya sederhana, media itulah yang lebih dulu saya kenal dan banyak tulisan saya yang dapat dicari dengan mudah disitu. Setidaknya ada dua manfaat penting dengan menggunakan blog sebagai media sosial. Berikut deskripsi singkatnya.


Membiasakan menulis

Sejak awal tahun ini saya berniat menulis minimal satu artikel di blog saya ini. Nyatanya, bulan saya saya tidak menulis satu artikel pun. Menulis itu memang tidak mudah, tapi juga tidak susah. Perlu membiasakan diri untuk melakukannya. Untuk membiasakan menulis perlu media, dan blog saya pikir merupakan media yang paling efektif. Bandingkan dengan Twitter yang dibatasi 14 karakter atau Facebook yang menakutkan untuk dibilang riya'. Untuk menulispun, bukan "membiasakan menulis", juga tidak mudah. Ada penghalang besar yang harus dirobohkan agar bisa menulis, baca selengkapnya di sini: Merobohkan penghalan dalam "menulis". Orang yang tidak biasa menulis akan terlihat dari tulisannya yang amburadul, susah dibaca dan dimengerti. Sebaliknya, orang yang biasa menulis biasanya tulisannya terstruktur dan mudah difahami.

Sunday, June 30, 2019

Mengecek grammar dan spellchek bahasa inggris file Latex lewat Terminal

Judul tulisan ini panjang, tapi isinya tidak sepanjang judulnya.

Sebagai seorang mahasiswa, saya dituntut untuk mempubikasikan makalah (karya tulis) saya pada sebuah seminar, atau konferensi bahasa kerennya. Publikasi tersebut merupakan syarat wajib. Agar bisa lulus setidaknya saya harus publikasi pada dua konferensi dan dua jurnal, itu harapan (dan mungkin juga syarat) dari profesor saya di sini. Karena level bahasa Inggris saya masih pada tahap belajar, dan terlalu mahal untuk melanggan Grammarly Pro, saya menggunakan tools gratis untuk mengecek grammar tulisan saya. Perkakas tersebut namanya textidote, bisa diunduh di sini.

Perkakas yang dibutuhkan (saya gunakan):
  • Textidote
  • Gedit (dengan embedded terminal)
Berikut tampilan screenshot gedit saya sebelum mengeksekusi textidote pada sebuah fail latex.

Gedit dengan embedded terminal, textidote siap mengeksekusi (check grammar dan spell check) file latex di atasnya.

Instalasi


Thursday, June 20, 2019

Tentang layer TimeDistributed pada Keras...

TimeDistributed merupakan salah satu (wrapper) layer pada keras yang berfungsi untuk membagi weight pada slice temporal pada data 3D. Susah difahami? Perhatikan contoh berikut.

Saya punya data X. Ukurannya (32, 10, 16), seperti contoh pada dokumentasi Keras.

x = np.random.random(size=(32, 10, 16)

Artinya, saya punya 32 data (sample). Setiap sample berisi data (10, 16): 10 baris dan 16 kolom. Ketika saya mengaplikasikan suatu layer (katakanlah, dan paling umum: Dense), agar bobot dari satu layer tersebut merata pada setiap elemen maka perlu kita gunakan timedistributed layer ini.

Perhatikan contoh berikut,
model0 = Sequential()
model0.add(Dense(8, input_shape=(10, 16)))
model0.summary()
Hasilnya adalah sebagai berikut,
---
Model: "sequential_6"
_________________________________________________________________
Layer (type)    Output Shape    Param # 
=================================================================
time_distributed_1 (TimeDist (None, 10, 8)    136 
=================================================================
Total params: 136
Trainable params: 136
Non-trainable params: 0
Bedakan dengan ini,
model1 = Sequential()
model1.add(Dense(8, input_shape=(10, 16)))
model1.summary()
Hasilnya,
---
Model: "sequential_5"
_________________________________________________________________
Layer (type)  Shape  Param # 
=================================================================
dense_3 (Dense)    (None, 10, 8)    136 
=================================================================
Total params: 136
Trainable params: 136
Apa perbedaannya? Tidak ada. Saya juga bingung. Mari kita cari contoh lain, dari machinelearningmastery.
Sebenarnya, jika kita teliti, ada perbedaan bentuk output shape dari kedua contoh diatas, yang pertama memberikan bentuk ouput (TimeDist(None, 8, 10)), sedangkan yang kedua hanya (None, 8, 10).

Wednesday, June 19, 2019

Implementasi Pengenalan Emosi dari Sinyal Wicara Berbasis Deep Learning dengan Keras

Tulisan ini agak panjang, membahas implementasi pengenalan emosi dari sinyal wicara dengan teknik deep learning. Perkakas yang akan kita pakai adalah Keras. Kode python yang dipakai sebenarnya bukan dari saya, namun saya modifikasi dari [1] dan [2]. Baiklah, mari kita mulai.

Ide

Ide dasar penelitian di bidang speech emotion recognition (pengenalan emosi dari sinyal wicara) adalah bahwa sinyal wicara mengandung informasi emosi dari pembicara. Contoh sederhana, suara orang marah akan sangat berbeda dengan suara orang sedih dan senang. Dengan mengenali (pola) suara orang marah, senang, sedih, dll, kita akan bisa mengenali emosi seseorang dari suaranya.  Berikut ilustrasi pengenalan emosi dari penelepon.
Pengenalan emosi penelepon secara otomatis oleh Artificial Intelligence (AI)
Sumber:https://medium.com/@alitech_2017/voice-based-emotion-recognition-framework-for-films-and-tv-programs-2a6abbb77242


Diagram Alir Sistem

Secara umum, sistem pengenalan emosi dari sinyal wicara terdiri dari dua blok utama (selain input dan output):
  1. Ekstraksi Fitur
  2. Klasifikasi
Kode yang kita buat pun juga disimpan dalam dua blok tersebut: save_feature.py dan ser_ravdess.py. Input system adalah speech dataset, dalam hal ini kita pakai dataset RAVDESS [3]. Output yang kita ingin kita capai adalah kategori emosi secara diskrit (01 = neutral, 02 = calm, 03 = happy, 04 = sad, 05 = angry, 06 = fearful, 07 = disgust, 08 = surprised).

Diagram blok pengenalan emosi dari sinyal wicara

Dataset

Friday, May 31, 2019

Keras untuk permasalahan regresi

Pada posting sebelumnya telah didemokan penggunaan Keras sebagai solusi permasalahan klasifikasi. Pada banyak kasus nyata, permasalahan yang dihadapi adalah regresi bukan klasifikasi. Misal, pada prediksi cuaca, prediksi jumlah pengunjung, prediksi temperature, dll, dimana output dari model adalah nilai numerik, bukan kategori diskrit. Deep learning didesain untuk dapat menangani baik permasalahan klasifikasi maupun regresi (juga clustering). Pada posting ini akan didemokan bagaimana Deep Learning bisa menyelesaikan permasalah regresi sederhana.


Problem

Permasalahan yang kita angkat sebagai contoh adalah fungsi matematik sederhana berikut,

$$ f(x) = 2x + 3 $$

Dimana $x$ merupakan input dan $f(x)$ merupakan nilai output. Misal, kita ingin membuat model yang bisa memberikan prediksi nilai $f(x)$ diberikan nilai input $x$ dimana sebelumnya model kita latih dengan range nilai $x$ yang diberikan. Model deep learning ini akan kita implementasikan dengan Keras.

Implementasi
Implementasi deep learning ini akan mengikuti pola yang saya tulis disini: https://bagustris.blogspot.com/2019/04/implementasi-deep-learning-dengan-keras.html

Input-Output data

Input-output data, sesuai persamaan di atas, didefinisikan dalam python numpy sebagai berikut.
import numpy as np
x_train = np.arange(0, 10.01, 0.01)
y_train = 2*x_train + 3             #**2 + 3


Model

Untuk membuat model, kita buat fungsi `build_model`. Model yang kita bangun terdiri dari tiga layer: 2 dense (fully connected) layer dan satu output layer. Input layer akan masuk pada dense layer pertama. Model tersebut bisa kita gambarkan sebagai berikut.

Berikut fungsi `build_model` untuk membangun model seperti gambar di atas.

Friday, April 26, 2019

Menggunakan GridSearchCV untuk optimasi hyperparameter pada Keras

Salah satu permasalahan pada pembangunan (development) model deep learning adalah mencari hyperparameter optimal. Contohnya sebagai berikut:
  1. Berapa ukuran batch_size optimal: 16, 32, 64 atau 128?
  2. Berapa epoch optimal untuk menjalankan model deep learning: 10, 20, 50 atau 100?
  3. Apa optimizer terbaik untuk deep learning model ini: atam, rmsprop, atau adadelta...?
Dan masih banyak hiperparameter lainnya yang bisa dioptimasi: Dropout, jumlah node, jumlah layer, fungsi aktivasi apa yang digunakan, dan lain-lainnya. Habis waktu kita jika digunakan untuk trial-error mencoba mengganti satu-satu parameter tersebut untuk mencari model terbaik. Salah satu solusi dari permasalahan ini adalah dengan menggunakanGridSearch.

Thursday, April 25, 2019

How-to: Install cartopy on Ubuntu 16.04 using pip3

Cartopy is a Python package designed to make drawing maps for data analysis and visualisation as easy as possible.

It is a python package. Hence, the best way to install is by using pip. Here is how on Ubuntu 16.04

Requirements:
$ # install geos
$ sudo apt install libgeos++-dev
$ # install proj
$ sudo apt install libproj-dev

Install cartopy
$ # clone github repo
$ git clone https://github.com/SciTools/cartopy.git
$ # cd ke repo
$ cd cartopy
$ # install from source
$ python3.6 setup.py install --user

In that case, I used Python 3.6 in user environment, not root.

Sunday, April 21, 2019

Start-end silence removal dengan Librosa

Start-end silence removal

Start-end silence removal merupakan teknik untuk menghilangkan suara silence di awal dan akhir utterances (sinyal wicara). Teknik ini dilatarbelakangi bahwa kebanyakan silence berada pada awal dan akhir pembicaraan.

Dengan library librosa, menghilangkan silence pada awal dan akhir kalimat ini cukup mudah sebagai berikut,
import librosa
x, fs = librosa.load('Ses01F_impro01_F000.wav')  # ganti dengan nama file wav kamu
xt, ind = librosa.effects.trim(x, top_db=30)

Untuk melihat hasilnya, kita ceck panjang sinyal atau kita plot (bisa juga didengarkan suaranya dengan library sounddevice.

In [12]: len(x)
Out[12]: 42900

In [15]: len(xt)
Out[15]: 24576

Hasil plotnya adalah sebagai berikut:
figure()
subplot(211); plot(x)
subplot(212); plot(xt)


Perlu dicatat, karena saya menggunakan ipython --pylab, saya tidak perlu menuliskan plt.* untuk mengakses library matplotlib. Selain menghasilkan output `xt`, fungsi librosa.effects.trim yang digunakan untuk menghilangkan silence ini juga memberikan indeks (start, end) dimana sinyal xt diambil.

Perhatikan gambar di atas, yang ditandai dengan elips warna oranye adalah sinyal silence yang ingin kita hilangkan, sedangkan, didalam kotak merah adalah sinyal yang ingin kita ambil. Parameter utama untuk menghilangkan silence ini adalah threshold (dB).

Friday, April 19, 2019

Ekstraksi fitur MFCC dan zero paddingnya dengan library LIBROSA

Mel frequency cepstral coefficient, disingkat MFCC, masih merupakan fitur yang paling banyak digunakan pada pemrosesan sinyal wicara, khususnya pengenalan sinyal wicara. Untuk mengekstrak fitur MFCC, salah satu tool yang paling banyak digunakan adalah librosa. Tulisan berikut merupakan paparan singkat untuk mengekstrak fitur MFCC dari set sinyal wicara dalam sebuah direktori.

Instalasi
pip3 install --user librosa

Workflow
Misalkan dalam direktory saat ini (`./`), kita memiliki 30 file wav sinyal wicara. Dari 30 file tersebut, tiap file akan kita ekstrak 20 MFCC per frame/window (dari default librosa). Karena panjang tiap file berbeda, maka bentuk/ukuran variabel MFCC untuk tiap file tersebut berbeda, misalnya: (20, 44), (20, 193) dan (20, 102).  Karena default window size atau hopsize (n_fft) dari librosa adalah 2048 (25ms) dengan 512 hop length /stride (10 ms overlap), maka untuk file suara dengan durasi 2 detik banyaknya frame mffc yang didapat adalah,

output _length = (seconds) * (sample rate) / (hop_length)
output_length = 2 * 22050/512 = 87 --> (20, 87)

Jika panjang file 3 detik maka panjang output_length adalah,

output_length = 3 * 22050/512 = 130 --> (20, 130)

Variabel lebar window and stride untuk memproses MFCC pada librosa bisa dikontrol dengan argumen n_fft dan hop_length. Misal n_fft = int(sr/40), hop_lenghth=int(sr/100) untuk lebar window 25 ms dan hop length (geser ke kanan) sebesar 10 ms. Perhatikan gambar berikut untuk lebih jelasnya, K adalah lebar window (n_fft) dan Q adalah stride atau hop length (disebut juga hop size). Pada beberapa literatur sinyal sistem, variabel pergeseran antar window memakai nilai % overlap yang pada gambar dibawah disimbolkan dengan 0. Jika default hop_length=512 dan n_fft = 2048, maka overlap defaultnya adalah 75%.

Windowing: window length, hop size, and its overlap.


Jadi, by default MFCC yang dihasilkan oleh librosa berbeda ukurannya bergantung pada ukuran file input. Padahal, agar bisa diproses oleh deep learning, kita inginkan panjang semua variabel MFCC tersebut sama, misal (20, 100). Jika kurang kita zero-paddingkan, jika lebih kita potong sampai 100 sample sehingga menjadi (20, 100). Karena input deeplearning berupa (sample, fitur), bentuk (20, 100) kita transpose menjadi (100, 20). Tujuan akhir kita adalah memperoleh bentuk dari variabel fitur berupa (30, 100, 20) yang siap dimasukkan pada arsitektur deep learning.

Berikut caranya:
import os
import librosa

lenmin = 100

mfcc =[]
for i in os.listdir('.'):
    x_i, sr = librosa.load(i, sr=None)
    mfcc_i = librosa.feature.mfcc(x_i, sr)
    if mfcc_i.shape[1] < lenmin:
        mfcc_i = np.hstack((mfcc_i, np.zeros((mfcc_i.shape[0], lenmin-mfcc_i.shape[1]))))
    mfcc_i = mfcc_i[:,:lenmin]
    mfcc.append(mfcc_i.T)

mfcc = np.array(mfcc)
Cek ukuran variable mfcc dengan:
In [1]: np_mfcc.shape
Out[1]: (30, 100, 20)

Mengekstrak Delta dan Delta-delta MFCC
Pada banyak aplikasi pemrosesan sinyal wicara, tidak hanya MFCC yang dipakai sebagai fitur, namun juga perbedaan antar koefisien MFCC (delta) dan perbedaan antar delta MFCC (delta-delta). Librosa menyediakan fungsi untuk mengekstrak kedua fitur tersebut.

Untuk mengekstrak delta MFCC dari MFCC:
delta = librosa.feature.delta(mfcc)

Untuk mengekstrak delta-delta dari MFCC:
deltad = librosa.feature.delta(MFCC, order=2)

Zero padding dengan Tensorflow 

Ada cara yang lebih singkat untuk zero padding, yakni dengan tensorflow. Dengan tensorflow, kita hanya butuh satu perintah (dan satu baris jika memungkinkan). Contoh jika kita mempunyai list MFCC dengan ukuran seperti [(100, 20), (28, 20), (53,20), ...]. Semua MFCC tersebut kita rubah menjadi ukuran (100, 200) dengan cara berikut.

import tensorflow as tf
mfcc_padded = tf.keras.preprocessing.sequence.pad_sequence(mfcc, maxlen=100, dtype=float)
Dimana mfcc_list merupakan list MFCC yang berbeda-beda ukuran dan hasilnya, mfcc_padded, merupakan list MFCC yang kesemuanya berukuran (100, 20) melalui teknik zero padding.

Tuesday, April 09, 2019

Python: konversi array ND ke 1D

Misal kita memiliki matriks sebagai berikut:

In [4]: x = np.arange(9.).reshape(3, 3)
In [5]: x
Out[5]: array([[0., 1., 2.],
       [3., 4., 5.],
       [6., 7., 8.]])
Apabila kita cari tahu panjang dan bentuk vektor x

In [6]: x.shape                                                                 
Out[6]: (3, 3)
In [179]: len(x)
Out[179]: 3

In [180]: x.size
Out[180]: 9

Artinya, kita memiliki array 3D (N-dimensional atau ND) dengan panjang 3 baris dan total berisi 9 elemen. Kita ingin merubah matrix 3x3 tersebut menjadi matrikx 1x9 (atau 9x1). Berikut caranya:

x.flatten()

Cek panjang vektor x.flatten sebagai berikut:

len(x.flatten())

Update:
2019-04-22: Selain dengan `flatten`, konversi ke 1D dilakukan dengan ravel dan ini cara lebih cepat.

Monday, April 08, 2019

Implementasi Deep Learning dengan Keras: Terminologi dasar

Berikut konsep deep learning dengan Keras dalam 30 detik (6 detik per baris membaca):
model = Sequential()
model.add(Dense(XX, input_dim=Y)
model.add(Dense(Z))
model.compile(loss='nama_loss_function', optimizer='nama_optimizer', metrics=['nama_metrik'])
model.fit(training_input, training_ouput, epochs=AA)

Terminologi penting (tak kenal maka tak paham?!):

Model: Tipe model yang digunakan. Ada dua: sekuensial dan functional API.
Contoh:
model = Sequential()

Dense: Menambahkan unit atau node beserta argumennya, dari satu layer ke layer selanjutnya. Dengan kata lain, "fully-connected layer", atau "feed forward network", atau "multi-layer perceptron".


Contoh:

model.add(Dense(32, input_dim=2)
Kode di atas membuat layer dengan jumlah 32 unit dan 16 unit input. Jumlah learnable parameternya adalah 16*32+32 = 544. Check dengan model.summary(). Jika kita tambahkan lagi,
model.add(32) 
Maka sekarang kita mempunyai dua layer yang masing-masing berisi 32 unit. Total learnabale parameternya adalah 544+ (32*32+32) = 1600. Check dengan kode yang telah diberikan di atas.

Compile: Mengkonfigurasi model untuk melatih data yang diberikan
Contoh:
model.compile(loss='binary_crossentropy',
              optimizer='adam',
              metrics=['accuracy'])
Fit: Mencari hubungan input dan output data, dengan kata lain: membangun/melatih model.
Contoh:
model.fit(train_input, train_output, batch_size=16, epochs=500)

Empat terminologi di atas merupakan step dasar untuk melakukan training data dengan deep learning. Namun masing-masing terminologi memiliki argumen. Agar lengkap, berikut penjelasan singkat argumen-argmunen tersebut.

Thursday, April 04, 2019

Numpy: Menggabungkan dua list menjadi N x 2 vektor

Misalkan kita memiliki dua list sebagai berikut:

kata = ["Bagus!", "Ampuh!", "cantik!", "Mantap!", "Cakep!", 
        "Jelek", "Rusak", "Nol", "Omong kosong", "Busuk", "Tidak"]
label = [1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0]

Kita ingin menggabungkan dua list tersebut sehingga menjadi seperti ini:
array([['Bagus!', '1'],
       ['Ampuh!', '1'],
       ['cantik!', '1'],
       ['Mantap!', '1'],
       ['Cakep!', '1'],
       ['Jelek', '0'],
       ['Rusak', '0'],
       ['Nol', '0'],
       ['Omong kosong', '0'],
       ['Busuk', '0'],
       ['Tidak', '0']])

Maka, kita dapat menggunakan skrip berikut:
kata_label = hstack([np.array(kata, ndmin=2).T, np.array(label, ndmin=2).T])

Friday, March 29, 2019

Word Embedding dan Implementasinya dalam Python (Keras)

Tulisan ini merupakan implementasi dari tulisan sebelumnya, "Vektor dari Kata dan GloVe Embedding". Word embedding merupakan representasi dari kata. Dua teknik yang paling umum dipakai dalam word embedding telah dipaparkan sebelumnya: vektor kata dan GloVe embedding. Tulisan ini adalah implementasi dari teknik tersebut dengan menggunakan bahasa pemrograman Python dan modul Keras.

Misalkan kita punya kumpulan lima kata-kata baik dan enam kata-kata jelek seperti dibawah. Kata-kata baik kita labelkan dengan angka "1" sedangkan kata-kata jelek kita labelkan dengan angka "0".

import numpy as np
kata = ["Bagus!", "Ampuh!", "cantik!", "Mantap!", "Cakep!", 
        "Jelek", "Rusak", "Nol", "Omong kosong", "Busuk", "Tidak"]
label = np.array ([1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0])

Kemudian kata-kata di atas kita rubah menjadi integer
# merubah kata menjadi integer
from keras.preprocessing.text import one_hot
vocab_size = 50
encoded_docs = [one_hot(d, vocab_size) for d in kata]
print(encoded_docs)

Karena panjang maksimal dari elemen kata adalah dua buah (yakni kata "Omong kosong"), kita jadikan kata-kata lainnya memiliki panjang dua buah kata.

Thursday, March 28, 2019

Data yang besar mengalahkan algoritma yang baik

Dalam sebuah workshop yang saya ikuti setahun dua tahun yang lalu di Trieste, seorang pemateri dengan pedenya menyampaikan: "bigger data win over good algorithm", data yang besar mengalahkan algortima yang baik. Saya tercengang. Benarkah...? Selama sekolah, S1~S2, saya diajari dan dituntut untuk menghasilkan algoritma yang baik dari data pengukuran fisis untuk aplikasi kontrol, prediksi, diagnosa dan lain sebagainya. Namun sekarang paradigmanya berubah, bukan bagaimana meng-improve algoritma, tapi mempebesar jumlah data. Tidak sepenuhnya benar memang, namun ini jauh lebih mudah. Akan lebih mudah mengakuisisi lebih banyak data daripada mengimprove/memodifikasi algoritma yang biasanya membutuhkan matematika yang cukup rumit.

Benar adanya, tak semata-mata algoritma/metode yang baik, tapi juga data yang banyak. Gampangannya, orang yang yamg "pintar" tapi jarang belajar dibanding dengan orang yang "rajin" belajar dari banyak data. Pengalaman menunjukkan, tipe orang disebut terakhir lebih banyak berhasilnya daripada tipe orang yang disebut pertama.

Analogi lagi, data vs algoritma: mana yang lebih penting adalah seperti membandingkan mana yang lebih dulu: telur atau ayam. Awalnya saya, mungkin seperti kebanyakan orang juga, berpikiran telur lebih dahulu. Alasannya: telur lebih rigid, lebih statis, dan lebih kecil daripada ayam. Namun hasil penelitian membuktikan bahwa ayam lebih dahulu daripada telur (artinya Tuhan menciptakan ayam dulu, ini lebih masuk akal). Begitu juga dengan data vs algoritma: data-lah akhirnya yang menang, tentunya data yang banyak, big atau bahkan very big.

Jadi tunggu apa lagi? Cari data sebanyak-banyaknya, seakurat mungkin! Mengumpulkan data tidak sesulit membangun algortima. Kalau membangun algortima, kita butuh mikir exktra, menurunkan rumus matematik, dan mengimplementasikannya dalam bahasa pemrograman. Sedangkan untuk mengumpulkan data, kita cuma butuh waktu, keuletan, dan ketekunan. Contohnya untuk data teks, kita perlu sabar dan rajin mengumpulkan kalimat, tokenisasi, mengetik dan sebagaiknya. Untuk data suara, kita perlu merekam, mengedit dan memanipulasi (tambahkan noise, hilangkana noise, dsb). Jauh lebih mudah untuk memperbanyak data daripada memperbaiki algoritma.

Garbage In Garbage Out
Salah satu prinsip yang penting dalam machine learning dan pengenalan pola adalah "data yang baik", berkualitas. Jika data yang kita masukkan adalah sampah, maka hasilnya juga sampah. Maka, selain memperbanyak data, yang harus kita perhatikan adalah kualitas data tersebut. Jangan sampai data yang kita latih, misal dengan deep learning, merupakan data sampah, sehingga hasilnya juga sampah. Disinilah pentingnya preprocessing.

Berapa data yang "besar" itu?

Pertanyaanya selanjutnya, jika data yang besar mengalahkan algoritma yang baik, seberapa besar data yang besar itu? Ian Goodfellow et al. dalam bukunya "Deep learning" berargumen sebagai berikut,
As of 2016, a rough rule of thumb is that a supervised deep learning algorithm will generally achieve acceptable performance with around 5,000 labeled examples per category, and will match or exceed human performance when trained with a dataset containing at least 10 million labeled examples. Working successfully with datasets smaller than this is an important research area, focusing in particular on how we can take advantage of large quantities of unlabeled examples, with unsupervised or semi-supervised learning.
 Jadi, 5000 data yang terlabeli dengan benar merupakan data minimal dari sisi best practice. Tenju saja, semakin besar semakin baik.

Referensi:
  1. Alon Halevy, P. Norvig, F. Pereira, "The Unreasonable Effectiveness of Data". Available online:https://static.googleusercontent.com/media/research.google.com/ja//pubs/archive/35179.pdf
  2. https://www.datasciencecentral.com/profiles/blogs/data-or-algorithms-which-is-more-important

Tuesday, March 26, 2019

Vektor dari kata dan GloVe embedding

Mengolah kata pada pemrosesan bahasa alami (NLP, Natural Language Processing) dari suatu text mensyaratkan untuk mengubah kata tersebut menjadi nilai numerik karena komputer hanya bisa memproses angka. Permasalahannya: bagaimana merepresentasikan kata ke suatu nilai numerik? Disini dua pendekatan akan dibahas: vektor dari kata (word2vector, atau word2vec) dan GloVe embedding.
Vektor kata: Raja, ratu, pria, wantia

Vektor dari Kata
Apa itu vektor dari kata, atau singkatnya 'vektor kata'? Sederhananya: a vector of weights. Tugas dari vektor dari kata adalah untuk mencari representasi (numerik) dari kata-kata yang dicari. Contoh sederhana adalah sebagai berikut.
Sebuah data terdiri dari kata-kata:
data = {raja, ratu, pria, wanita, anak-anak}
maka kata "raja" dapat kita tuliskan:
raja = {1, 0,  0, 0, 0}
ratu = {0, 1, 0, 0, 0}
pria = {0, 0, 1, 0, 0}
wanita = {0, 0, 0, 1, 0}
anak-anak={0, 0, 0, 0, 1}

Teknik diatas disebut dengan one-hot encoding.

Friday, March 15, 2019

Atensi, hubungannya dengan cocktail party problem dan deep learning

Beberapa hari ini saya kembali membaca beberapa paper tentang fenomena "cocktail party", tema penelitian saya saat S1 dan S2. Dulu, bahkan sampai minggu lalu, saya hanya membaca banyak paper dari aspek statitsik, algoritma, dan aplikasinya. Padahal teknik tersebut (ICA/BSS) diusulkan untuk meniru cara kerja otak manusia. Karena sedang mengambil kuliah tentang "perceptual", sekarang saya sedang membaca beberapa paper tentang bagaimana otak memproses fenomea "cocktail party". Kali ini, semua yang saya baca adalah tentang persepsi, kognisi dan proses biologi, bukan rekayasa matematika atau deep learning, tapi tentang jaringan saraf sebenarnya.

Atensi

Apakah atensi itu? Atensi merupakan proses kognitif dan perilaku untuk memilih informasi tertentu dan mengabaikan informasi lainnya. Studi tentang atensi ini mulai berkembang ketika Cherry pada tahun 1953 mempublikasikan papernya tentang eksperimen "shadowing task": dimana responden diperdengarkan dua pesan melalui headphone secara dichotic (satu pesan untuk tiap kanal, kanan dan kiri). Pesan terserbut merupakan pesan utama (attended) dan sampingan (non-attended). Cherry menemukan bahwa sangat kecil sekali reponden memperhatikan pesan sampingan, misalnya apakah pesan itu diucapkan oleh laki-laki/wanita, bahasa apa yang digunakan, dll. Eksperimen Cherry ini membuka jalan lahirnya teori tentang atensi dan beberapa modelnya.

Gambar 1. Model atensi Broadbent dan Treisman

Wednesday, March 06, 2019

Mencoba Kaldi di Ubuntu 18.04, cuda9.0

Ini adalah catatan saya saat mencoba Kaldi (speech recognition toolkit) pada Ubuntu 18.04. Spesifikasi PC yang saya gunakan adalah CPU i9-7900X dan GPU GTX 1060. Hasil percobaan ini membuahkan satu paper yang saya submit pada ASJ spring meeting 2019.

Instalasi

Instalasi kaldi adalah proses pertama, dan bisa jadi, tersulit. Jika anda "SUCCESS" menginstall Kaldi, proses selanjutnya akan mudah. Jika tidak, akan terhenti. Berikut adalah dasar alur kerja setelah meng-clone Kaldi.

Pertama clone Kaldi ke direktori PC kita.

Monday, February 04, 2019

Phase Unwrapping

Samakah hasil perhitungan: $ \cos (420^\circ)$ dengan $\cos (420^\circ-2\pi)$? Ide inilah yang (menurut saya) melatarbelakangi teknik phase unwrapping pada analisa sinyal.

Phase unwrapping adalah metode untuk "membuka" fase sinyal. Algoritma metode untuk unwrapping fase ini adalah sebagai berikut: "Jika selisih antara dua skalar fase dalam array lebih dari dikont, yakni $\pi$ (3.14, dalam radian), maka nilai skalar yang lebih tinggi tadi dikurangi $2 \pi$. Nilai diskont ini bisa dirubah, namun defaultnya adalah $\pi$.

Perhatikan contoh berikut. Vektor $x$ adalah array yang berisi fase dari suatu sinyal.

$$ px = [0~ 1~ 3.24~ 5~ 6.28~ 10~ 13~ 16]$$

Jika selisih antara $x[n]$ dengan $x[n+1]$ lebih besar dari $\pi$ maka dilakukan unwrapping fase. Sehingga untuk vektor fase $x$ diatas hasilnya adalah,

$$ px2 = [0.0~        1.0~        2.0~        3.24~      5.0~     
       6.28~      3.72~  6.72~ 9.72] $$

Vektor $px2$ merupakan hasil phase unwrapping dalam radian agar tracking fase terlihat lebih halus. Lihar gambar di bawah ini untuk hasil plot fase (atas) dengan unwrapping fase (bawah).

Plot fase (atas) dengan unwrapping fase (bawah)

Friday, February 01, 2019

Zero Padding dan efeknya pada FFT

Zero padding berarti menambahkan nol diakhir sinyal. Misal kita memiliki vektor x sebagai berikut,

$$ x = [0 ~1~ 2 ~3 ~1~ 2~ 3~ 2~ 4~ 3] $$

Vektor tersebut memiliki ukuran 10 data. Zero padding adalah menambahkan nol di belakang vektor tersebut, misalnya kita tambahkan lima nol di belakang data terakhir sehingga menjadi,

$$x = [0 ~1~ 2~ 3~ 1~ 2~ 3~ 2~ 4~ 3~ 0~ 0~ 0~ 0~ 0]$$

Zero padding banyak dipakai untuk menyamakan ukuran vektor/matriks. Pada machine learning/deep learning, ukuran input harus sama, dan zero padding dilakukan untuk tujuan tersebut (menyamakan ukuran input). Pada analisa sinyal di domain frekuensi, zero padding ini biasanya digunakan agar spektrum yang kita plot menjadi lebih halus.

Implementasi dengan Python

Implementasi zero padding dengan python bisa bermacam-macam, salah satunya dengan np.pad (salah lainnya dengan menggunakan np.zeros).

Contohnya adalah sebagai berikut:

>>> x = np.array([1, 2, 3, 4, 5])
>>> xpad = np.pad(x, (0, 5), 'constant')  # menambahkan lima nol di belakang vektor a
>>> x
    [1, 2, 3, 4 , 5, 0, 0, 0, 0, 0]

Friday, January 18, 2019

Merobohkan penghalang dalam "menulis"

Sebetulnya saya ingin membaca sebuah buku "How to Write a lot: A practical guide to productive academic writing", tapi setelah saya cari cari-cari di perpus tidak ketemu (padahal saya cek di web ada: "borrowable" dan "in place"). Saya baca versi ebooknya, tidak puas. Dari googling, saya menemukan seseorang sudah meresumenya. Berikut adalah terjemahan bebas saya atas resume tersebut.
  1. Penghalang #1: "Saya tidak punya waktu untuk menulis"
  2. Solusi: Alokasikan waktu menulis, sediakan dan jadwalkan waktu tersebut.
  3. Penghalang #2: "Saya butuh membaca lebih banyak, menganalisa tulisan orang lain, dll untuk menulis"
  4. Solusi: Lakukan sekarang juga dan tulislah hasil bacaanmu dan analisamu, langsung setelah itu.
  5. Penghalang #3: "(Kayaknya) Saya butuh laptop baru ..."
  6. Solusi: Tidak, kamu tidak butuh laptop baru. Tulisan ini ditulis dengan laptop produksi 6 tahun yang lalu.
  7. Penghalang #4: "Saya tidak punya inspirasi untuk menulis"
  8. Solusi: Kamu tidak perlu menunggu inspirasi datang, cukup duduk, tulis. Gerakkan tanganmu di atas tuts keyboard, tulis.
  9. Penghalang #5: "Saya tidak punya motivasi (untuk menulis)"
  10. Solusi:


    A post shared by Bagus Tris Atmaja (@bagustris) on
That's all! Penghalang ke #5 di atas bukan dari buku, tapi dari saya sendiri. Selamat menulis!

Wednesday, January 16, 2019

Ketidaklinearan sistem pendengaran [6]

Catatan kuliah "Human perceptual model and its system", pertemuan ke-6.

Telinga manusia merupakan sistem yang tidak linear. Apa buktinya? Fakta berikut merupakan beberapa bukti ketidaklinearan sistem pendengaran manusia. Meskipun ada beberapa bukti kelinearan pada fenomena berikut (misalnya emisi spontan pada otoakustik), dengan menggunakan sifat ketidaklinearan fenomena tersebut justru menjadikannya masuk akal.

Respon basilar membrane (pemilihan frekuensi)

Pemilihan frekuensi: Kemampuan telinga untuk memisahkan komponen frekuensi dari suara kompleks. Basilar membrane hanya bergetar pada tempat/lokasi dimana frekuensinya sama (resonansi). Seperti diketahui sebelumnya, respon frekuensi pada basilar membrane berjalan dari frekuensi tinggi (base) menuju frekuensi rendah (apex). Response basilar membrane merupakan filter dimana fitter tersebut gabungan dari banyak bandpass filter. Karenanya filter auditori ini disebut filterbank.

Respone basilar membrane ini tidak liner. Dilihat dari skala yang digunakan (Bark dan ERB), keduanya menggunakan spasi logaritmik. Meski model auditory seperti gammatone masih menggunakan filter linear, namun model yang lain seperti double-resonance nonlinear (DRNL) menggunakan konsep nonlinear yang memberikan hasil yang lebih bagus daripada filter linear.

Contoh skala bark yang diturunkan dari konsep critical band (Zwicker model) seperti terlihat pada gambar di bawah. Perlu diingat bahwa skala yang lain, yakni ERB-rate, lebih banyak dipakai karena hasilnya cocok baik dari eksperimen psikoakustik maupun psikologi.
Auditori filter dalam frekuensi Bark

Wednesday, January 09, 2019

Fisiologi dari peripheral auditori dan pemodelannya [5]

Catatan kuliah human perceptual system and its model, pertemuan kelima, kelanjutan kuliah sebelumnya.

Sistem auditori merupakan sistem pemrosesan aktif, otak  turut andil dalam memproses gelombang mekanik suara menjadi sinyal nerve. Otak bisa menambah dan mengurangi gain dalam sistem auditori.

Mekanika kontrol otak ke sistem pendengaran tersebut juga meliputi  kemampuan otak untuk mengendalikan hair cell, artinya sistem efferent (dari otak ke peripheral) bisa mengontrol ketidak-linearan sistem pendengaran.

Lagi, bagian-bagian telinga dapat dipecah sebagai berikut:
Anatomi manusia (dimodifikasi dari Wikipedia)
Related Posts Plugin for WordPress, Blogger...