NetChain กับ NetGraph

เวลาสร้าง neural network ใน Mathematica นั้นมันจะมีสองคำสั่งที่ใช้กันหลักๆก็คือ NetChain กับ NetGraph แต่สองคำสั่งนี้จะต่างกันตรงที่ NetChain มันจะเรียงแต่ล่ะ layer ต่อๆกันเป็น linear เลยในขณะที่ NetGraph เนี้ยมันจะยืดหยุ่นมากกว่าโดยที่เราสามารถที่จะบอกได้ว่าแต่ล่ะ layer เนี้ยต่อกันยังไง เช่น    

แสดง output จาก ggplot ใน Mathematica

ลองดูตัวอย่างที่ผมเขียนนี้ครับ  ไอเดียก็คือว่าให้มันเขียนภาพเป็นไฟล์ pdf ด้วยคำสั่ง ggsave แล้วเรียกกลับมาใน Mathematica ด้วย Import  โค้ดที่เขียนนี้ดัดแปลงมาจาก https://mathematica.stackexchange.com/questions/16726/how-to-get-a-plot-generated-by-r-returned-in-an-output-cell      

RDotNet 1.7 ใช้งานได้กับ R.3.3-4 เท่านั้น

ผมเขียนโปรแกรมเล็กๆที่เรียกใช้งาน RDotNet ไว้หลายตัว ซึ่งมันก็ทำให้สะดวกมากๆในการที่จะเรียก R มาใช้งานใน C# ซึ่งก่อนหน้านี้จะใช้งานกับ R ที่ค่อนข้างเก่าหน่อยพวก R 3.3-4 แต่พอมี library บางตัวที่บังคับให้ต้อง upgrade ตัว R ไป version ที่สูงขึ้นอย่าง 3.5 นี้ทำให้โปรแกรมที่เขียนหลายตัวมันมีปัญหาทันที เหตุผลก็เพราะมัน GetInstance() ไม่ได้ มีการพูดถึงปัญหานี้ที่ https://github.com/jmp75/rdotnet/issues/70 ตอนนี้ที่ทำได้ก็คือถ้า library ที่อยากใช้นั้นถ้าไม่ได้ใช้ features ที่มันมีมาใหม่นั้นจริงๆก็ต้องใช้ R ตัวเก่าไปก่อน  

วาดกราฟ exponential sums

พอดีว่าไปเห็นกราฟที่วาดจาก Exponential sums จากเวบ https://www.maths.unsw.edu.au/about/exponential-sums แล้วดูว่าสวยดีเลยอยากลองทำดูบ้างด้วย Mathematica การวาดกราฟจาก exponential sums หรือที่เขียนอยู่ในรูปแบบ ที่ทำนี้ก็คือถ้าเราค่อยๆบวกเข้าไปทีละเทอมและเอาค่าที่ได้มาพล็อตกราฟใน complex plane โดยที่แกนนอนคือจำนวนจริงและแกนตั้งคือจำนวนจินตภาพ ลองดูที่โค้ดน่าจะเข้าใจมากขึ้นครับ fn[n_] := Log[n]^4 NP = 5000; ls = Accumulate[Table[Exp[2 \[Pi] I fn[n]] // N, {n, 1, NP}]]; Manipulate[ ListPlot[{Re@#, Im@#}\[Transpose] &@(ls[[1 ;; np]]), Joined -> True, AspectRatio -> Full, PlotStyle -> Black, PlotRange -> {{-5, 70}, {-60, 20}}] , {np,

มาลองทำให้โค้ดMathematicaรันเร็วขึ้น

