Category Archives: Science

วิทยาศาสตร์

Neural Network ไม่ควรใช้ Sigmoid Function ฤ

ไปเจอคลิป จากช่องที่น่าจะขึ้นชื่อด้าน AI บอกว่าไม่ควรใช้ Sigmoid function เป็น Activation function

ปะไว้ก่อน ในคลิปมีลิงก์ให้อ่านเพียบ (กำลังกระตุ้นตัวเองให้ทำอะไรบางอย่างต่อ) แต่ Sigmoid function ก็มีใช้ใน Logistic Regression (pdf อธิบายภาษาไทยได้เห็นภาพดี) อยู่เนอะ

ผลิตเชื้อเพลิงเหลว จากใบไม้เทียมชีวภาพ

ถ้าใช้จุลินทรีย์มาช่วยผลิตไฟฟ้า ก็มีทั้ง microbial fuel cell (MFC) หรือการผลิตเชื้อเพลิงในรูปของก๊าซ ก็มีบ่อหมักก๊าซชีวภาพ (biogas) อยู่แล้ว แต่ผลงานจาก Harvard ชิ้นนี้ผลิตได้เชื้อเพลิง isopropanol ซึ่งเป็นของเหลว ก็น่าจะบรรจุลงถังหรือพกพากันได้ง่ายๆ กว่าก๊าซหรือรอการชาร์จแบต และผลงานเป็นการดูดซับคาร์บอนไดออกไซด์ด้วย เลยเรียกมันว่า “ใบไม้ชีวภาพ” (bionic leaf 2.0) ทำเทียมจากแบคทีเรีย

ใช้แบคทีเรีย Raistonia eutropha ที่มีความสามารถในการตรึงคาร์บอนไดออกไซด์เมื่ออยู่ในภาวะบางอย่าง เช่นมีก๊าซไฮโดรเจนอยู่ด้วย แต่ในการผลิตไฮโดรเจนนั้น เดิมใช้ตัวเร่งปฏิกิริยาคือ nickel-molybdenum-zinc alloy ก็เจอผลข้างเคียงว่าจะได้สารจำพวก reactive oxygen species (ROS) ซึ่งเป็นอันตรายกับ DNA ของแบคทีเรีย ผลงานนี้จึงใช้ cobalt-phosphorous alloy เพื่อเลี่ยงปัญหา

อันที่จริง ถ้าใช้พวกสาหร่ายผลิตน้ำมันก็น่าจะผลิตเชื้อเพลิงเหลวได้ออกมาเหมือนๆ กัน แต่ผลงานนี้บอกว่าเมื่อใช้ร่วมกับระบบ photovoltaic ผลิตไฟฟ้าแล้ว (เอาไฟฟ้าจากแสงอาทิตย์ ไปแยกน้้ำให้ได้ไฮโดรเจนแล้วส่งให้แบคทีเรีย) ได้ประสิทธิภาพรวมราว 10% สูงกว่าการสังเคราะห์แสงตามธรรมชาติ

คลิปจาก Harvard ว่าได้ทำอะไรบ้าง เห็นผลงานจริงๆ ที่สร้างขึ้นมา

แต่ผมว่าคลิปเก่า ที่เกี่ยวกับงานนี้ จากผู้สื่อข่าว ทำให้เห็นภาพหลักการทำงานมากกว่า

ที่มา http://news.harvard.edu/gazette/story/2016/06/bionic-leaf-turns-sunlight-into-liquid-fuel/
http://science.sciencemag.org/content/352/6290/1210
รหัสวัตถุดิจิทัล DOI: 10.1126/science.aaf5039

ปล. ของ Berkeley http://www.sciguru.org/newsitem/13834/soil-microbe-super-efficient-biofuel-factory-scientists-explores-way-create-biofuels-minus-photosy

