├── source ├── focus.md ├── science.md ├── video.md ├── article.md ├── preface.md ├── pdffooter.htm ├── md0.js ├── Makefile ├── convert.exe ├── mimetex.exe ├── title.md ├── tex2img.bat ├── metadata.xml ├── header.htm ├── footer.htm ├── editor.md ├── license.md ├── reflink.md9 ├── home.md ├── video1.md ├── article3.md ├── article3.md0 ├── info.md ├── focus1.md ├── focus1.md0 ├── article1.md ├── article2.md ├── article4.md ├── article6.md ├── focus2.md0 ├── focus2.md ├── article5.md ├── focus3.md ├── focus3.md0 └── focus4.md ├── code.zip ├── book ├── A4.pdf ├── A4.epub ├── ipad.pdf └── ipad.epub ├── img ├── MLP.jpg ├── cover.jpg ├── BridanAN.gif ├── Gradient.jpg ├── coverA4.png ├── queen5.JPG ├── queen8.JPG ├── MLP_neuron.jpg ├── NeuralCell.jpg ├── NeuralNet1.jpg ├── perceptron.jpg ├── image_thumb11.png ├── image_thumb13.png ├── image_thumb15.png ├── image_thumb3.png ├── image_thumb5.png ├── image_thumb62.png ├── image_thumb7.png ├── perceptron2.jpg ├── BridanNeuro_XOR.jpg ├── image_thumb4222.png ├── image_thumb132222.png ├── image_thumb14325.png ├── image_thumb13322222.png ├── SpeakToArduinoDevice1.jpg └── perceptronLinearAnalysis.jpg ├── slide └── neural.odp ├── code └── neural │ ├── myLib.js │ ├── backprop - 複製.js │ ├── backprop_7seg.js │ ├── test.js │ ├── backprop_xor.js │ ├── perceptron - 複製.js │ ├── perceptron_theta.js │ ├── perceptron.js │ ├── backprop.py │ └── backprop.js ├── timg ├── 0a49adc5ecfb.jpg ├── 0a7a7dbd3516.jpg ├── 1faa2e48aea6.jpg ├── 2554a2bb846c.jpg ├── 49e401d40cf4.jpg ├── 4d0383fdb044.jpg ├── 4ec0188cd431.jpg ├── 5ced75ffc852.jpg ├── 6fb8eb2fce33.jpg ├── 7621e383e2fc.jpg ├── 7f0e1a55880d.jpg ├── 856b9cd80d94.jpg ├── 8e42fbb23320.jpg ├── 9fb86666733f.jpg ├── ae4a7a4a574d.jpg ├── b1cacbe18ad7.jpg ├── c139ddae2765.jpg ├── cd7b4072bc59.jpg ├── d7d825c1b95d.jpg ├── deff37e6fc5a.jpg └── fb1e12546ddc.jpg ├── README.md ├── htm ├── video.html ├── article.html ├── preface.html ├── focus.html ├── science.html ├── title.html ├── editor.html ├── license.html ├── video1.html ├── article3.html ├── home.html ├── focus1.html ├── info.html ├── article1.html ├── article2.html └── article4.html └── css ├── pmag_bak.css └── pmag.css /source/focus.md: -------------------------------------------------------------------------------- 1 | # 本期焦點 2 | -------------------------------------------------------------------------------- /source/science.md: -------------------------------------------------------------------------------- 1 | # 程式與科學 2 | -------------------------------------------------------------------------------- /source/video.md: -------------------------------------------------------------------------------- 1 | 2 | # 影音頻道 3 | -------------------------------------------------------------------------------- /source/article.md: -------------------------------------------------------------------------------- 1 | 2 | # 程式人文集 3 | -------------------------------------------------------------------------------- /source/preface.md: -------------------------------------------------------------------------------- 1 | # 前言 2 | 3 | 4 | -------------------------------------------------------------------------------- /source/pdffooter.htm: -------------------------------------------------------------------------------- 1 |
_PAGENUM_
2 | -------------------------------------------------------------------------------- /code.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201404/HEAD/code.zip -------------------------------------------------------------------------------- /book/A4.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201404/HEAD/book/A4.pdf -------------------------------------------------------------------------------- /img/MLP.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201404/HEAD/img/MLP.jpg -------------------------------------------------------------------------------- /book/A4.epub: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201404/HEAD/book/A4.epub -------------------------------------------------------------------------------- /book/ipad.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201404/HEAD/book/ipad.pdf -------------------------------------------------------------------------------- /img/cover.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201404/HEAD/img/cover.jpg -------------------------------------------------------------------------------- /source/md0.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201404/HEAD/source/md0.js -------------------------------------------------------------------------------- /book/ipad.epub: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201404/HEAD/book/ipad.epub -------------------------------------------------------------------------------- /img/BridanAN.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201404/HEAD/img/BridanAN.gif -------------------------------------------------------------------------------- /img/Gradient.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201404/HEAD/img/Gradient.jpg -------------------------------------------------------------------------------- /img/coverA4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201404/HEAD/img/coverA4.png -------------------------------------------------------------------------------- /img/queen5.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201404/HEAD/img/queen5.JPG -------------------------------------------------------------------------------- /img/queen8.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201404/HEAD/img/queen8.JPG -------------------------------------------------------------------------------- /slide/neural.odp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201404/HEAD/slide/neural.odp -------------------------------------------------------------------------------- /source/Makefile: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201404/HEAD/source/Makefile -------------------------------------------------------------------------------- /img/MLP_neuron.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201404/HEAD/img/MLP_neuron.jpg -------------------------------------------------------------------------------- /img/NeuralCell.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201404/HEAD/img/NeuralCell.jpg -------------------------------------------------------------------------------- /img/NeuralNet1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201404/HEAD/img/NeuralNet1.jpg -------------------------------------------------------------------------------- /img/perceptron.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201404/HEAD/img/perceptron.jpg -------------------------------------------------------------------------------- /source/convert.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201404/HEAD/source/convert.exe -------------------------------------------------------------------------------- /source/mimetex.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201404/HEAD/source/mimetex.exe -------------------------------------------------------------------------------- /code/neural/myLib.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201404/HEAD/code/neural/myLib.js -------------------------------------------------------------------------------- /img/image_thumb11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201404/HEAD/img/image_thumb11.png -------------------------------------------------------------------------------- /img/image_thumb13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201404/HEAD/img/image_thumb13.png -------------------------------------------------------------------------------- /img/image_thumb15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201404/HEAD/img/image_thumb15.png -------------------------------------------------------------------------------- /img/image_thumb3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201404/HEAD/img/image_thumb3.png -------------------------------------------------------------------------------- /img/image_thumb5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201404/HEAD/img/image_thumb5.png -------------------------------------------------------------------------------- /img/image_thumb62.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201404/HEAD/img/image_thumb62.png -------------------------------------------------------------------------------- /img/image_thumb7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201404/HEAD/img/image_thumb7.png -------------------------------------------------------------------------------- /img/perceptron2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201404/HEAD/img/perceptron2.jpg -------------------------------------------------------------------------------- /timg/0a49adc5ecfb.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201404/HEAD/timg/0a49adc5ecfb.jpg -------------------------------------------------------------------------------- /timg/0a7a7dbd3516.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201404/HEAD/timg/0a7a7dbd3516.jpg -------------------------------------------------------------------------------- /timg/1faa2e48aea6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201404/HEAD/timg/1faa2e48aea6.jpg -------------------------------------------------------------------------------- /timg/2554a2bb846c.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201404/HEAD/timg/2554a2bb846c.jpg -------------------------------------------------------------------------------- /timg/49e401d40cf4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201404/HEAD/timg/49e401d40cf4.jpg -------------------------------------------------------------------------------- /timg/4d0383fdb044.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201404/HEAD/timg/4d0383fdb044.jpg -------------------------------------------------------------------------------- /timg/4ec0188cd431.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201404/HEAD/timg/4ec0188cd431.jpg -------------------------------------------------------------------------------- /timg/5ced75ffc852.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201404/HEAD/timg/5ced75ffc852.jpg -------------------------------------------------------------------------------- /timg/6fb8eb2fce33.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201404/HEAD/timg/6fb8eb2fce33.jpg -------------------------------------------------------------------------------- /timg/7621e383e2fc.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201404/HEAD/timg/7621e383e2fc.jpg -------------------------------------------------------------------------------- /timg/7f0e1a55880d.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201404/HEAD/timg/7f0e1a55880d.jpg -------------------------------------------------------------------------------- /timg/856b9cd80d94.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201404/HEAD/timg/856b9cd80d94.jpg -------------------------------------------------------------------------------- /timg/8e42fbb23320.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201404/HEAD/timg/8e42fbb23320.jpg -------------------------------------------------------------------------------- /timg/9fb86666733f.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201404/HEAD/timg/9fb86666733f.jpg -------------------------------------------------------------------------------- /timg/ae4a7a4a574d.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201404/HEAD/timg/ae4a7a4a574d.jpg -------------------------------------------------------------------------------- /timg/b1cacbe18ad7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201404/HEAD/timg/b1cacbe18ad7.jpg -------------------------------------------------------------------------------- /timg/c139ddae2765.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201404/HEAD/timg/c139ddae2765.jpg -------------------------------------------------------------------------------- /timg/cd7b4072bc59.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201404/HEAD/timg/cd7b4072bc59.jpg -------------------------------------------------------------------------------- /timg/d7d825c1b95d.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201404/HEAD/timg/d7d825c1b95d.jpg -------------------------------------------------------------------------------- /timg/deff37e6fc5a.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201404/HEAD/timg/deff37e6fc5a.jpg -------------------------------------------------------------------------------- /timg/fb1e12546ddc.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201404/HEAD/timg/fb1e12546ddc.jpg -------------------------------------------------------------------------------- /img/BridanNeuro_XOR.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201404/HEAD/img/BridanNeuro_XOR.jpg -------------------------------------------------------------------------------- /img/image_thumb4222.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201404/HEAD/img/image_thumb4222.png -------------------------------------------------------------------------------- /img/image_thumb132222.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201404/HEAD/img/image_thumb132222.png -------------------------------------------------------------------------------- /img/image_thumb14325.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201404/HEAD/img/image_thumb14325.png -------------------------------------------------------------------------------- /source/title.md: -------------------------------------------------------------------------------- 1 | % [程式人雜誌](https://www.facebook.com/groups/programmerMagazine/) 2 | % 2014 年 4 月號 3 | % 本期焦點:神經網路 -------------------------------------------------------------------------------- /code/neural/backprop - 複製.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201404/HEAD/code/neural/backprop - 複製.js -------------------------------------------------------------------------------- /code/neural/backprop_7seg.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201404/HEAD/code/neural/backprop_7seg.js -------------------------------------------------------------------------------- /img/image_thumb13322222.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201404/HEAD/img/image_thumb13322222.png -------------------------------------------------------------------------------- /img/SpeakToArduinoDevice1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201404/HEAD/img/SpeakToArduinoDevice1.jpg -------------------------------------------------------------------------------- /img/perceptronLinearAnalysis.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/programmermagazine/201404/HEAD/img/perceptronLinearAnalysis.jpg -------------------------------------------------------------------------------- /source/tex2img.bat: -------------------------------------------------------------------------------- 1 | if not exist {%2.jpg} ( 2 | mimetex -d %1 -e %2.gif 3 | convert %2.gif %2.jpg 4 | rm %2.gif 5 | ) 6 | -------------------------------------------------------------------------------- /source/metadata.xml: -------------------------------------------------------------------------------- 1 | Creative Commons Non-Commercial Share Alike 3.0 2 | en-US 3 | -------------------------------------------------------------------------------- /code/neural/test.js: -------------------------------------------------------------------------------- 1 | x=3.14159; 2 | 3 | Number.prototype.toString = function() { 4 | return this.toFixed(3); 5 | } 6 | 7 | console.log("x=%d", x); -------------------------------------------------------------------------------- /source/header.htm: -------------------------------------------------------------------------------- 1 |
2 |

程式人雜誌 -- 2014 年 4 月號 (開放公益出版品)

3 |
4 |
5 | -------------------------------------------------------------------------------- /source/footer.htm: -------------------------------------------------------------------------------- 1 |
2 | 5 | -------------------------------------------------------------------------------- /source/editor.md: -------------------------------------------------------------------------------- 1 | ## 編輯小語 2 | 3 | 在本期的「程式人雜誌」中,聚焦的主題是「神經網路」,包含理論與實作! 4 | 5 | 神經網路是「機器學習」與「人工智慧」中的一個重要方法,常被用在「影像處理、語音處理、分群分類」等領域。 6 | 7 | 雖然神經網路有很多種類,但本期關注的主要技術是「感知器」,包含「單層感知器」與「多層感知器」,以及用在「多層感知器」上的「反傳遞學習演算法」。 8 | 9 | 當然、本期不只有「神經網路」的相關文章,還有更精彩的 Arduino, VB, OpenNI, 開放電腦計畫等內容,希望讀者會喜歡這期的「程式人雜誌」! 10 | 11 | ---- (程式人雜誌編輯 - 陳鍾誠) 12 | -------------------------------------------------------------------------------- /code/neural/backprop_xor.js: -------------------------------------------------------------------------------- 1 | var NN = require("./backprop"); 2 | 3 | pat = [ 4 | [[0,0], [0]], 5 | [[0,1], [1]], 6 | [[1,0], [1]], 7 | [[1,1], [0]] 8 | ]; 9 | 10 | // create a network with two input, two hidden, and one output nodes 11 | nn = new NN().init(2, 2, 1); 12 | // train it with some patterns 13 | nn.train(pat, 1000, 0.5, 0.1); 14 | // test it 15 | nn.test(pat); 16 | -------------------------------------------------------------------------------- /source/license.md: -------------------------------------------------------------------------------- 1 | ## 授權聲明 2 | 3 | 本雜誌許多資料修改自維基百科,採用 創作共用:[姓名標示、相同方式分享] 授權,若您想要修改本書產生衍生著作時,至少應該遵守下列授權條件: 4 | 5 | 1. 標示原作者姓名 (包含該文章作者,若有來自維基百科的部份也請一併標示)。 6 | 3. 採用 創作共用:[姓名標示、相同方式分享] 的方式公開衍生著作。 7 | 8 | 另外、當本雜誌中有文章或素材並非採用 [姓名標示、相同方式分享] 時,將會在該文章或素材後面標示其授權,此時該文章將以該標示的方式授權釋出,請修改者注意這些授權標示,以避免產生侵權糾紛。 9 | 10 | 例如有些文章可能不希望被作為「商業性使用」,此時就可能會採用創作共用:[姓名標示、非商業性、相同方式分享] 的授權,此時您就不應當將該文章用於商業用途上。 11 | 12 | 最後、懇請勿移除公益捐贈的相關描述,以便讓愛心得以持續散播! 13 | 14 | -------------------------------------------------------------------------------- /source/reflink.md9: -------------------------------------------------------------------------------- 1 | [程式人雜誌社團]: https://www.facebook.com/groups/programmerMagazine/ 2 | [科學玩具實驗室]:https://www.facebook.com/groups/sciencetoy/ 3 | [姓名標示、相同方式分享]: http://creativecommons.org/licenses/by-sa/3.0/tw/ 4 | [姓名標示、非商業性、相同方式分享]: http://creativecommons.org/licenses/by-nc-sa/3.0/tw/ 5 | [馬萬圳]: http://coopermaa2nd.blogspot.tw/ 6 | [陳鍾誠]: http://ccckmit.wikidot.com/ 7 | [雜誌訂閱]: https://docs.google.com/spreadsheet/viewform?fromEmail=true&formkey=dG1TcER6Q3h1ZkpacFpDeEVFTDBLeVE6MQ 8 | [College Physics]:http://openstaxcollege.org/textbooks/college-physics 9 | [維基百科]:http://zh.wikipedia.org/ -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ### 關於程式人雜誌 2 | 3 | [程式人雜誌] 是一個結合「開放原始碼與公益捐款活動」的雜誌,簡稱「開放公益雜誌」。開放公益雜誌本著「讀書做善事、寫書做公益」的精神,我們非常歡迎程式人認養專欄、或者捐出您的網誌。 4 | 5 | ## 授權聲明 6 | 7 | 本雜誌許多資料修改自維基百科,採用 創作共用:[姓名標示、相同方式分享] 授權,若您想要修改本書產生衍生著作時,至少應該遵守下列授權條件: 8 | 9 | 1. 標示原作者姓名 (包含該文章作者,若有來自維基百科的部份也請一併標示)。 10 | 3. 採用 創作共用:[姓名標示、相同方式分享] 的方式公開衍生著作。 11 | 12 | 另外、當本雜誌中有文章或素材並非採用 [姓名標示、相同方式分享] 時,將會在該文章或素材後面標示其授權,此時該文章將以該標示的方式授權釋出,請修改者注意這些授權標示,以避免產生侵權糾紛。 13 | 14 | 例如有些文章可能不希望被作為「商業性使用」,此時就可能會採用創作共用:[姓名標示、非商業性、相同方式分享] 的授權,此時您就不應當將該文章用於商業用途上。 15 | 16 | 最後、懇請勿移除公益捐贈的相關描述,以便讓愛心得以持續散播! 17 | 18 | 19 | [程式人雜誌]: https://www.facebook.com/groups/programmerMagazine/ 20 | [姓名標示、相同方式分享]: http://creativecommons.org/licenses/by-sa/3.0/tw/ 21 | [姓名標示、非商業性、相同方式分享]: http://creativecommons.org/licenses/by-nc-sa/3.0/tw/ 22 | -------------------------------------------------------------------------------- /htm/video.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 |

程式人雜誌 -- 2014 年 4 月號 (開放公益出版品)

14 |
15 |
16 |

# 影音頻道

17 |
18 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /htm/article.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 |

程式人雜誌 -- 2014 年 4 月號 (開放公益出版品)

14 |
15 |
16 |

# 程式人文集

17 |
18 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /htm/preface.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 |

程式人雜誌 -- 2014 年 4 月號 (開放公益出版品)

14 |
15 |
16 |
17 | 20 |
21 |

前言

22 |
23 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /htm/focus.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 |

程式人雜誌 -- 2014 年 4 月號 (開放公益出版品)

14 |
15 |
16 |
17 | 20 |
21 |

本期焦點

22 |
23 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /htm/science.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 |

程式人雜誌 -- 2014 年 4 月號 (開放公益出版品)

14 |
15 |
16 |
17 | 20 |
21 |

程式與科學

22 |
23 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /htm/title.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 程式人雜誌 9 | 10 | 11 | 12 | 13 |
14 |

程式人雜誌 -- 2014 年 4 月號 (開放公益出版品)

15 |
16 |
17 | 22 | 23 |
24 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /htm/editor.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 |

程式人雜誌 -- 2014 年 4 月號 (開放公益出版品)

14 |
15 |
16 |
17 | 20 |
21 |

編輯小語

22 |

在本期的「程式人雜誌」中,聚焦的主題是「神經網路」,包含理論與實作!

23 |

神經網路是「機器學習」與「人工智慧」中的一個重要方法,常被用在「影像處理、語音處理、分群分類」等領域。

24 |

雖然神經網路有很多種類,但本期關注的主要技術是「感知器」,包含「單層感知器」與「多層感知器」,以及用在「多層感知器」上的「反傳遞學習演算法」。

25 |

當然、本期不只有「神經網路」的相關文章,還有更精彩的 Arduino, VB, OpenNI, 開放電腦計畫等內容,希望讀者會喜歡這期的「程式人雜誌」!

26 |

---- (程式人雜誌編輯 - 陳鍾誠)

27 |
28 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /source/home.md: -------------------------------------------------------------------------------- 1 | ### 關於程式人雜誌 2 | 3 | 程式人雜誌是一個結合「開放原始碼與公益捐款活動」的雜誌,簡稱「開放公益雜誌」。開放公益雜誌本著「讀書做善事、寫書做公益」的精神,我們非常歡迎程式人認養專欄、或者捐出您的網誌。 4 | 5 | ### 雜誌下載 6 | 7 | 出刊年月 epub ipad:PDF A4:PDF 單頁 HTM 原始碼 全部下載 8 | ------------ ---------- ----------- -------- ----------- ---------- ------------- 9 | 2014年4月 [epub] [ipad.pdf] [A4.pdf] [pmag.html] [code.zip] [github] 10 | 11 | ### 本期內容 (焦點:神經網路) 12 | * 前言 13 | * [編輯小語](editor.html) 14 | * [授權聲明](license.html) 15 | * 本期焦點 16 | * [神經網路簡介](focus1.html) 17 | * [單層感知器 (Perceptron) 實作 - 使用 JavaScript+Node.js](focus2.html) 18 | * [多層感知器與反傳遞演算法實作 - 使用 JavaScript+Node.js](focus3.html) 19 | * [類神經網路轉譯成 C++ (作者:張藝瀚)](focus4.html) 20 | * 程式人文集 21 | * [Arduino入門教學(16) – Amarino 的 SpeakToArduino 範例程式 (作者:Cooper Maa)](article1.html) 22 | * [OpenNI 2 的錯誤處理 (作者: Heresy Ku )](article2.html) 23 | * [人工神經網路 (Artificial Neural Network) (作者:Bridan)](article3.html) 24 | * [Visual Basic 6.0:利用遞迴與程序導向解 N Queens Puzzle 皇后問題 (作者:廖憲得 0xde)](article4.html) 25 | * [開放電腦計畫 (10) – J0C 編譯器:使用 node.js + javascript 實作 (作者:陳鍾誠)](article5.html) 26 | * [雜誌訊息](info.html) 27 | 28 | ### 雜誌取得 29 | 30 | 程式人雜誌預定於每個月 1 日出刊,您可以從下列網址取得程式人雜誌的所有內容 (包含當月最新出刊的雜誌)。 31 | 32 | * 33 | 34 | ### 連絡我們 35 | 36 | 竭誠歡迎程式人投稿,或者成為本雜誌的專欄作家,現在就可以加入 [程式人雜誌社團] 一同共襄盛舉。 37 | 38 | 本雜誌編輯為「陳鍾誠 (@ccckmit)」,若要聯絡編輯,請寄信到 。 39 | 40 | [epub]: ../book/A4.epub 41 | [ipad.pdf]: ../book/ipad.pdf 42 | [A4.pdf]: ../book/A4.pdf 43 | [code.zip]: ../code.zip 44 | [pmag.html]: ../book/pmag.html 45 | [github]: https://github.com/programmermagazine/201404 46 | 47 | -------------------------------------------------------------------------------- /source/video1.md: -------------------------------------------------------------------------------- 1 | ## 看影片學 Lua 程式設計 2 | 3 | Lua 的語法很簡單,執行環境也很簡單,如果您用的是 Linux,應該從 [Lua 官網上下載](http://www.lua.org/download.html) 建置一下就可以了,以下是官網所提供的建置方法: 4 | 5 | ``` 6 | curl -R -O http://www.lua.org/ftp/lua-5.2.3.tar.gz 7 | tar zxf lua-5.2.3.tar.gz 8 | cd lua-5.2.3 9 | make linux test 10 | ``` 11 | 12 | 如果您用 MS. Windows ,那麼就可以安裝 Lua for Windows,以下是其網址: 13 | 14 | * 15 | 16 | 下載安裝後,您會發現在「開始/所有程式」裏有個 Lua 的資料夾,裏面有「iLua, Lua Command Line, Lua Examples, QuickLuaTour」等項目,建議您看看「QuickLuaTour」,它會帶領你快速的熟悉 Lua 的語法與範例。 17 | 18 | 接著您可以直接起動命令列,然後用任何的編輯器,像是「Notepad++」等,開始寫一些簡單的程式,然後直接用 `lua <程式名稱>` 去執行您的程式即可。以下是筆者執行幾個 Lua 程式的過程: 19 | 20 | ``` 21 | D:\Dropbox\Public\pmag\201402\code>lua hello.lua 22 | Hello World! 23 | 24 | D:\Dropbox\Public\pmag\201402\code>lua fact.lua 25 | factorial(5)=120 26 | 27 | D:\Dropbox\Public\pmag\201402\code>lua obj.lua 28 | 10,20 29 | 30,40 30 | 50,60 31 | 32 | D:\Dropbox\Public\pmag\201402\code>lua obj.lua 33 | point(10,20) 34 | point(30,40) 35 | point(50,60) 36 | ``` 37 | 38 | 您可以以看看下列 Lua 的影片,以便瞭解 Lua 的程式寫法: 39 | 40 | | 影片 | 連結 | 41 | |----------------------------------------------------|------------------------------------------| 42 | | Lua Tutorial #1: Introduction and Setup | | 43 | | Lua Tutorial #2: Hello World | | 44 | | Lua Tutorial #3: Variables and User Input | | 45 | | Lua Tutorial #4: Basic Mathematics | | 46 | | Lua Tutorial #5: If and Else | | 47 | 48 | 當然、多寫多看,應該是學習程式的不二法門。學程式與學習游泳一樣,只有下水開始扭動身體,才有機會真正學會游泳,也只有真正開始上機寫程式,才有可能真正學會寫程式。對於 Lua 、當然也是如此! 49 | 50 | -------------------------------------------------------------------------------- /source/article3.md: -------------------------------------------------------------------------------- 1 | ## 人工神經網路 (Artificial Neural Network) (作者:Bridan) 2 | 3 | [NEURO](http://zh.wikipedia.org/wiki/%E4%BA%BA%E5%B7%A5%E7%A5%9E%E7%BB%8F%E7%BD%91%E7%BB%9C) 這門學問是我工作時才學習得的知識,多年前曾有一篇 [洗衣機](http://4rdp.blogspot.tw/2009/07/washing-machine.html) 貼文提到它,當時第一次知道這東西時,已經從研究所畢業好幾年,書局也沒幾本書可以參考,書中一堆數學式,有看沒有很懂,九O年代網路剛興起,沒甚麼資料可查,正好一位大學同學在大同工學院攻讀博士班主攻語音辨識,NEURO 就是用於學習辨識語音模式的解決方案之一,因此跟主管提出學習計畫,對授課教授表達旁聽的想法,就每周固定時間去大同工學院上課,我不需要學分,所以不用繳學費、不必考試、不必交作業,自備課本上了一個學期的課,這種學習方法在我準備插班大學考試也用過,並認識一些朋友。最近上網查,沒什麼人對 NEURO 議題,提供簡單的實例,以供初學者參考入門,現在將個人所知的做個紀錄分享。 4 | 5 | 類神經網路有很多解決方案,這裡使用 BP 方法。首先認識神經元的數學模型, 6 | 7 | ![](../img/BridanAN.gif) 8 | 9 | MP (MultiLayer Perceptron) 模型公式: 10 | 11 | ### 一、先計算內部數值 12 | 13 | Ui = Σ Wji Xj – θi 14 | 15 | Wji = 連結強度 16 | 17 | Xj = 神經元 j 所傳來之訊號 18 | 19 | θi = 神經元 i 之閥值 20 | 21 | ### 二、計算輸出數值 22 | 23 | Yi = f(Ui) = Yi 處理單元函數 24 | 25 | f = 轉換函數,通常為階梯函數(Step function) 26 | 27 | 例如 Yi = 1 / (1 + exp(-Ui)) 28 | 29 | ### 三、δ差距量 ,用來修正權重 30 | 31 | {T}目標輸出量 32 | 33 | {Y}推論輸出量 34 | 35 | 差距量 = 目標輸出量 – 推論輸出量 = δi = Ti – Yi 36 | 37 | 本文範例採取的修正算式 δi = Yi‧(1 - Yi)‧(Ti – Yi) 38 | 39 | ### 四、計算輸出閥值及權重變量 40 | 41 | η:學習速率,控制權重修正幅度 42 | 43 | 輸出單元閥值改變量 = △θi = - η‧δi 44 | 45 | 權重改變量 = △Wji = Xj‧η‧δi 46 | 47 | ### 五、修正下一輪閥值及權重 48 | 49 | θi = θi + △θi 50 | 51 | Wji = Wji + △Wji 52 | 53 | ### 六、檢驗成果 54 | 55 | 總錯誤率 = 誤分類案例總數/範例總數 56 | 57 | 58 | **依問題的複雜層度,利用它組合一知識神經網路,基本上有三大層-輸入層、隱藏層及輸出層。** 59 | 60 | ![](../img/BridanNeuro_XOR.jpg) 61 | 62 | 最後整理一個 [試算表](https://docs.google.com/spreadsheet/ccc?key=0AvTFWEwZaQ8_dEI1YlBla081dDJ0MERiY3NSNzcwMFE&usp=sharing) 提供有興趣的朋友參考,以 XOR 邏輯為例,X1, X2 為輸入,Y為輸出,用 #3, #4, #5 三個神經元學習,H3, H4 是隱藏層(夾在輸入及輸出之間),簡單的問題一個隱藏層就夠,複雜的可能需要兩層。使用四種組合狀態重複訓練,最後它會穩定判別輸入,並給予適合的答案。 63 | 64 | 以 [遞迴或遞歸 (Recursion)](http://4rdp.blogspot.tw/2009/08/recursion.html) *這樣技術,可將非線性數學問題收斂求解,* **能處理類似邏輯型式的問題** ,供大家參考。 65 | 66 | (本文來自「研發養成所」 Bridan 的網誌,原文網址為 ,由陳鍾誠編輯後納入程式人雜誌) 67 | 68 | -------------------------------------------------------------------------------- /source/article3.md0: -------------------------------------------------------------------------------- 1 | ## 人工神經網路 (Artificial Neural Network) (作者:Bridan) 2 | 3 | [NEURO](http://zh.wikipedia.org/wiki/%E4%BA%BA%E5%B7%A5%E7%A5%9E%E7%BB%8F%E7%BD%91%E7%BB%9C) 這門學問是我工作時才學習得的知識,多年前曾有一篇 [洗衣機](http://4rdp.blogspot.tw/2009/07/washing-machine.html) 貼文提到它,當時第一次知道這東西時,已經從研究所畢業好幾年,書局也沒幾本書可以參考,書中一堆數學式,有看沒有很懂,九O年代網路剛興起,沒甚麼資料可查,正好一位大學同學在大同工學院攻讀博士班主攻語音辨識,NEURO 就是用於學習辨識語音模式的解決方案之一,因此跟主管提出學習計畫,對授課教授表達旁聽的想法,就每周固定時間去大同工學院上課,我不需要學分,所以不用繳學費、不必考試、不必交作業,自備課本上了一個學期的課,這種學習方法在我準備插班大學考試也用過,並認識一些朋友。最近上網查,沒什麼人對 NEURO 議題,提供簡單的實例,以供初學者參考入門,現在將個人所知的做個紀錄分享。 4 | 5 | 類神經網路有很多解決方案,這裡使用 BP 方法。首先認識神經元的數學模型, 6 | 7 | ![](../img/BridanAN.gif) 8 | 9 | MP (MultiLayer Perceptron) 模型公式: 10 | 11 | ### 一、先計算內部數值 12 | 13 | Ui = Σ Wji Xj – θi 14 | 15 | Wji = 連結強度 16 | 17 | Xj = 神經元 j 所傳來之訊號 18 | 19 | θi = 神經元 i 之閥值 20 | 21 | ### 二、計算輸出數值 22 | 23 | Yi = f(Ui) = Yi 處理單元函數 24 | 25 | f = 轉換函數,通常為階梯函數(Step function) 26 | 27 | 例如 Yi = 1 / (1 + exp(-Ui)) 28 | 29 | ### 三、δ差距量 ,用來修正權重 30 | 31 | {T}目標輸出量 32 | 33 | {Y}推論輸出量 34 | 35 | 差距量 = 目標輸出量 – 推論輸出量 = δi = Ti – Yi 36 | 37 | 本文範例採取的修正算式 δi = Yi‧(1 - Yi)‧(Ti – Yi) 38 | 39 | ### 四、計算輸出閥值及權重變量 40 | 41 | η:學習速率,控制權重修正幅度 42 | 43 | 輸出單元閥值改變量 = △θi = - η‧δi 44 | 45 | 權重改變量 = △Wji = Xj‧η‧δi 46 | 47 | ### 五、修正下一輪閥值及權重 48 | 49 | θi = θi + △θi 50 | 51 | Wji = Wji + △Wji 52 | 53 | ### 六、檢驗成果 54 | 55 | 總錯誤率 = 誤分類案例總數/範例總數 56 | 57 | 58 | **依問題的複雜層度,利用它組合一知識神經網路,基本上有三大層-輸入層、隱藏層及輸出層。** 59 | 60 | ![](../img/BridanNeuro_XOR.jpg) 61 | 62 | 最後整理一個 [試算表](https://docs.google.com/spreadsheet/ccc?key=0AvTFWEwZaQ8_dEI1YlBla081dDJ0MERiY3NSNzcwMFE&usp=sharing) 提供有興趣的朋友參考,以 XOR 邏輯為例,X1, X2 為輸入,Y為輸出,用 #3, #4, #5 三個神經元學習,H3, H4 是隱藏層(夾在輸入及輸出之間),簡單的問題一個隱藏層就夠,複雜的可能需要兩層。使用四種組合狀態重複訓練,最後它會穩定判別輸入,並給予適合的答案。 63 | 64 | 以 [遞迴或遞歸 (Recursion)](http://4rdp.blogspot.tw/2009/08/recursion.html) *這樣技術,可將非線性數學問題收斂求解,* **能處理類似邏輯型式的問題** ,供大家參考。 65 | 66 | (本文來自「研發養成所」 Bridan 的網誌,原文網址為 ,由陳鍾誠編輯後納入程式人雜誌) 67 | 68 | -------------------------------------------------------------------------------- /htm/license.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 |

程式人雜誌 -- 2014 年 4 月號 (開放公益出版品)

14 |
15 |
16 |
17 | 20 |
21 |

授權聲明

22 |

本雜誌許多資料修改自維基百科,採用 創作共用:姓名標示、相同方式分享 授權,若您想要修改本書產生衍生著作時,至少應該遵守下列授權條件:

23 |
    24 |
  1. 標示原作者姓名 (包含該文章作者,若有來自維基百科的部份也請一併標示)。
  2. 25 |
  3. 採用 創作共用:姓名標示、相同方式分享 的方式公開衍生著作。
  4. 26 |
27 |

另外、當本雜誌中有文章或素材並非採用 姓名標示、相同方式分享 時,將會在該文章或素材後面標示其授權,此時該文章將以該標示的方式授權釋出,請修改者注意這些授權標示,以避免產生侵權糾紛。

28 |

例如有些文章可能不希望被作為「商業性使用」,此時就可能會採用創作共用:姓名標示、非商業性、相同方式分享 的授權,此時您就不應當將該文章用於商業用途上。

29 |

最後、懇請勿移除公益捐贈的相關描述,以便讓愛心得以持續散播!

30 |
31 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /code/neural/perceptron - 複製.js: -------------------------------------------------------------------------------- 1 | var log = console.log; 2 | 3 | var Perceptron = function() { // 感知器物件 4 | this.step=function(x, w, theta) { // 步階函數:計算目前權重 w 的情況下,網路的輸出值為 0 或 1 5 | var result = w[0] * x[0] + w[1] * x[1] - theta; // y=x0*w0+x1*w1-theta 6 | if (result >= 0) // 如果結果大於零 7 | return 1; // 就輸出 1 8 | else // 否則 9 | return 0; // 就輸出 0 10 | } 11 | 12 | this.training=function(truthTable) { // 訓練函數 training(truthTable), 其中 truthTable 是目標真值表 13 | var theta = 0.5; // 閥值 14 | var alpha = 0.01; // 學習調整速率 15 | var w = [ 0.0, 0.0 ]; // 權重 16 | for (var loop=0; loop<100; loop++) { // 總共訓練一百輪 17 | var eSum = 0.0; 18 | for (var i=0; i= 0) // 如果結果大於零 7 | return 1; // 就輸出 1 8 | else // 否則 9 | return 0; // 就輸出 0 10 | } 11 | 12 | this.training=function(truthTable) { // 訓練函數 training(truthTable), 其中 truthTable 是目標真值表 13 | var theta = 0.5; // 閥值 14 | var rate = 0.01; // 學習調整速率 15 | var w = [ 0, 0, 0 ]; // 權重 16 | for (var loop=0; loop<100; loop++) { // 總共訓練一百輪 17 | var eSum = 0.0; 18 | for (var i=0; i
顱顏患者 銀行:009彰化銀行民生分行
33 |
(如唇顎裂、小耳症或其他罕見顱顏缺陷) 帳號:5234-01-41778-800 34 | 02-27190408分機 232 35 | 36 | 社團法人台灣省兒童少年成長協會
單親、隔代教養.弱勢及一般家庭之兒童青少年 銀行:新光銀行
37 |
戶名:台灣省兒童少年成長協會
38 | 04-23058005 帳號:103-0912-10-000212-0 39 | ------------------------------- ----------------------------- ----------------------------------------- ------------------------------------------- 40 | 41 | [看影片學 markdown 編輯出版流程]:https://dl.dropboxusercontent.com/u/101584453/pmag/201304/htm/video1.html 42 | -------------------------------------------------------------------------------- /code/neural/perceptron.js: -------------------------------------------------------------------------------- 1 | var log = console.log; 2 | 3 | var Perceptron = function() { // 感知器物件 4 | this.step=function(x, w) { // 步階函數:計算目前權重 w 的情況下,網路的輸出值為 0 或 1 5 | var result = w[0]*x[0]+w[1]*x[1]+w[2]*x[2]; // y=w0*x0+x1*w1+x2*w2=-theta+x1*w1+x2*w2 6 | if (result >= 0) // 如果結果大於零 7 | return 1; // 就輸出 1 8 | else // 否則 9 | return 0; // 就輸出 0 10 | } 11 | 12 | this.training=function(truthTable) { // 訓練函數 training(truthTable), 其中 truthTable 是目標真值表 13 | var rate = 0.01; // 學習調整速率,也就是 alpha 14 | var w = [ 1, 0, 0 ]; 15 | for (var loop=0; loop<1000; loop++) { // 最多訓練一千輪 16 | var eSum = 0.0; 17 | for (var i=0; i Rumelhart, David E.; Hinton, Geoffrey E., Williams, Ronald J. Learning representations by back-propagating errors. Nature. 8 October 1986, 323 (6088): 533–536. 30 | 31 | 事實上、反向傳播的方法,並不是 Rumelhart 等人第一個提出來的,Paul J. Werbos 1974 年在哈佛的博士論文中就提出了類似的方法,只是大家都不知道而已。 32 | 33 | > Paul J. Werbos. Beyond Regression: New Tools for Prediction and Analysis in the Behavioral Sciences. PhD thesis, Harvard University, 1974 34 | 35 | 當然、神經網路再度成為研究焦點之後,各式各樣的方法又被發展出來了,大致上這些方法可以分為兩類,一種稱為「有指導者」的神經網路(Supervised Neural Network) ,像是「感知器與反傳遞演算法」等,另一種稱為「沒有指導者」的神經網路 (Unsupervised Neural Network),像是「霍普菲爾德網路 (Hopfield Network) 與自組織神經網路 (Self Organization network)」等等。 36 | 37 | 當然、神經網路並不是「神奇銀彈」,可以解決人工智慧上的所有問題,神經網路最強大的地方是容錯性很強,而且不需要像專家系統這樣撰寫一堆規則,但是有一得必有一失,神經網路自動學習完成之後,我們根本不知道該如何再去改進這個學習成果,因為那些權重對人類來說根本就沒有什麼直觀的意義,因此也就很難再去改進這個網路了。 38 | 39 | 不過、程式能夠自我學習畢竟是一件很神奇的事情,光是這點就值得讓我們好好的去瞭解一下神經網路到底是怎麼運作的了! 40 | 41 | ### 參考文獻 42 | * [Wikipedia:Neuron](http://en.wikipedia.org/wiki/Neuron) 43 | * [Wikipedia:Artificial neuron](http://en.wikipedia.org/wiki/Artificial_neuron) 44 | * [Wikipedia:Artificial neural network](http://en.wikipedia.org/wiki/Artificial_neural_network) 45 | * [Wikipedia:Perceptron](http://en.wikipedia.org/wiki/Perceptron) 46 | * [Wikipedia:Backpropagation](http://en.wikipedia.org/wiki/Backpropagation) 47 | * [維基百科:感知器](http://zh.wikipedia.org/wiki/%E6%84%9F%E7%9F%A5%E5%99%A8) 48 | * [維基百科:人工神經網路](http://zh.wikipedia.org/wiki/%E4%BA%BA%E5%B7%A5%E7%A5%9E%E7%BB%8F%E7%BD%91%E7%BB%9C) 49 | * [維基百科:赫布理論](http://zh.wikipedia.org/wiki/%E8%B5%AB%E5%B8%83%E7%90%86%E8%AE%BA) 50 | 51 | 【本文由陳鍾誠取材並修改自 [維基百科],採用創作共用的 [姓名標示、相同方式分享] 授權】 52 | 53 | -------------------------------------------------------------------------------- /source/focus1.md0: -------------------------------------------------------------------------------- 1 | ## 神經網路簡介 2 | 3 | 在電腦領域,神經網路是指一種模擬神經系統所設計出來的程式,用來模擬人類視覺、聽覺等等智慧行為的原理,企圖讓電腦可以具有人類智慧的一種方法。 4 | 5 | 下圖是生物神經細胞的結構圖,這個圖看來頗為複雜,如果電腦程式真的要模擬這麼複雜的結構,那程式應該也會非常複雜才對。 6 | 7 | ![圖、神經細胞的結構](../img/NeuralCell.jpg) 8 | 9 | 還好、神經網路程式不需要去模擬「細胞膜、粒線體、核醣體」等等複雜的結構,因為學電腦的人可以透過「抽象化」這個伎倆,將上述的神經細胞結構簡化成下圖 (a) 的樣子。 10 | 11 | 在下圖中,a1 ... an 是輸入,w1 ... wn 是權重,這些輸入乘上權重之後加總(SUM),就會得到神經元的刺激強度,接著經過函數 f() 轉換之後,就得到了輸出的刺激強度。 12 | 13 | ![圖、神經網路連接模型](../img/NeuralNet1.jpg) 14 | 15 | 上圖 (a)所對應的數學公式如下: 16 | 17 | $t=f(\vec{w} \cdot \vec{a}+b)=f(\sum_{i=1}^n (w_i*a_i) + b)$ 18 | 19 | 其中的 b 值是用來作為門檻的閥值,舉例而言,若 b 是 -0.5,那麼就代表要將總合減掉 0.5,才得到輸入刺激強度,這可以用來調節刺激強度,才不會一直增強上去。 20 | 21 | 而上圖 (b) 中的網路,是一種單層的神經網路,所謂單層是不計算輸入節點的計算方式,因此只有圖中的大圈圈才算是一層,其中每個大圈圈都是如圖 (a) 中的一個神經元。 22 | 23 | 最早的神經網路程式稱為感知器(Perceptron),這是由 Frank Rosenblatt 在 1957 年於 Cornell 航空實驗室 (Cornell Aeronautical Laboratory) 所發明的。 24 | 25 | 但是在 1969 年,Marvin Minsky 和 Seymour Papert 在《Perceptrons》書中,仔細分析了知器為的功能及局限,證明感知器不能解決簡單的 XOR 等問題,結果導致神經網路技術經歷了長達 20 年的低潮期。 26 | 27 | 後來在 1986 年,Rumelhart 等人於下列論文中提出「反向傳播」(back-propagation) 演算法,並成功的被運用在語音辨識等領域之後,神經網路才又開始成為熱門的研究主題。 28 | 29 | > Rumelhart, David E.; Hinton, Geoffrey E., Williams, Ronald J. Learning representations by back-propagating errors. Nature. 8 October 1986, 323 (6088): 533–536. 30 | 31 | 事實上、反向傳播的方法,並不是 Rumelhart 等人第一個提出來的,Paul J. Werbos 1974 年在哈佛的博士論文中就提出了類似的方法,只是大家都不知道而已。 32 | 33 | > Paul J. Werbos. Beyond Regression: New Tools for Prediction and Analysis in the Behavioral Sciences. PhD thesis, Harvard University, 1974 34 | 35 | 當然、神經網路再度成為研究焦點之後,各式各樣的方法又被發展出來了,大致上這些方法可以分為兩類,一種稱為「有指導者」的神經網路(Supervised Neural Network) ,像是「感知器與反傳遞演算法」等,另一種稱為「沒有指導者」的神經網路 (Unsupervised Neural Network),像是「霍普菲爾德網路 (Hopfield Network) 與自組織神經網路 (Self Organization network)」等等。 36 | 37 | 當然、神經網路並不是「神奇銀彈」,可以解決人工智慧上的所有問題,神經網路最強大的地方是容錯性很強,而且不需要像專家系統這樣撰寫一堆規則,但是有一得必有一失,神經網路自動學習完成之後,我們根本不知道該如何再去改進這個學習成果,因為那些權重對人類來說根本就沒有什麼直觀的意義,因此也就很難再去改進這個網路了。 38 | 39 | 不過、程式能夠自我學習畢竟是一件很神奇的事情,光是這點就值得讓我們好好的去瞭解一下神經網路到底是怎麼運作的了! 40 | 41 | ### 參考文獻 42 | * [Wikipedia:Neuron](http://en.wikipedia.org/wiki/Neuron) 43 | * [Wikipedia:Artificial neuron](http://en.wikipedia.org/wiki/Artificial_neuron) 44 | * [Wikipedia:Artificial neural network](http://en.wikipedia.org/wiki/Artificial_neural_network) 45 | * [Wikipedia:Perceptron](http://en.wikipedia.org/wiki/Perceptron) 46 | * [Wikipedia:Backpropagation](http://en.wikipedia.org/wiki/Backpropagation) 47 | * [維基百科:感知器](http://zh.wikipedia.org/wiki/%E6%84%9F%E7%9F%A5%E5%99%A8) 48 | * [維基百科:人工神經網路](http://zh.wikipedia.org/wiki/%E4%BA%BA%E5%B7%A5%E7%A5%9E%E7%BB%8F%E7%BD%91%E7%BB%9C) 49 | * [維基百科:赫布理論](http://zh.wikipedia.org/wiki/%E8%B5%AB%E5%B8%83%E7%90%86%E8%AE%BA) 50 | 51 | 【本文由陳鍾誠取材並修改自 [維基百科],採用創作共用的 [姓名標示、相同方式分享] 授權】 52 | 53 | -------------------------------------------------------------------------------- /htm/video1.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 |

程式人雜誌 -- 2014 年 4 月號 (開放公益出版品)

14 |
15 |
16 |
17 | 20 |
21 |

看影片學 Lua 程式設計

22 |

Lua 的語法很簡單,執行環境也很簡單,如果您用的是 Linux,應該從 Lua 官網上下載 建置一下就可以了,以下是官網所提供的建置方法:

23 |
curl -R -O http://www.lua.org/ftp/lua-5.2.3.tar.gz
24 | tar zxf lua-5.2.3.tar.gz
25 | cd lua-5.2.3
26 | make linux test
27 |

如果您用 MS. Windows ,那麼就可以安裝 Lua for Windows,以下是其網址:

28 | 31 |

下載安裝後,您會發現在「開始/所有程式」裏有個 Lua 的資料夾,裏面有「iLua, Lua Command Line, Lua Examples, QuickLuaTour」等項目,建議您看看「QuickLuaTour」,它會帶領你快速的熟悉 Lua 的語法與範例。

32 |

接著您可以直接起動命令列,然後用任何的編輯器,像是「Notepad++」等,開始寫一些簡單的程式,然後直接用 lua <程式名稱> 去執行您的程式即可。以下是筆者執行幾個 Lua 程式的過程:

33 |
D:\Dropbox\Public\pmag\201402\code>lua hello.lua
34 | Hello World!
35 | 
36 | D:\Dropbox\Public\pmag\201402\code>lua fact.lua
37 | factorial(5)=120
38 | 
39 | D:\Dropbox\Public\pmag\201402\code>lua obj.lua
40 | 10,20
41 | 30,40
42 | 50,60
43 | 
44 | D:\Dropbox\Public\pmag\201402\code>lua obj.lua
45 | point(10,20)
46 | point(30,40)
47 | point(50,60)
48 |

您可以以看看下列 Lua 的影片,以便瞭解 Lua 的程式寫法:

49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 |
影片連結
Lua Tutorial #1: Introduction and Setuphttp://youtu.be/dHURyRLMOK0
Lua Tutorial #2: Hello Worldhttp://youtu.be/aSxoOCn6Y4E
Lua Tutorial #3: Variables and User Inputhttp://youtu.be/ClThmOGuMi4
Lua Tutorial #4: Basic Mathematicshttp://youtu.be/jQ40M1DObl4
Lua Tutorial #5: If and Elsehttp://youtu.be/vlJftHgeByg
79 |

當然、多寫多看,應該是學習程式的不二法門。學程式與學習游泳一樣,只有下水開始扭動身體,才有機會真正學會游泳,也只有真正開始上機寫程式,才有可能真正學會寫程式。對於 Lua 、當然也是如此!

80 |
81 | 84 | 85 | 86 | -------------------------------------------------------------------------------- /htm/article3.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 |

程式人雜誌 -- 2014 年 4 月號 (開放公益出版品)

14 |
15 |
16 | 21 |

人工神經網路 (Artificial Neural Network) (作者:Bridan)

22 |

NEURO 這門學問是我工作時才學習得的知識,多年前曾有一篇 洗衣機 貼文提到它,當時第一次知道這東西時,已經從研究所畢業好幾年,書局也沒幾本書可以參考,書中一堆數學式,有看沒有很懂,九O年代網路剛興起,沒甚麼資料可查,正好一位大學同學在大同工學院攻讀博士班主攻語音辨識,NEURO 就是用於學習辨識語音模式的解決方案之一,因此跟主管提出學習計畫,對授課教授表達旁聽的想法,就每周固定時間去大同工學院上課,我不需要學分,所以不用繳學費、不必考試、不必交作業,自備課本上了一個學期的課,這種學習方法在我準備插班大學考試也用過,並認識一些朋友。最近上網查,沒什麼人對 NEURO 議題,提供簡單的實例,以供初學者參考入門,現在將個人所知的做個紀錄分享。

23 |

類神經網路有很多解決方案,這裡使用 BP 方法。首先認識神經元的數學模型,

24 |
25 | 26 |
27 |

MP (MultiLayer Perceptron) 模型公式:

28 |

一、先計算內部數值

29 |

Ui = Σ Wji Xj – θi

30 |

Wji = 連結強度

31 |

Xj = 神經元 j 所傳來之訊號

32 |

θi = 神經元 i 之閥值

33 |

二、計算輸出數值

34 |

Yi = f(Ui) = Yi 處理單元函數

35 |

f = 轉換函數,通常為階梯函數(Step function)

36 |

例如 Yi = 1 / (1 + exp(-Ui))

37 |

三、δ差距量 ,用來修正權重

38 |

{T}目標輸出量

39 |

{Y}推論輸出量

40 |

差距量 = 目標輸出量 – 推論輸出量 = δi = Ti – Yi

41 |

本文範例採取的修正算式 δi = Yi‧(1 - Yi)‧(Ti – Yi)

42 |

四、計算輸出閥值及權重變量

43 |

η:學習速率,控制權重修正幅度

44 |

輸出單元閥值改變量 = △θi = - η‧δi

45 |

權重改變量 = △Wji = Xj‧η‧δi

46 |

五、修正下一輪閥值及權重

47 |

θi = θi + △θi

48 |

Wji = Wji + △Wji

49 |

六、檢驗成果

50 |

總錯誤率 = 誤分類案例總數/範例總數

51 |

依問題的複雜層度,利用它組合一知識神經網路,基本上有三大層-輸入層、隱藏層及輸出層。

52 |
53 | 54 |
55 |

最後整理一個 試算表 提供有興趣的朋友參考,以 XOR 邏輯為例,X1, X2 為輸入,Y為輸出,用 #3, #4, #5 三個神經元學習,H3, H4 是隱藏層(夾在輸入及輸出之間),簡單的問題一個隱藏層就夠,複雜的可能需要兩層。使用四種組合狀態重複訓練,最後它會穩定判別輸入,並給予適合的答案。

56 |

遞迴或遞歸 (Recursion) 這樣技術,可將非線性數學問題收斂求解, 能處理類似邏輯型式的問題 ,供大家參考。

57 |

(本文來自「研發養成所」 Bridan 的網誌,原文網址為 http://4rdp.blogspot.tw/2013/10/artificial-neural-network.html ,由陳鍾誠編輯後納入程式人雜誌)

58 |
59 | 62 | 63 | 64 | -------------------------------------------------------------------------------- /source/article1.md: -------------------------------------------------------------------------------- 1 | ## Arduino入門教學(16) – Amarino 的 SpeakToArduino 範例程式 (作者:Cooper Maa) 2 | 3 | 這篇是寫給 amarino 初學者看的,目的是教導你如何執行 Amarino 的 SpeakToArduino 範例程式。SpeakToArduino 這個範例示範如何用 Android 手機聲控 Arduino。 4 | 5 | ### 所需材料 6 | 7 | * Android 手機一支 8 | * Arduino x1 9 | * bluetooth module x 1 10 | * 紅色 LED, 綠色 LED 及藍色 LED 各一顆(若無特定顏色 LED,可用其它顏色的 LED 取代),或一顆 RGB Led 11 | * 220 歐姆電阻 x 3 12 | 13 | ### Step 1:安裝 Amarino 14 | 15 | 到 下載下列 App 並安裝到 Android 手機上: 16 | 17 | 1) [Amarino](http://code.google.com/p/amarino/downloads/detail?name=Amarino_2_v0_55.apk&can=2&q=) 18 | 19 | 2) [Amarino Plug-in Bundle](http://code.google.com/p/amarino/downloads/detail?name=AmarinoPluginBundle.apk&can=2&q=) 20 | 21 | 3) [SpeakToArduino](http://code.google.com/p/amarino-examples/downloads/detail?name=SpeakToArduino.apk&can=2&q=#makechanges) 22 | 23 | ### Step 2: 安裝 Arduino IDE 與 MeetAndroid Library 24 | 25 | 如果你電腦上還沒有 Arduino IDE,請先到 下載軟體,下載後解壓縮即可。 26 | 27 | 接著下載 [MeetAndroid Library](http://code.google.com/p/amarino/downloads/detail?name=MeetAndroid_4.zip&can=2&q=),把 MeetAndroid 解到 Arduino IDE 安裝目錄下的 libraries 資料夾。 28 | 29 | 重新啟動 Arduino IDE,在 Sketch > Import Library 底下應該會看到 MeetAndroid,如下圖: 30 | 31 | ![](../img/image_thumb4222.png) 32 | 33 | ### Step 3:連接 LED 34 | 35 | 參考下圖,把紅、綠、藍三顆 LED 分別接到 pin 9, 10, 11,LED 的接法為: 長腳(陽極)接到 pin 腳,而短腳(陰極)串接一顆 220 ohm 電阻接到 GND: 36 | 37 | ![](../img/image_thumb62.png) 38 | 39 | ### Step 4: 上傳 SpeakToArduino 程式 40 | 41 | 到這裏下載,並使用 Arduino IDE 打開 SpeakToArduino 程式。 42 | 43 | 程式所用的 baud rate 預設是 57600 bps,如果你的藍芽模組不是 57600 bps,請做適當的調整: 44 | 45 | ![](../img/image_thumb3.png) 46 | 47 | 然後把程式上傳到 Arduino 板子上。 48 | 49 | ### Step 5:連接藍芽模組 50 | 51 | 我用的是 [廣州匯承信息科技](http://www.wavesen.com/) 的 HC-0x 系列藍芽模組,下圖是 HC-0x 藍芽模組的外觀: 52 | 53 | ![▲ HC-0x 藍芽模組 (圖左:正面圖,圖右:背面圖)](../img/SpeakToArduinoDevice1.jpg) 54 | 55 | 56 | 連接方法很簡單,照下表把 Arduino 和藍芽模組連接起來就好: 57 | 58 | Arduino 藍芽模組 備註 59 | -------- ------------- --------------------- 60 | 5V VCC 注意電源不可接錯 61 | GND GND 注意電源不可接錯 62 | RXD TXD 63 | TXD RXD 64 | 65 | ![](../img/image_thumb132222.png) 66 | 67 | 有兩點要注意:第一是電源千萬不可接錯,不然可能會燒壞藍芽模組,第二是 Arduino 的 RXD 要接藍芽模組的 TXD,而 Arduino 的 TXD 要接藍芽模組的 RXD。 68 | 69 | 通電之後,藍芽模組上的 LED 會一直閃爍: 70 | 71 | ![](../img/image_thumb13322222.png) 72 | 73 | ### Step 6:執行 SpeakToArduino App 74 | 75 | 首先,先利用 Amarino 搜尋藍芽設備,找到設備後,將藍芽設備的 MAC Address 抄起來(記得不要在 Amarino 設定任何 Event!): 76 | 77 | ![](../img/image_thumb14325.png) 78 | 79 | 打開 Android 手機上的 SpeakToArduino App,你會看到這樣的畫面: 80 | 81 | ![](../img/image_thumb7.png) 82 | 83 | 選手機 Menu 鍵 Set BT Device Address,手機會跳出這個畫面,此時請輸入剛剛抄下來的 MAC Address,然後按下【Save】鈕: 84 | 85 | ![](../img/image_thumb5.png) 86 | 87 | 按一下手機 Back 鍵退出 SpeakToArduino App,然後重新啟動 SpeakToArduino,這樣 App 才會用新的 Mac Adress 跟藍芽模組連線。 88 | 89 | 如果一切順利,Android 手機就會跟 Arduino 建立連線,並且呈現如下圖的畫面(注意手機上方的 Status bar,若有成功與 Arduino 連線,status bar 上會顯示 Active connection: … 的訊息): 90 | 91 | ![](../img/image_thumb11.png) 92 | 93 | 按下【Click and order your color】鈕,手機會跳出語音辨識的畫面: 94 | 95 | ![](../img/image_thumb15.png) 96 | 97 | 這時便可以說出想要的顏色,例如 red, green, blue, white, pink, orange, yellow, dark 或 off,這時候 Arduino 上三顆 LED 便會同步改變亮度。比如當我說 red,這時 Android 手機就會叫 Arduino 把紅色 LED 打開: 98 | 99 | ![](../img/image_thumb13.png) 100 | 101 | 如果你有 RGB Led,可以用一顆 RGB Led 取代三顆 Led,這樣更可以呈現 LED 顏色變化的效果。 102 | 103 | ### 參考資料 104 | * [Getting Started with Amarino 簡報](http://coopermaa2nd.blogspot.tw/2012/07/getting-started-with-amarino.html) 105 | * [以 Amarino 連接 Android 與 Arduino](http://coopermaa2nd.blogspot.tw/2012/06/amarino-android-arduino.html) 106 | * [MultiColorLamp](http://coopermaa2nd.blogspot.tw/2012/06/multicolorlamp.html) 107 | * [SensorGraph](http://coopermaa2nd.blogspot.tw/2012/06/sensorgraph.html) 108 | 109 | 【本文作者為馬萬圳,原文網址為: ,由陳鍾誠編輯後納入本雜誌】 110 | 111 | -------------------------------------------------------------------------------- /htm/home.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 |

程式人雜誌 -- 2014 年 4 月號 (開放公益出版品)

14 |
15 |
16 |

關於程式人雜誌

17 |

程式人雜誌是一個結合「開放原始碼與公益捐款活動」的雜誌,簡稱「開放公益雜誌」。開放公益雜誌本著「讀書做善事、寫書做公益」的精神,我們非常歡迎程式人認養專欄、或者捐出您的網誌。

18 |

雜誌下載

19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 |
出刊年月epubipad:PDFA4:PDF單頁 HTM原始碼全部下載
2014年4月epubipad.pdfA4.pdfpmag.htmlcode.zipgithub
43 |

本期內容 (焦點:神經網路)

44 | 67 |

雜誌取得

68 |

程式人雜誌預定於每個月 1 日出刊,您可以從下列網址取得程式人雜誌的所有內容 (包含當月最新出刊的雜誌)。

69 | 72 |

連絡我們

73 |

竭誠歡迎程式人投稿,或者成為本雜誌的專欄作家,現在就可以加入 程式人雜誌社團 一同共襄盛舉。

74 |

本雜誌編輯為「陳鍾誠 (@ccckmit)」,若要聯絡編輯,請寄信到

80 |
81 | 84 | 85 | 86 | -------------------------------------------------------------------------------- /source/article2.md: -------------------------------------------------------------------------------- 1 | ## OpenNI 2 的錯誤處理 (作者: Heresy Ku ) 2 | 3 | 在上一篇的 [《OpenNI 2 基本程式範例》](http://kheresy.wordpress.com/2012/12/24/openni2-basic-example/) 裡,Heresy 基本上是先整理了一下,要使用 Visual Studio 來進行 OpenNI 2 的程式開發的話,要怎樣進專案的設定,另外也用一個最簡單的例子,來說明 OpenNI 2 的程式要怎麼寫。而這一篇,則是再繼續做補充,讓程式更完整。 4 | 5 | 在上一個範例裡面,Heresy 為了版面、以及簡化程式碼的關係,是假設程式執行都沒有問題,所以把所有錯誤的檢查都拿掉了。不過實際上,程式在執行的時候,其實都是應該要考慮到各種錯誤狀況的!而 OpenNI 2 也有提供一些簡單的介面,可以用來檢查程式執行時,有沒有錯誤。 6 | 7 | 首先,和 OpenNI 1.x 的時候,OpenNI 大部分的函式,都會回傳一個代表結果的值,讓開發者可以據此判斷該函式是否已正確執行;而在 OpenNI 2,這個回傳的結果,是一個叫做 openni::Status 的列舉型別。基本的使用狀況,大致上如下: 8 | 9 | ```CPP 10 | openni::Status eRes = openni::OpenNI::initialize(); 11 | if( eRes != openni::STATUS_OK ) 12 | { 13 | std::cerr << openni::OpenNI::getExtendedError() << std::endl; 14 | return -1; 15 | } 16 | ``` 17 | 18 | 如果函式有正確執行的話,所得到的回傳值會是 openni::STATUS_OK;反過來說,只要回傳值不是 STATUS_OK, 就代表函式執行是有問題的。 19 | 20 | 而基本上 openni::Status 已經定義的一些常見的錯誤狀況,可以用來做進一步處理的判斷。不過如果是想要得到文字性的錯誤說明的話,也可以透過 openni::OpenNI::getExtendedErropr() 這個函式,來取得更完整的錯誤說明文字。不過要注意的是,他取得的會是最後一筆錯誤資訊,如果之後又有呼叫其他函式的話,可能會影響到它的內容。(不過他是 thread-safe 的) 21 | 而如果把之前的範例,全部都加上錯誤檢查的話,則會變成類似這樣子: 22 | 23 | ```cpp 24 | // STL Header 25 | #include 26 | 27 | // 1. include OpenNI Header 28 | #include "OpenNI.h" 29 | 30 | // using namespace 31 | using namespace std; 32 | using namespace openni; 33 | 34 | int main( int argc, char** argv ) 35 | { 36 | // 2. initialize OpenNI 37 | if( OpenNI::initialize() == STATUS_OK ) 38 | { 39 | // 3. open a device 40 | Device devAnyDevice; 41 | if( devAnyDevice.open( ANY_DEVICE ) == STATUS_OK ) 42 | { 43 | // 4. create depth stream 44 | VideoStream streamDepth; 45 | if( streamDepth.create( devAnyDevice, SENSOR_DEPTH ) == STATUS_OK ) 46 | { 47 | if( streamDepth.start() == STATUS_OK ) 48 | { 49 | // 5 main loop, continue read 50 | VideoFrameRef frameDepth; 51 | for( int i = 0; i < 100; ++ i ) 52 | { 53 | // 5.1 get frame 54 | if( streamDepth.readFrame( &frameDepth ) == STATUS_OK ) 55 | { 56 | // 5.2 get data array 57 | const DepthPixel* pDepth = (const DepthPixel*)frameDepth.getData(); 58 | 59 | // 5.3 output the depth value of center point 60 | int idx = frameDepth.getWidth()*(frameDepth.getHeight()+1)/2; 61 | cout << pDepth[idx] << endl; 62 | } 63 | else 64 | { 65 | cerr << "Can not read frame\n"; 66 | cerr << OpenNI::getExtendedError() << endl; 67 | } 68 | } 69 | } 70 | else 71 | { 72 | cerr << "Can not start depth stream\n"; 73 | cerr << OpenNI::getExtendedError() << endl; 74 | } 75 | 76 | streamDepth.destroy(); 77 | } 78 | else 79 | { 80 | cerr << "Can not create depth stream\n"; 81 | cerr << OpenNI::getExtendedError() << endl; 82 | } 83 | 84 | devAnyDevice.close(); 85 | } 86 | else 87 | { 88 | cerr << "Can not open device\n"; 89 | cerr << OpenNI::getExtendedError() << endl; 90 | } 91 | 92 | // 7. shutdown 93 | OpenNI::shutdown(); 94 | } 95 | else 96 | { 97 | cerr << "OpenNI initialize error\n"; 98 | cerr << OpenNI::getExtendedError() << endl; 99 | } 100 | 101 | return 0; 102 | } 103 | ``` 104 | 105 | 這裡比較不一樣的是,Heresy 在前面有加上 using namespace openni;, 指定去使用 openni 這個 namespace,所以之後的程式,都可以把 namespace 省略掉;如此一來,程式寫起來會再簡短一點。 106 | 當然,上面的寫法也不是唯一的錯誤檢查的方法。像在官方範例「SimpleRead」裡面,採用的就是另一種程式風格的流程,有興趣的也可以看看。要採用哪種,基本上就是看人習慣了~只是另外也要提一下,理論上在出現錯誤時,main() 應該也要回傳非 0 的錯誤代碼的,Heresy 這邊沒有特別去處理這一塊就是了。 107 | 108 | 不過…既然都是 C++ 的 API 了,沒有採用 exception(參考)來做處理…Heresy 個人是覺得有點可惜啊…總覺得以各方面來說,OpenNI 的開發團隊,似乎對 C++ 不是很熟悉?雖然 OpenNI 1.x 和 OpenNI 2 都提供了 C++ 的 API,但是實際上,很多介面設計的方式,都還是用 C 的形式來做的…還是其實是有其他考量?所以甚至連陣列都是另外寫一個自己的版本(openni::Array),而沒有直接採用 STL 的版本(也沒有 iterator 可以用)… 109 | 110 | 【本文來自 Heresy's Space 的網誌,原文網址為: ,由 Heresy 捐出網誌給程式人雜誌,經陳鍾誠編輯後納入雜誌】 111 | -------------------------------------------------------------------------------- /source/article4.md: -------------------------------------------------------------------------------- 1 | ## Visual Basic 6.0:利用遞迴與程序導向解 N Queens Puzzle 皇后問題 (作者:廖憲得 0xde) 2 | 3 | 什麼是 N Queens Puzzle 皇后問題問題?  4 | 通常我們都會用 8 皇后來稱呼它,但將 8 改成動態數字 n,則稱為 n 皇后 5 | 6 | 什麼是 8 Queens Puzzle 皇后問題問題?  7 | 8 | 那麼 8 皇后問題又是什麼呢? 9 | 10 | > 八皇后問題是一個以西洋棋為背景的問題:如何能夠在8×8的西洋棋棋盤上放置八個皇后,使得任何一個皇后都無法直接吃掉其他的皇后? 11 | > 為了達到此目的,任兩個皇后都不能處於同一條橫行、縱行或斜線上。 12 | > 八皇后問題可以推廣為更一般的n皇后擺放問題 :這時棋盤的大小變為n × n ,而皇后個數也變成n 。 若且唯若 n = 1或n ≥ 4時問題有解[1] 。 13 | 14 | * 維基百科: 15 | 16 | ![5 皇后總共有 10 組解](../img/queen5.JPG) 17 | 18 | ![8 皇后總共有 92 組解](../img/queen8.JPG) 19 | 20 | ``` 21 | 【1皇后】共1組解 22 | 【2皇后】共0組解 23 | 【3皇后】共0組解 24 | 【4皇后】共2組解 25 | 【5皇后】共10組解 26 | 【6皇后】共4組解 27 | 【7皇后】共40組解 28 | 【8皇后】共92組解 29 | 【9皇后】共352組解 30 | 【10皇后】共724組解 31 | 【11皇后】共2680組解 32 | 【12皇后】共14200組解 33 | 【13皇后】共73712組解 34 | 【14皇后】共365596組解 35 | 【15皇后】共2279184組解 36 | 【16皇后】共14772512組解 37 | ``` 38 | 39 | 通常跑超過 10 皇后就需要等待不少時間了! 40 | 41 | 如何使用遞迴與程序導向去實作呢? 42 | 43 | ```monobasic 44 | Dim QueenXY() ' 棋盤 45 | Dim TempQueenXY(9999) ' 暫存的棋盤 46 | Dim TempNumber ' 數量 47 | Dim QueenNumber ' 正解總數 48 | Private Sub Form_Activate() 49 | Queen = 9 ' 皇后數 50 | 51 | ReDim QueenXY(Queen - 1, Queen - 1) ' 配置棋盤 52 | 53 | For I = 0 To Queen - 1 54 | For J = 0 To Queen - 1 55 | QueenXY(I, J) = 0 56 | Next J 57 | Next I 58 | 59 | QueenNumber = 0 60 | List1.Clear 61 | 62 | For I = 0 To UBound(QueenXY) 63 | Call InputQueen(I, 0) 64 | Next I 65 | 66 | MsgBox "總解有 => " & QueenNumber & " 組" 67 | End Sub 68 | 69 | 70 | Function InputQueen(X, Y) ' 放置皇后 71 | If X >= 0 And X <= UBound(QueenXY) And Y >= 0 And Y <= UBound(QueenXY) Then ' 判斷棋盤是否超過 72 | 73 | If QueenXY(X, Y) = 0 Then ' 判斷是否為可放 (是否被殺) 74 | 75 | 76 | 77 | BackupTemp ' Step 備份目前棋盤狀 78 | Call KillQueen(X, Y) ' 建立被殺 79 | For I = 0 To UBound(QueenXY) ' 放下一個 80 | Call InputQueen(I, Y + 1) 81 | Next I 82 | If Y = UBound(QueenXY) Then 83 | QueenNumber = QueenNumber + 1 84 | 85 | 86 | Temp = "" 87 | List1.AddItem "第 " & QueenNumber & " 組答案為:" 88 | For I = 0 To UBound(QueenXY) 89 | For J = 0 To UBound(QueenXY) 90 | Temp = Temp & QueenXY(I, J) & " " 91 | Next J 92 | List1.AddItem Temp 93 | Temp = "" 94 | Next I 95 | List1.AddItem "" 96 | 97 | End If 98 | 99 | Reductive ' 還原 100 | End If 101 | End If 102 | End Function 103 | 104 | Function KillQueen(KX, KY) ' 跟自己八方被殺 105 | 106 | QueenXY(KX, KY) = "Q" 107 | 108 | For I = 0 To UBound(QueenXY) 109 | For J = 0 To UBound(QueenXY) 110 | If I = KX And J = KY Then 111 | Else 112 | If I = KX Or J = KY Then QueenXY(I, J) = 1 ' 四面 113 | 114 | If (J - KY) <> 0 And (I - KX) <> 0 Then ' 不為 0 (自己) 115 | If Abs((J - KY) / (I - KX)) = 1 Then QueenXY(I, J) = 1 ' 八方 (斜率絕對值 = 1) 116 | End If 117 | End If 118 | Next J 119 | Next I 120 | 121 | End Function 122 | 123 | Function BackupTemp() ' 備份 124 | Temp = "" 125 | For I = 0 To UBound(QueenXY) 126 | For J = 0 To UBound(QueenXY) 127 | Temp = Temp & QueenXY(I, J) & "," 128 | Next J 129 | Next I 130 | 131 | TempQueenXY(TempNumber) = Temp 132 | TempNumber = TempNumber + 1 133 | End Function 134 | 135 | Function Reductive() ' 還原 136 | Temp = Split(TempQueenXY(TempNumber - 1), ",") 137 | TempI = 0 138 | For I = 0 To UBound(QueenXY) 139 | For J = 0 To UBound(QueenXY) 140 | QueenXY(I, J) = Temp(TempI) 141 | TempI = TempI + 1 142 | Next J 143 | Next I 144 | 145 | TempNumber = TempNumber - 1 146 | End Function 147 | 148 | ``` 149 | 150 | * 原始碼下載: [N皇后(N Queen).rar](http://files.dotblogs.com.tw/0xde/1311/2013111193556893.rar) 151 | 152 | 【本文作者為「廖憲得」,原文網址為: ,由陳鍾誠編輯後納入本雜誌】 153 | -------------------------------------------------------------------------------- /htm/focus1.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 |

程式人雜誌 -- 2014 年 4 月號 (開放公益出版品)

14 |
15 |
16 |
17 | 20 |
21 |

神經網路簡介

22 |

在電腦領域,神經網路是指一種模擬神經系統所設計出來的程式,用來模擬人類視覺、聽覺等等智慧行為的原理,企圖讓電腦可以具有人類智慧的一種方法。

23 |

下圖是生物神經細胞的結構圖,這個圖看來頗為複雜,如果電腦程式真的要模擬這麼複雜的結構,那程式應該也會非常複雜才對。

24 |
25 | 圖、神經細胞的結構

圖、神經細胞的結構

26 |
27 |

還好、神經網路程式不需要去模擬「細胞膜、粒線體、核醣體」等等複雜的結構,因為學電腦的人可以透過「抽象化」這個伎倆,將上述的神經細胞結構簡化成下圖 (a) 的樣子。

28 |

在下圖中,a1 ... an 是輸入,w1 ... wn 是權重,這些輸入乘上權重之後加總(SUM),就會得到神經元的刺激強度,接著經過函數 f() 轉換之後,就得到了輸出的刺激強度。

29 |
30 | 圖、神經網路連接模型

圖、神經網路連接模型

31 |
32 |

上圖 (a)所對應的數學公式如下:

33 |
34 | 35 |
36 |

其中的 b 值是用來作為門檻的閥值,舉例而言,若 b 是 -0.5,那麼就代表要將總合減掉 0.5,才得到輸入刺激強度,這可以用來調節刺激強度,才不會一直增強上去。

37 |

而上圖 (b) 中的網路,是一種單層的神經網路,所謂單層是不計算輸入節點的計算方式,因此只有圖中的大圈圈才算是一層,其中每個大圈圈都是如圖 (a) 中的一個神經元。

38 |

最早的神經網路程式稱為感知器(Perceptron),這是由 Frank Rosenblatt 在 1957 年於 Cornell 航空實驗室 (Cornell Aeronautical Laboratory) 所發明的。

39 |

但是在 1969 年,Marvin Minsky 和 Seymour Papert 在《Perceptrons》書中,仔細分析了知器為的功能及局限,證明感知器不能解決簡單的 XOR 等問題,結果導致神經網路技術經歷了長達 20 年的低潮期。

40 |

後來在 1986 年,Rumelhart 等人於下列論文中提出「反向傳播」(back-propagation) 演算法,並成功的被運用在語音辨識等領域之後,神經網路才又開始成為熱門的研究主題。

41 |
42 |

Rumelhart, David E.; Hinton, Geoffrey E., Williams, Ronald J. Learning representations by back-propagating errors. Nature. 8 October 1986, 323 (6088): 533–536.

43 |
44 |

事實上、反向傳播的方法,並不是 Rumelhart 等人第一個提出來的,Paul J. Werbos 1974 年在哈佛的博士論文中就提出了類似的方法,只是大家都不知道而已。

45 |
46 |

Paul J. Werbos. Beyond Regression: New Tools for Prediction and Analysis in the Behavioral Sciences. PhD thesis, Harvard University, 1974

47 |
48 |

當然、神經網路再度成為研究焦點之後,各式各樣的方法又被發展出來了,大致上這些方法可以分為兩類,一種稱為「有指導者」的神經網路(Supervised Neural Network) ,像是「感知器與反傳遞演算法」等,另一種稱為「沒有指導者」的神經網路 (Unsupervised Neural Network),像是「霍普菲爾德網路 (Hopfield Network) 與自組織神經網路 (Self Organization network)」等等。

49 |

當然、神經網路並不是「神奇銀彈」,可以解決人工智慧上的所有問題,神經網路最強大的地方是容錯性很強,而且不需要像專家系統這樣撰寫一堆規則,但是有一得必有一失,神經網路自動學習完成之後,我們根本不知道該如何再去改進這個學習成果,因為那些權重對人類來說根本就沒有什麼直觀的意義,因此也就很難再去改進這個網路了。

50 |

不過、程式能夠自我學習畢竟是一件很神奇的事情,光是這點就值得讓我們好好的去瞭解一下神經網路到底是怎麼運作的了!

51 |

參考文獻

52 | 62 |

【本文由陳鍾誠取材並修改自 維基百科,採用創作共用的 姓名標示、相同方式分享 授權】

63 |
64 | 67 | 68 | 69 | -------------------------------------------------------------------------------- /htm/info.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 |

程式人雜誌 -- 2014 年 4 月號 (開放公益出版品)

14 |
15 |
16 |
17 | 25 |
26 |

雜誌訊息

27 |

讀者訂閱

28 |

程式人雜誌是一個結合「開放原始碼與公益捐款活動」的雜誌,簡稱「開放公益雜誌」。開放公益雜誌本著「讀書做善事、寫書做公益」的精神,我們非常歡迎程式人認養專欄、或者捐出您的網誌,如果您願意成為本雜誌的專欄作家,請加入 程式人雜誌社團 一同共襄盛舉。

29 |

我們透過發行這本雜誌,希望讓大家可以讀到想讀的書,學到想學的技術,同時也讓寫作的朋友的作品能產生良好價值 – 那就是讓讀者根據雜誌的價值捐款給慈善團體。 讀雜誌做公益也不需要有壓力,您不需要每讀一本就急著去捐款,您可以讀了十本再捐,或者使用固定的月捐款方式,當成是雜誌訂閱費,或者是季捐款、一年捐一次等都 OK ! 甚至是單純當個讀者我們也都很歡迎!

30 |

本雜誌每期參考價:NT 50 元,如果您喜歡本雜誌,請將書款捐贈公益團體。例如可捐贈給「羅慧夫顱顏基金會 彰化銀行(009) 帳號:5234-01-41778-800」。(若匯款要加註可用「程式人雜誌」五個字)

31 |

投稿須知

32 |

給專欄寫作者: 做公益不需要有壓力。如果您願意撰寫專欄,您可以輕鬆的寫,如果當月的稿件出不來,我們會安排其他稿件上場。

33 |

給網誌捐贈者: 如果您沒時間寫專欄或投稿,沒關係,只要將您的網誌以 [創作共用的「姓名標示、非商業性、相同方式分享」授權] 並通知我們,我們會自動從中選取需要的文章進行編輯,放入適當的雜誌當中出刊。

34 |

給文章投稿者: 程式人雜誌非常歡迎您加入作者的行列,如果您想撰寫任何文章或投稿,請用 markdown 或 LibreOffice 編輯好您的稿件,並於每個月 25 日前投稿到程式人雜誌社團 的檔案區,我們會盡可能將稿件編入隔月1號出版程式人雜誌當中,也歡迎您到社團中與我們一同討論。

35 |

如果您要投稿給程式人雜誌,我們最希望的格式是採用 markdown 的格式撰寫,然後將所有檔按壓縮為 zip 上傳到社團檔案區給我們, 如您想學習 markdown 的撰寫出版方式,可以參考 看影片學 markdown 編輯出版流程 一文。

36 |

如果您無法採用 markdown 的方式撰寫,也可以直接給我們您的稿件,像是 MS. Word 的 doc 檔或 LibreOffice 的 odt 檔都可以,我們 會將這些稿件改寫為 markdown 之後編入雜誌當中。

37 |

參與編輯

38 |

您也可以擔任程式人雜誌的編輯,甚至創造一個全新的公益雜誌,我們誠摯的邀請您加入「開放公益出版」的行列,如果您想擔任編輯或創造新雜誌,也歡迎到 程式人雜誌社團 來與我們討論相關事宜。

39 |

公益資訊

40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 62 | 63 | 64 | 65 | 66 | 67 | 73 | 74 | 75 | 76 | 77 |
公益團體聯絡資訊服務對象捐款帳號
財團法人羅慧夫顱顏基金會http://www.nncf.org/

02-27190408分機 232
顱顏患者 (如唇顎裂、小耳症或其他罕見顱顏缺陷)銀行:009彰化銀行民生分行
帳號:5234-01-41778-800
社團法人台灣省兒童少年成長協會http://www.cyga.org/

04-23058005
單親、隔代教養.弱勢及一般家庭之兒童青少年銀行:新光銀行
戶名:台灣省兒童少年成長協會
帳號:103-0912-10-000212-0
78 |
79 | 82 | 83 | 84 | -------------------------------------------------------------------------------- /code/neural/backprop.py: -------------------------------------------------------------------------------- 1 | # Back-Propagation Neural Networks 2 | # 3 | # Written in Python. See http://www.python.org/ 4 | # Placed in the public domain. 5 | # Neil Schemenauer 6 | 7 | import math 8 | import random 9 | import string 10 | 11 | random.seed(0) 12 | 13 | # calculate a random number where: a <= rand < b 14 | def rand(a, b): 15 | return (b-a)*random.random() + a 16 | 17 | # Make a matrix (we could use NumPy to speed this up) 18 | def makeMatrix(I, J, fill=0.0): 19 | m = [] 20 | for i in range(I): 21 | m.append([fill]*J) 22 | return m 23 | 24 | # our sigmoid function, tanh is a little nicer than the standard 1/(1+e^-x) 25 | def sigmoid(x): 26 | return 1.0/(1.0+2.71828**(-x)) 27 | #return math.tanh(x) 28 | 29 | # derivative of our sigmoid function, in terms of the output (i.e. y) 30 | def dsigmoid(y): 31 | return y*(1.0-y) 32 | #return 1.0 - y**2 33 | 34 | class NN: 35 | def __init__(self, ni, nh, no): 36 | # number of input, hidden, and output nodes 37 | self.ni = ni + 1 # +1 for bias node 38 | self.nh = nh 39 | self.no = no 40 | 41 | # activations for nodes 42 | self.ai = [1.0]*self.ni 43 | self.ah = [1.0]*self.nh 44 | self.ao = [1.0]*self.no 45 | 46 | # create weights 47 | self.wi = makeMatrix(self.ni, self.nh) 48 | self.wo = makeMatrix(self.nh, self.no) 49 | # set them to random vaules 50 | for i in range(self.ni): 51 | for j in range(self.nh): 52 | self.wi[i][j] = rand(-0.2, 0.2) 53 | for j in range(self.nh): 54 | for k in range(self.no): 55 | self.wo[j][k] = rand(-2.0, 2.0) 56 | 57 | # last change in weights for momentum 58 | self.ci = makeMatrix(self.ni, self.nh) 59 | self.co = makeMatrix(self.nh, self.no) 60 | 61 | def update(self, inputs): 62 | if len(inputs) != self.ni-1: 63 | raise ValueError('wrong number of inputs') 64 | 65 | # input activations 66 | for i in range(self.ni-1): 67 | #self.ai[i] = sigmoid(inputs[i]) 68 | self.ai[i] = inputs[i] 69 | 70 | # hidden activations 71 | for j in range(self.nh): 72 | sum = 0.0 73 | for i in range(self.ni): 74 | sum = sum + self.ai[i] * self.wi[i][j] 75 | self.ah[j] = sigmoid(sum) 76 | 77 | # output activations 78 | for k in range(self.no): 79 | sum = 0.0 80 | for j in range(self.nh): 81 | sum = sum + self.ah[j] * self.wo[j][k] 82 | self.ao[k] = sigmoid(sum) 83 | 84 | return self.ao[:] 85 | 86 | 87 | def backPropagate(self, targets, N, M): 88 | if len(targets) != self.no: 89 | raise ValueError('wrong number of target values') 90 | 91 | # calculate error terms for output 92 | output_deltas = [0.0] * self.no 93 | for k in range(self.no): 94 | error = targets[k]-self.ao[k] 95 | output_deltas[k] = dsigmoid(self.ao[k]) * error 96 | 97 | # calculate error terms for hidden 98 | hidden_deltas = [0.0] * self.nh 99 | for j in range(self.nh): 100 | error = 0.0 101 | for k in range(self.no): 102 | error = error + output_deltas[k]*self.wo[j][k] 103 | hidden_deltas[j] = dsigmoid(self.ah[j]) * error 104 | 105 | # update output weights 106 | for j in range(self.nh): 107 | for k in range(self.no): 108 | change = output_deltas[k]*self.ah[j] 109 | self.wo[j][k] = self.wo[j][k] + N*change + M*self.co[j][k] 110 | self.co[j][k] = change 111 | #print N*change, M*self.co[j][k] 112 | 113 | # update input weights 114 | for i in range(self.ni): 115 | for j in range(self.nh): 116 | change = hidden_deltas[j]*self.ai[i] 117 | self.wi[i][j] = self.wi[i][j] + N*change + M*self.ci[i][j] 118 | self.ci[i][j] = change 119 | 120 | # calculate error 121 | error = 0.0 122 | for k in range(len(targets)): 123 | error = error + 0.5*(targets[k]-self.ao[k])**2 124 | return error 125 | 126 | 127 | def test(self, patterns): 128 | for p in patterns: 129 | print(p[0], '->', self.update(p[0])) 130 | 131 | def weights(self): 132 | print('Input weights:') 133 | for i in range(self.ni): 134 | print(self.wi[i]) 135 | print() 136 | print('Output weights:') 137 | for j in range(self.nh): 138 | print(self.wo[j]) 139 | 140 | def train(self, patterns, iterations=1000, N=0.5, M=0.1): 141 | # N: learning rate 142 | # M: momentum factor 143 | for i in range(iterations): 144 | error = 0.0 145 | for p in patterns: 146 | inputs = p[0] 147 | targets = p[1] 148 | self.update(inputs) 149 | error = error + self.backPropagate(targets, N, M) 150 | if i % 100 == 0: 151 | print('error %-.5f' % error) 152 | 153 | 154 | def demo(): 155 | # Teach network XOR function 156 | pat = [ 157 | [[0,0], [0]], 158 | [[0,1], [1]], 159 | [[1,0], [1]], 160 | [[1,1], [0]] 161 | ] 162 | 163 | # create a network with two input, two hidden, and one output nodes 164 | n = NN(2, 2, 1) 165 | # train it with some patterns 166 | n.train(pat) 167 | # test it 168 | n.test(pat) 169 | 170 | 171 | 172 | if __name__ == '__main__': 173 | demo() -------------------------------------------------------------------------------- /css/pmag_bak.css: -------------------------------------------------------------------------------- 1 | html, body, div, span, applet, object, iframe, 2 | p, blockquote, pre, 3 | a, abbr, acronym, address, big, cite, code, 4 | del, dfn, em, img, ins, kbd, q, s, samp, 5 | small, strike, strong, sub, sup, tt, var, 6 | b, u, i, center, 7 | dl, dt, dd, 8 | fieldset, form, label, legend, 9 | table, caption, tbody, tfoot, thead, tr, th, td, 10 | article, aside, canvas, details, embed, 11 | figure, figcaption, footer, header, hgroup, 12 | menu, nav, output, ruby, section, summary, 13 | time, mark, audio, video { 14 | margin: 0; 15 | padding: 0; 16 | border: 0; 17 | font: inherit; 18 | vertical-align: baseline; 19 | line-height:160%; 20 | } 21 | 22 | #cover-image { 23 | width:100%; 24 | } 25 | 26 | div>ol.toc { 27 | list-style-type:disc; 28 | } 29 | 30 | ol.toc { 31 | list-style-type:circle; 32 | } 33 | 34 | blockquote { 35 | margin: 10px; 36 | padding-left: 10px; 37 | padding-right: 10px; 38 | padding-top: 1px; 39 | padding-bottom: 1px; 40 | border: 3px double #373737; 41 | color:#333333; 42 | } 43 | 44 | h1, h1 a { font-size: xx-large; color:#050505; text-align:center; margin:30px; font-weight: bold; font-family: 'DFKai-sb', 'Tahoma'; } 45 | 46 | h2, h2 a { font-size: x-large; color:#8B008B; margin-top:30px; margin-bottom:30px; font-weight: bold; font-family: 'DFKai-sb', 'Tahoma'; } 47 | 48 | h3, h3 a { font-size: large; color:#000080; font-weight: bold; font-family: 'DFKai-sb', 'Tahoma'; } 49 | 50 | h4, h4 a { font-size: medium; color:#4B0082; font-weight: bold; font-family: 'DFKai-sb', 'Tahoma'; } 51 | 52 | h5, h5 a { font-size: small ; color:#708090; font-weight: bold; font-family: 'DFKai-sb', 'Tahoma'; } 53 | 54 | h6, h6 a { font-size: x-small; color:#000080; } 55 | 56 | p { 57 | font-family: 'Pmingliu', 'Tahoma'; 58 | margin: 10px 0 15px 0; 59 | font-size:100%; 60 | color:#353535; 61 | } 62 | 63 | li { 64 | font-size:100%; 65 | } 66 | 67 | footer p { 68 | color: #f2f2f2; 69 | } 70 | 71 | a { 72 | text-decoration: none; 73 | color: #007edf; 74 | text-shadow: none; 75 | 76 | transition: color 0.5s ease; 77 | transition: text-shadow 0.5s ease; 78 | -webkit-transition: color 0.5s ease; 79 | -webkit-transition: text-shadow 0.5s ease; 80 | -moz-transition: color 0.5s ease; 81 | -moz-transition: text-shadow 0.5s ease; 82 | -o-transition: color 0.5s ease; 83 | -o-transition: text-shadow 0.5s ease; 84 | -ms-transition: color 0.5s ease; 85 | -ms-transition: text-shadow 0.5s ease; 86 | } 87 | 88 | table { 89 | border-collapse: collapse; 90 | border-spacing: 0; 91 | border: 1px solid #373737; 92 | margin-bottom: 20px; 93 | text-align: left; 94 | margin-left:auto; 95 | margin-right:auto; 96 | } 97 | 98 | th { 99 | padding: 10px; 100 | background-color:black; 101 | color:white; 102 | } 103 | 104 | td { 105 | padding: 10px; 106 | vertical-align: middle; 107 | border: 1px solid #373737; 108 | } 109 | 110 | em { 111 | color: blue; 112 | } 113 | 114 | strong { 115 | font-weight:bold; 116 | color: red; 117 | } 118 | 119 | #header_wrap { 120 | margin: 0; 121 | padding: 16px; 122 | border: 0; 123 | font: inherit; 124 | vertical-align: baseline; 125 | background-color:black; 126 | color:white; 127 | } 128 | 129 | #header_wrap h1, #header_wrap h1 sub, #header_wrap h1 a { 130 | color:white; 131 | font-family: 'DFKai-sb', 'Tahoma'; 132 | } 133 | 134 | #header_wrap sub { 135 | color:white; 136 | font-size:60%; 137 | } 138 | 139 | .title, .author, .date { 140 | color:#333333; 141 | text-align:center; 142 | font-family: 'DFKai-sb', 'Tahoma' ; 143 | } 144 | 145 | .title { font-size:xx-large; line-height:800%; } 146 | 147 | .author { font-size:large; line-height:300%; } 148 | 149 | .date { font-size:large; line-height:300%; } 150 | 151 | 152 | #content { 153 | margin:10px; 154 | padding:10px; 155 | } 156 | 157 | pre { 158 | border: 1px solid #373737; 159 | background-color:#efefef; 160 | color:#3f3f3f; 161 | font-size:medium; 162 | width:95%; 163 | padding:10px; 164 | /* wrap ,自動換行 */ 165 | white-space: pre-wrap; /* css-3 */ 166 | white-space: -moz-pre-wrap; /* Mozilla, since 1999 */ 167 | white-space: -pre-wrap; /* Opera 4-6 */ 168 | white-space: -o-pre-wrap; /* Opera 7 */ 169 | word-wrap: break-word; /* Internet Explorer 5.5+ */ 170 | } 171 | 172 | code { 173 | // font-family: SimSun; 174 | // color:blue; 175 | font-size:100%; 176 | } 177 | 178 | pre code { 179 | font-family: SimSun; 180 | font-size:100%; 181 | } 182 | 183 | .figure { 184 | margin:10px; 185 | padding:10px; 186 | margin-left: auto; 187 | margin-right: auto; 188 | display: block; 189 | } 190 | 191 | img { vertical-align:middle; } 192 | 193 | .figure img { 194 | margin-left: auto; 195 | margin-right: auto; 196 | display: block; 197 | } 198 | 199 | .figure .caption { 200 | text-align:center; 201 | } 202 | 203 | #TOC { 204 | } 205 | 206 | #footer { 207 | text-align:center; 208 | font-size:small; 209 | color:#6f6f6f; 210 | margin: 10px; 211 | padding: 10px; 212 | } 213 | 214 | /* JavaScript Style */ 215 | table.sourceCode, tr.sourceCode, td.lineNumbers, td.sourceCode { 216 | margin: 0; padding: 0; vertical-align: baseline; border: none; } 217 | table.sourceCode { width: 100%; } 218 | td.lineNumbers { text-align: right; padding-right: 4px; padding-left: 4px; color: #afafaf; border-right: 1px solid #aaaaaa; } 219 | td.sourceCode { padding-left: 5px; } 220 | code > span.kw { color: #007020; font-weight: bold; } 221 | code > span.dt { color: #902000; } 222 | code > span.dv { color: #40a070; } 223 | code > span.bn { color: #40a070; } 224 | code > span.fl { color: #40a070; } 225 | code > span.ch { color: #4070a0; } 226 | code > span.st { color: #4070a0; } 227 | code > span.co { color: #60a0b0; font-style: italic; } 228 | code > span.ot { color: #007020; } 229 | code > span.al { color: #ff0000; font-weight: bold; } 230 | code > span.fu { color: #06287e; } 231 | code > span.er { color: #ff0000; font-weight: bold; } 232 | 233 | -------------------------------------------------------------------------------- /css/pmag.css: -------------------------------------------------------------------------------- 1 | html, body, div, span, applet, object, iframe, 2 | p, blockquote, pre, 3 | a, abbr, acronym, address, big, cite, code, 4 | del, dfn, em, img, ins, kbd, q, s, samp, 5 | small, strike, strong, sub, sup, tt, var, 6 | b, u, i, center, 7 | dl, dt, dd, 8 | fieldset, form, label, legend, 9 | table, caption, tbody, tfoot, thead, tr, th, td, 10 | article, aside, canvas, details, embed, 11 | figure, figcaption, footer, header, hgroup, 12 | menu, nav, output, ruby, section, summary, 13 | time, mark, audio, video { 14 | margin: 0; 15 | padding: 0; 16 | border: 0; 17 | font: inherit; 18 | vertical-align: baseline; 19 | line-height:160%; 20 | } 21 | 22 | #cover-image { 23 | width:100%; 24 | } 25 | 26 | div>ol.toc { 27 | list-style-type:disc; 28 | } 29 | 30 | ol.toc { 31 | list-style-type:circle; 32 | } 33 | 34 | blockquote { 35 | margin: 10px; 36 | padding-left: 10px; 37 | padding-right: 10px; 38 | padding-top: 1px; 39 | padding-bottom: 1px; 40 | border: 3px double #373737; 41 | color:#333333; 42 | } 43 | 44 | h1, h1 a { font-size: xx-large; color:#050505; text-align:center; margin:30px; font-weight: bold; font-family: 'DFKai-sb', 'Tahoma'; } 45 | 46 | h2, h2 a { font-size: x-large; color:#8B008B; margin-top:30px; margin-bottom:30px; font-weight: bold; font-family: 'DFKai-sb', 'Tahoma'; } 47 | 48 | h3, h3 a { font-size: large; color:#000080; font-weight: bold; font-family: 'DFKai-sb', 'Tahoma'; } 49 | 50 | h4, h4 a { font-size: medium; color:#4B0082; font-weight: bold; font-family: 'DFKai-sb', 'Tahoma'; } 51 | 52 | h5, h5 a { font-size: small ; color:#708090; font-weight: bold; font-family: 'DFKai-sb', 'Tahoma'; } 53 | 54 | h6, h6 a { font-size: x-small; color:#000080; } 55 | 56 | p { 57 | font-family: 'Pmingliu', 'Tahoma'; 58 | margin: 10px 0 15px 0; 59 | font-size:100%; 60 | color:#353535; 61 | } 62 | 63 | li { 64 | font-size:100%; 65 | } 66 | 67 | footer p { 68 | color: #f2f2f2; 69 | } 70 | 71 | a { 72 | text-decoration: none; 73 | color: #007edf; 74 | text-shadow: none; 75 | 76 | transition: color 0.5s ease; 77 | transition: text-shadow 0.5s ease; 78 | -webkit-transition: color 0.5s ease; 79 | -webkit-transition: text-shadow 0.5s ease; 80 | -moz-transition: color 0.5s ease; 81 | -moz-transition: text-shadow 0.5s ease; 82 | -o-transition: color 0.5s ease; 83 | -o-transition: text-shadow 0.5s ease; 84 | -ms-transition: color 0.5s ease; 85 | -ms-transition: text-shadow 0.5s ease; 86 | } 87 | 88 | table { 89 | border-collapse: collapse; 90 | border-spacing: 0; 91 | border: 1px solid #373737; 92 | margin-bottom: 20px; 93 | text-align: left; 94 | margin-left:auto; 95 | margin-right:auto; 96 | } 97 | 98 | th { 99 | padding: 10px; 100 | background-color:black; 101 | color:white; 102 | } 103 | 104 | td { 105 | padding: 10px; 106 | vertical-align: middle; 107 | border: 1px solid #373737; 108 | } 109 | 110 | em { 111 | color: blue; 112 | } 113 | 114 | strong { 115 | font-weight:bold; 116 | color: red; 117 | } 118 | 119 | #header_wrap { 120 | margin: 0; 121 | padding: 16px; 122 | border: 0; 123 | font: inherit; 124 | vertical-align: baseline; 125 | background-color:black; 126 | color:white; 127 | } 128 | 129 | #header_wrap h1, #header_wrap h1 sub, #header_wrap h1 a { 130 | color:white; 131 | font-family: 'DFKai-sb', 'Tahoma'; 132 | } 133 | 134 | #header_wrap sub { 135 | color:white; 136 | font-size:60%; 137 | } 138 | 139 | .title, .author, .date { 140 | color:#333333; 141 | text-align:center; 142 | font-family: 'DFKai-sb', 'Tahoma' ; 143 | } 144 | 145 | .title { font-size:xx-large; line-height:800%; } 146 | 147 | .author { font-size:large; line-height:300%; } 148 | 149 | .date { font-size:large; line-height:300%; } 150 | 151 | 152 | #content { 153 | margin:10px; 154 | padding:10px; 155 | } 156 | 157 | pre { 158 | border: 1px solid #373737; 159 | background-color:#efefef; 160 | color:#3f3f3f; 161 | font-size:medium; 162 | width:95%; 163 | padding:10px; 164 | /* wrap ,自動換行 */ 165 | white-space: pre-wrap; /* css-3 */ 166 | white-space: -moz-pre-wrap; /* Mozilla, since 1999 */ 167 | white-space: -pre-wrap; /* Opera 4-6 */ 168 | white-space: -o-pre-wrap; /* Opera 7 */ 169 | word-wrap: break-word; /* Internet Explorer 5.5+ */ 170 | } 171 | 172 | code { 173 | // font-family: SimSun; 174 | // color:blue; 175 | font-size:100%; 176 | } 177 | 178 | pre code { 179 | font-family: SimSun; 180 | font-size:125%; 181 | } 182 | 183 | .figure { 184 | margin:10px auto 10px auto; 185 | padding:10px 10px 10px 10px; 186 | display: block; 187 | vertical-align:middle; 188 | } 189 | 190 | img { vertical-align:middle; } 191 | 192 | .figure img { 193 | margin:10px auto 10px auto; 194 | display: block; 195 | vertical-align:middle; 196 | } 197 | 198 | .figure .caption { 199 | text-align:center; 200 | } 201 | 202 | #TOC { 203 | } 204 | 205 | #footer { 206 | text-align:center; 207 | font-size:small; 208 | color:#6f6f6f; 209 | margin: 10px; 210 | padding: 10px; 211 | } 212 | 213 | /* JavaScript Style */ 214 | table.sourceCode, tr.sourceCode, td.lineNumbers, td.sourceCode { 215 | margin: 0; padding: 0; vertical-align: baseline; border: none; } 216 | table.sourceCode { width: 100%; } 217 | td.lineNumbers { text-align: right; padding-right: 4px; padding-left: 4px; color: #afafaf; border-right: 1px solid #aaaaaa; } 218 | td.sourceCode { padding-left: 5px; } 219 | code > span.kw { color: #007020; font-weight: bold; } 220 | code > span.dt { color: #902000; } 221 | code > span.dv { color: #40a070; } 222 | code > span.bn { color: #40a070; } 223 | code > span.fl { color: #40a070; } 224 | code > span.ch { color: #4070a0; } 225 | code > span.st { color: #4070a0; } 226 | code > span.co { color: #60a0b0; font-style: italic; } 227 | code > span.ot { color: #007020; } 228 | code > span.al { color: #ff0000; font-weight: bold; } 229 | code > span.fu { color: #06287e; } 230 | code > span.er { color: #ff0000; font-weight: bold; } 231 | 232 | -------------------------------------------------------------------------------- /code/neural/backprop.js: -------------------------------------------------------------------------------- 1 | // Back-Propagation Neural Networks (JavaScript 版) 2 | // 由陳鍾誠修改自 Neil Schemenauer 的 Python 版 3 | // Python 程式網址為: http://arctrix.com/nas/python/bpnn.py 4 | 5 | var log = console.log; 6 | 7 | // 建立大小為 n 的陣列並填入初始值 fill 8 | var makeArray=function(n, fill) { 9 | var a = []; 10 | for (var i=0; i=0) 28 | rzStr+=" "+array[i].toFixed(precision)+" "; 29 | else 30 | rzStr+=array[i].toFixed(precision)+" "; 31 | } 32 | return rzStr; 33 | } 34 | 35 | // rand():取得 a 到 b 之間的一個隨機亂數 36 | var rand=function(a, b) { 37 | return (b-a)*Math.random() + a; 38 | } 39 | 40 | // sigmoid(x)=tanh(x) 41 | function sigmoid(x) { 42 | var tanh = (Math.exp(x) - Math.exp(-x)) / (Math.exp(x) + Math.exp(-x)); 43 | return tanh; // 雙曲正切函數 44 | } 45 | 46 | // dsigmoid(x)=1-x^2; 47 | // 參考:http://pynopticon.googlecode.com/svn/trunk/src/vlfeat/toolbox/special/dsigmoid.m 48 | // 參考:http://en.wikipedia.org/wiki/Sigmoid_function 49 | function dsigmoid(x) { 50 | return 1.0 - x*x; 51 | } 52 | 53 | function NeuralNet() { 54 | 55 | // init():設定網路結構與權重的隨機初始值的函數。 56 | this.init=function(ni, nh, no) { 57 | // number of input, hidden, and output nodes 58 | this.ni = ni + 1; // +1 for bias node 59 | this.nh = nh; 60 | this.no = no; 61 | 62 | // activations for nodes : 建立各層的節點陣列 63 | this.ai = makeArray(this.ni, 1.0); 64 | this.ah = makeArray(this.nh, 1.0); 65 | this.ao = makeArray(this.no, 1.0); 66 | 67 | // create weights : 建立權重矩陣 68 | this.wi = makeMatrix(this.ni, this.nh, 0.0); 69 | this.wo = makeMatrix(this.nh, this.no, 0.0); 70 | 71 | // set them to random vaules : 隨機設定權重初始值。 72 | for (var i=0; i