โค้ดที่เขียนด้วยMathematicaหรือภาษา Wolfram นั้นมันจะมีวิธีที่ช่วยให้มันรันได้เร็วขึ้นอยู่หลายวิธีครับ ขึ้นกับปัญหาและวิธีการเขียน ที่จะโชว์ให้ดูนี้ผมก็ใช้เทคนิคง่ายๆด้วยการทำ parallel ด้วยคำสั่ง ParallelTable และ compile ด้วยคำสั่ง Compile ครับ  โค้ดตัวอย่างที่จะเอามาลองนี้เป็นโค้ดที่ใช้วาดรูป Mandelbrot set ครับ แบบที่ 1 เป็นโค้ดเริ่มต้นที่ยังไม่มีการทำให้มันเร็วครับเขียนโดยใช้ loop จากคำสั่ง Table AbsoluteTiming[ test1 = Block[{i, x, p}, Table[i = 0; x = 0. I; p = r + I c; While[Abs@x <= Sqrt[2] && i < 9^3, x = x^2 + p; ++i];

mingw64 libdatrie-libthai-thpronun

ผมเอา code ของ libdatrie 0.2.9 , libthai 0.1.28 และ thpronun 0.2.0 มาคอมไพล์โดยใช้ msys2, mingw64 ครับ เผื่อมีประโยชน์ประหยัดเวลากันบ้างครับ libdatrie 0.2.9 libthai 0.1.28 thpronun 0.2.0 การเอาไปใช้งานก็จะต้องติดตั้ง msys2 ก่อนนะครับ จากนั้นก็เพิ่ง PATH ของ mingw เข้าไป เช่น c:\msys64\ming64\bin

ใช้ OpenMP กับ Rcpp

ที่มา https://github.com/RcppCore/Rcpp/blob/master/inst/examples/OpenMP/OpenMPandInline.r ตัวอย่าง Rcpp กับ OpenMP library(inline) openMPCode <- ‘ // assign to C++ vector std::vector<double> x = Rcpp::as<std::vector< double > >(xs); size_t n = x.size(); #pragma omp parallel for shared(x, n) for (size_t i=0; i<n; i++) { x[i] = ::log(x[i]); } return Rcpp::wrap(x); ‘ settings <- getPlugin("Rcpp") settings$env$PKG_CXXFLAGS <- paste('-fopenmp', settings$env$PKG_CXXFLAGS) settings$env$PKG_LIBS <- paste('-fopenmp -lgomp',

RcppGSL บน Windows 10

ใครที่จะใช้ RcppGSL บน Windows 10 อาจจะมีเรื่องที่ต้องทำความเข้าใจหน่อยนะครับ มีคนถามผมมาว่ามันเซ็ตอย่างไร เพราะลองเอา code ตัวอย่าง มาใช้แล้วก็ยังไม่ผ่านสักที และดูเหมือนว่าคนถามผมเองยังสับสนและไม่เข้าอยู่เล็กน้อย  เล่าคร่าวๆ ก่อนนะครับ เจ้า GSL หรือ GNU Scientific library เนี้ยเป็นlibraryที่รวบรวมคำสั่งหรือ functions ที่ใช้กันมากในวงการคณิตศาสตร์และฟิสิกส์ มันถูกเขียนขึ้นด้วยภาษา C โดยกลุ่มนักฟิสิกส์และแจกจ่ายให้ใช้กันได้ฟรีครับ ที่นี่มันก็มีคนอยากใช้งานจาก GSL นี้ใน R ก็เลยมีคนเขียน package ขึ้นมากันหลายตัว และ  RcppGSL ก็เป็นหนึ่งในนั้น เจ้า RcppGSL นี้ถ้าเราจะใช้มันเนี้ย เราต้องมี GSL ติดตั้งให้เรียบร้อยก่อน (เดี๋ยวบอกอีกทีว่าทำอย่างไรครับ) โดยที่เราจะต้องเซ็ตพารามิเตอร์สำหรับ Windows ที่ชื่อว่า LIB_GSL ไปยัง path ของ GSL ที่ติดตั้งไว้ครับ อย่างเช่นผมติดตั้งไว้ที่ D:\Data-Work\Programs\gsl\gsl_2.5 ผมก็เพียงเพิ่มเข้าใน environment

Rcpp::sourceCpp กับปัญหา -Wunused-variable

ใครที่ใช้ sourceCpp สำหรับ compile โค้ดของ Rcpp แล้วเจอปัญหา unsed-variable แล้วอยากที่จะ  ignore มัน ก็สามารถทำได้ด้วยการสร้างไฟล์ Makevars ที่มีบรรทัดนี้ครับ CXXFLAGS += -O3 -Wall -pipe -Wno-unused หรือไม่ก็แก้ไขไฟล์ Makeconf ที่ R_HOME/bin/R_ARCH (ไม่ค่อยแนะนำ) โดยเพิ่ม -O3 -Wall -pipe -Wno-unused  ในส่วนของ CXXFLAGS  ครับ