ปล. ขยายความเล็กน้อย งานนี้เป็นการจัดสภาพแวดล้อมให้แบคทีเรียดำรงชีพแบบ Lithoautotrophic โดย litho หมายถึง “หิน” คือได้ electron จากสารอนินทรีย์ ในกรณีนี้ สารอนินทรีย์คือไฮโดรเจน (H2 -> 2H + 2e-) ส่วนคำว่า auto หมายถึงได้แหล่งคาร์บอนมาจากการดูดคาร์บอนไดออกไซด์ได้เอง ไม่ต้องมาจากสารอินทรีย์ แบคทีเรียจึงได้รับ H2 และ CO2 มาผลิตเชื้อเพลิงให้เรา

https://en.wikipedia.org/wiki/Primary_nutritional_groups#Energy_and_carbon
[pdf] https://www.uni-due.de/imperia/md/content/water-science/4511_14___ws0809_sergej__nikolaevitch_winogradsky.pdf

แก้ Euler Project 551

ไปเจอปัญหาจาก Euler Project ข้อ 551 สรุปได้ว่า กำหนดลำดับ a(0), a(1), a(2), … โดย

a(n) = d(a(n-1)) + d(a(n-2)) + d(a(n-3)) + .. + d(a(1)) + d(a(0))

โดย a(0)=1 และ d(n) คือการเอาตัวเลขโดดของทุกหลักของเลข n มาบวกกัน (sum of digits) โจทย์ให้หาค่าของ a(1015)

ดูดีๆ จะเห็นว่า a(n) = d(a(n-1)) + a(n-1) ด้วยเช่นกัน ถ้าจะแก้แบบ recursive งานนี้ถ้าจะแก้กันง่ายๆ ตรงไปตรงมา เขียนด้วยภาษาสคริป Python ได้ว่า

def d(n):
    r = 0
    while n:
        r += n % 10
        n //= 10
    return r   

a=1
for i in xrange(1, 10**6):
    a+=d(a)

ซึ่งคำนวณถึงแค่ a(106) ก็ได้ค่า 31054319 ตรงกับที่ตัวอย่างให้มา ถ้าจะเอาให้ถึงตามโจทย์ สงสัยต้องหาทางแก้ non-homogeneous linear recurrence relation ให้ได้ก่อนครับ ก็อาจจะได้สมการที่มียกกำลัง n ออกมา หรืออาจต้องหาทางว่า มีความสัมพันธ์ที่จะย่อย n ให้ลงไปเป็เท่าๆ ตัว เช่น a(2n) = … ที่มี a(n..)

ปล. มีคนแจก source code วิธีแก้ในภาษา Python แล้วครับ ผมรันดูแล้วเสร็จในแป็ปเดียว https://git.icpc-camp.org/ftiasch/acm-icpc/blob/6d1d563a1dea39b8a8f525c836c5f3b0a243678b/project-euler/p551/p551.py

แก้ Euler Project 501

มีปัญหา Euler Project หมายเลข 501 ให้หาจำนวนตั้งแต่ 1 ถึง 1012 ว่ามีกี่ตัว ที่จำนวนตัวหารซึ่งหารแล้วลงตัวของมันนั้น มีเท่ากับ 8 ตัว

ถ้าใช้วิธีวนลูปตรงๆ คืิอไล่เลข 1 ถึง 1012 ที่ละตัว เอามาหารด้วยเลข 1 จนถึงตัวมันเอง แล้วนับว่ามีหารลงตัวแปดตัวหรือไม่ ช้าแน่ ต้องหาวิธีอื่น โดยใช้หลักคณิตศาตร์มาช่วย คือเมื่อเอาตัวเลขมาแยกตัวประกอบ ให้กลายเป็นผลคูณของจำนวนเฉพาะ ถ้าจำนวนเฉพาะมีซ้ำกันให้เขียนเป็นเลขยกกำลัง จำนวนของตัวหารที่ลงตัว เท่ากับเอาเลขชี้กำลังของแต่ละจำนวนเฉพาะนั้น มาบวกเพิ่มอีกหนึ่งแล้วคูณกัน

เช่น 24 = 2331 เลขชี้กำลังมี 3 และ 1 เอามาบวกเพิ่มอีก 1 จะได้ 4 และ 2 เมื่อคูณกันได้ 8 คือมีจำนวนตัวหารเท่ากับ 8 ตัว (24 นี้มี 1, 2, 3, 4, 6, 8, 12, 24) โดยเลข 8 สามารถได้มาจากการคูณ 8×1, 4×2, 2×4, 2x2x2 ถ้าเราจะไล่หาจำนวนที่มีตัวหารลงตัวแปดตัวโดยทำย้อนไป โดยเอาจำนวนเฉพาะมายกกำลังและคุณกัน โดยเลขชี้กำลังต้องเข้ากับเงื่อนไขที่จะทำให้มีตัวหารลงตัวแปดตัว ก็จะมีได้สี่กรณี

p7
p3q1
p1q3
p1q1r1

โดย 1 < p < q < r และทั้งสามเป็นจำนวนเฉพาะ

ลอง coding คร่าวๆ

##

import itertools
import math

def is_prime(num):
    if num < 2:
        return False
    for x in range(2, int(math.sqrt(num))+1):
        if num % x == 0:
            return False
    else:
        return True

def fd0(p, lmbd):
    r=0
    for x in (itertools.combinations(p, lmbd.__code__.co_argcount)):
        if lmbd(*x):
            r+=1
    return r
    
nn=100
lp=list(filter(is_prime, range(1, nn+1)))
a=fd0(lp, lambda x: x**7 <= nn)
b=fd0(lp, lambda x, y: x**3 *y <= nn)
c=fd0(lp, lambda x, y: y**3 *x <= nn)
d=fd0(lp, lambda x, y, z: x*y*z <= nn)
t1=a+b+c+d

nn=1000
lp=list(filter(is_prime, range(1, nn+1)))
a=fd0(lp, lambda x: x**7 <= nn)
b=fd0(lp, lambda x, y: x**3 *y <= nn)
c=fd0(lp, lambda x, y: y**3 *x <= nn)
d=fd0(lp, lambda x, y, z: x*y*z <= nn)
t2=a+b+c+d


##

แต่ถ้าทำถึงเลข 1012 ยังช้าอยู่นะครับ ต้องหาทางออกจากวนลูปเอง เมื่อการคูณเกินจำนวนที่กำหนดไว้

##
def is_prime(num):
    if num < 2:
        return False
    x=2
    while x*x<=num:
        if num % x == 0:
            return False
        x+=1
    return True

nn=10**6
lp=list(filter(is_prime, range(1, nn//6 +2)))
lp.sort()

r=0
for i in range(len(lp)):
    if lp[i]**7 > nn:
        break
    else:
        r+=1

for i in range(len(lp)):
    for j in range(i+1, len(lp)):
        if lp[i]**3 *lp[j] > nn:
            break
        else:
            r+=1

for i in range(len(lp)):
    for j in range(i+1, len(lp)):
        if lp[j]**3 *lp[i] > nn:
            break
        else:
            r+=1

for i in range(len(lp)):
    for j in range(i+1, len(lp)):
        if lp[i]*lp[j] > nn:
            break
        for k in range(j+1, len(lp)):
            if lp[i]*lp[j]*lp[k] > nn:
                break
            else:
                r+=1
          
print(r)
##

ชมงาน Bangkok Mini Maker Faire 2015

ไปงาน Bangkok Mini Maker Faire 2015 ที่ลานหน้า Hard Rock Cafe Siam Square ก็เก็บภาพ ทวีตมาฝาก เริ่มเลยครับ ไล่ดูเลย

ระนาด มีกลไกทำจากชิ้นส่วน hard disk เก่า บอร์ดที่ใช้ขับ รองรับ MIDI ด้วย

ชุดละครเวที

แซคโซโฟนไม้ไผ่

View this post on Instagram

Bamboo Soprano Saxophone from Thailand #bkkminimakerfaire

A post shared by ohmohm (@ultimateohm) on

รองเท้าส้นสูง

แนว steampunk ย้อนยุคหน่อยๆ

BB-8 ก็มา

อาหารแมว

เครื่องพิมพ์สามมิติ สำหรับอาหาร

 

Phenotype

โครโมโซมเพศ XY ก็อาจมีโรคทางพันธุกรรมหรือการกลายพันธุ์ที่ทำเกิดมามี phenotype เป็นหญิงก็ได้ เช่น Androgen insensitivity syndrome หรือกลับกัน XX เกิดเป็นชายก็ได้

ธาตุในภาษารัสเซีย

เรียนเคมี มีการท่องชื่อธาตุในลำดับตารางธาตุ แล้วถ้าเป็นศัพท์ภาษารัสเซียแล้ว 20 ตัวแรก ดังนี้
1. H Водоро́д (ถ้า Изотопы ก็มี Дейте́рий และ Три́тий อย่าสับสนกับ третий ซึ่งแปลว่า 3-й ส่วน Вода́ แปลว่าน้ำ)
2. He Ге́лий
3. Li Ли́тий
4. Be Бери́ллий
5. B Бор
6. C Углеро́д (у́голь แปลว่าถ่าน)
7. N Азо́т
8. O Кислоро́д (кислота́ แปลว่ากรด ки́слый แปลว่าเปรี้ยว)
9. F Фтор
10. Ne Нео́н
11. Na На́трий
12. Mg Ма́гний
13. Al Алюми́ний
14. Si Кре́мний
15. P Фо́сфор
16. S Се́ра
17. Cl Хлор
18. Ar Арго́н
19. K Ка́лий
20. Ca Ка́льций

แทนที่จะต้องเจาะเลือดกันบ่อยๆ ก็ฝังชิปเพื่อตรวจเลือดซะเลย

กลุ่มนักวิทยาศาสตร์ที่ EPFL (Ecole Polytechnique Federale de Lausanne) กำลังพัฒนาอุปกรณ์ตรวจเลือดขนาดจิ๋วที่สามารถฝังเข้าไปใต้ผิวหนัง เหมาะมากสำหรับเอาไปใช้งานเพื่อทดแทนการที่ต้องมาเจาะเลือดกันบ่อยๆ โดยตัวอุปกรณ์จะได้รับพลังงานแบบไร้สายผ่านทางคลื่นแม่เหล็กไฟฟ้าจากอุปกรณ์ที่ใช้คู่กับมัน และตรวจสิ่งต่างๆ ที่อยู่ในเลือด เช่นโปรตีน หรือเอนไซม์ (ซึ่งก็ถือว่าเป็นโปรตีนชนิดหนึ่ง) แล้วสามารถส่งผลการตรวจเลือดออกมาทางคลื่นวิทยุได้

นี้ก็อาจเป็นประโยชน์ของไมโครคอนโทรลเลอร์จิ๋วอย่างหนึ่งก็ได้นะครับ สำหรับการตรวจเลือดเข้าใจว่าใช้อุปกรณ์สารกึ่งตัวนำที่เปลี่ยนแปลงคุณสมบัติเมื่อสัมผัสกับโปรตีนหรือสารจากสิ่งมีชีวิต (pdf 1, 2, 3, 4)

ที่มา EPFL ผ่านทาง @DigiLife

ehoeks-zopfli-png ใช้ Zopfli บีบไฟล์ภาพ png ให้เล็กลง

ไปเจอโปรแกรม ehoeks-zopfli-png ซึ่งจะช่วยบีบย่อไฟล์ png ให้มีขนาดลง ด้วยอัลกอริทึม Zopfli แล้วยังดูภาพแบบ png ได้อยู่ เพราะวิธีคลายการบีบย่อข้อมูลเหมือนเดิม มีแจกโค้ดด้วยครับ ก็มาลองกันเลย พิมพ์คำสั่ง

git clone https://code.google.com/r/ehoeks-zopfli-png/
cd ehoeks-zopfli-png/

ผมใช้ Fedora 18 มีต้องแก้โค้ดนิดหน่อยจึงจะ make ได้ เหมือนจะมีปัญหากับ zlib คือที่ไฟล์ png_optimizer.c ต้องเพิ่มบรรทัด #include “zlib.h” เข้าไปเพราะตอนแรกมันไปหาค่าคงที่ต่างๆ ที่ชื่อขึ้นต้นด้วย Z_ ไม่เจอ และ makefile ก็เพิ่ม -lz เข้าไปในการทำ make: จากนั้นจึง

make

ก็จะได้ไฟล์โปรแกรม zopfli ไว้ใช้งาน ซึ่งสิ่งที่เพิ่มเติมจาก zopfli แบบดั้งเดิม คือเพิ่ม option –png ให้ดึงภาพจากไฟล์ png แล้วบีบใหม่ด้วยอัลกอริทึม Zopfli แล้วบันทึกเป็นไฟล์ภาพ png จากนั้นทดลองบีบภาพเลยครับ ขอใช้รูปของท่านผู้นี้ครับ Nicola Tesla โดยได้ภาพแบบ public domain มาจาก Wikimedia

ภาพต้นฉบับ Tesla3.png ขนาด 162,248 ไบต์

เมื่อสั่ง ./zopfli –png Tesla3.png บีบได้ไฟล์เป็น png ขนาด 131,629 ไบต์ ไม่ได้จับเวลาว่านานขนาดไหนครับแต่รอไม่นาน จะได้ไฟล์ Tesla3.png.png ผมเปลี่ยนชื่อเป็น Tesla3.zopfli.png จะได้ไม่โดนทับในการทดลองต่อไป

เมื่อสั่ง ./zopfli –png –i1000 Tesla3.png เพื่อคำนวณมากขึ้นจะได้บีบไฟล์ให้เล็กลงมากขึ้นไปอีก ก็ได้ขนาดเป็น 131,584 ไบต์ครับ ประหยัดพื้นที่ได้อีกเล็กน้อย โดยใช้เวลาเกือบ 6 นาที

ภาพขณะกำลังทำการทดลองครับ
testing-ehoeks-zopfli-png

ปล. Zopfli มี zopflipng รองรับไฟล์ PNG แล้วครับ

ใช้ Zopfli แบบขนานด้วย Pigz

ต่อจาก Zopfli คราวที่แล้ว มันค่อนข้างจะใช้เวลานานมาก และเมื่อไล่โค้ด deflat.c บรรทัดที่ 688 ดูเหมือนว่ามันเป็น loop ที่ไม่ได้เอาข้อมูลจาก loop รอบที่แล้วมาใช้ จึงน่าจะทำการประมวลผลแบบขนานให้ทำ ZopfliDeflatePart() ของหลายๆ block ไปพร้อมๆ กันได้

แต่ก็ไปอ่านเจอว่า โปรแกรม pigz เวอร์ชันล่าสุด 2.3 ได้ผนวก Zopfli มาให้แล้ว โดย pigz เป็นโปรแกรม gzip แบบที่จะแบ่งงานเป็นส่วนๆ ไปให้ตัวประมวลผลที่มีอยู่หลายคอร์หรือหลายเท็รด ช่วยกันทำงานขนานกัน จะได้เสร็จเร็วๆ เลย yum install ดู พบว่ายังไม่ใช่เวอร์ชัน 2.3 จึงต้องเอา source code มา make เอง ตอนที่ make ต้องใส่ -lm เข้าไปในไฟล์ Makefile ด้วยครับ เพราะมันไม่เห็นฟังก์ชันคณิตศาสตร์ log() เมื่อ make เสร็จก็บีบไฟล์ enwik8 เหมือนเดิม โดยใช้ออฟชัน -11 ให้ pigz ใช้อัลกอริทึมบีบย่อ Zopfli

zopfli-pigz-compressing-enwik8

พบว่า ขนาดไฟล์เล็กกว่า zip แต่ก็ใหญ่กว่า Zopfli แบบที่ลูป -i1000 แต่ก็ใช้เวลาบีบน้อยกว่า ผมไม่แน่ใจว่า pigz มันใช้ Zopfli แบบลูปนานแค่ไหน

แล้วก็มีคนพบว่า Zopfli ยังบีบไม่สุด คือใช้โปรแกรม DeflOpt หรือ Defluff ซึ่งสามารถบีบไฟล์ที่เป็น gzip เพิ่มได้ โดยมันจะคำนวณ huffman code ในไฟล์ใหม่ ให้ได้ไฟล์เล็กสุดๆ มันยังบีบได้อีก เดาว่าเดี๋ยว Zopfli น่าจะมีเวอร์ชั่นใหม่ๆ มาล่ะครับ