顯示具有 SCIENCE 標籤的文章。 顯示所有文章
顯示具有 SCIENCE 標籤的文章。 顯示所有文章

2018年10月28日 星期日

「WebOrganic」mBot 友師義工、深圳「厘米空間」 考察

最近參加一個在屯門區的 STEAM 義工師友計劃,最近開始到小學和他們一起上堂玩 mBot 機械人編程,第一天坐在兩位小朋友旁邊觀察,看著兩個人仔的互動比 mBot 吸引,一動一靜的倆人、從行為可以看到他們有不同的需要,和成長中要學習的課題。下一節開始會再和其作人組成小組去設計表演、參賽,這兩種性格如何和別人合作,可能是挑戰同時也是學習機會。很容易表現出想法和需要的小朋友,從什麼時麼人在長大後變得複雜難懂的呢?

兩年前的Arduino學習文,記得大概是那時候 mBot 初被留意作為教學用途,到現在市面所見的STEAM興趣班基本都以mBot作為兒童編程教學了。
Android + Arduino 小車的手機藍牙遙控計劃
Arduino 淘寶小車 - 焊接/使用CH341的Driver/功能測試



上星期跟一個前海交流團北上,由招商局基金會安排到訪位於深圳南山區「蛇口網谷」雙創基地(沿山路和南海大道之間,工業四路至工業八路)的地區(南山半島東部,應該是后海灣地區),參觀一間 「招商啟航」營運 的孵化加速器—「厘米空間」 (CM Space 的 CM 就是招商局的 China Merchant ),和相鄰的共享工作空間-「招商創庫」。整個園區會令我想起在班加羅爾工作時的園區,巴士沿大街行走到園區前下車,經過一個保安崗位和大閘進入,三楝的大厦園繞入口後的空地。我們進入其一座約十層的工業區大厦,就是今次拜訪的「厘米空間」。

2018年7月6日 星期五

Coursera - Applied Data Science with Python 學習筆記 05 - Social Network Analysis

到了這系列課程的最後一門課-社會網絡分析 (Social Network Analysis) ,原本以為是研究 FB、Twitter 等平台的文字資料;原來是運用圖論中的節點和線邊構成的『圖』去代表社會網絡中的人和關係。純圖論的一些經典實施問題包括:7橋問題(path)、最短路徑問題(distance)、4色問題(labeling)。圖論伸廷到今天的社會網絡分析,研究的方向可能是社群的結構、資訊如何流通等等,社交平台做成的網絡是這個方向的一大推動力,正如 Facebook 提供讓開發者使用的 Graph API 就是以 物件-關係 來處理資訊。Python中有 NetworkX 套件特別用來處理這些Social Network Analysis 問題的工具。

Week1 是圖論上的基礎,和一些特別的圖例如 bipartite graph, 它的L-Bipartite graph (weighted) projection。解釋過什麼是Graph、Node、Edge、Degree等基本詞彙後,網絡和圖的稱呼會交替出現。

要引用一張圖,可以有以下方法:
https://networkx.github.io/documentation/networkx-1.10/reference/readwrite.html
import networkx as nx
import numpy as np
import pandas as pd
%matplotlib notebook

G1 = nx.Graph()
G1.add_edges_from([('A', 'B'),
                   ('A', 'C'),
                   ('A', 'D'),
                   ('A', 'E'),
                   ('B', 'D'),
                   ('B', 'E'),
                   ('D', 'E'),
                   ('C', 'F'),
                   ('C', 'K'),
                   ('F', 'H'),
                   ('F', 'K'),
                   ('F', 'J'),
                   ('J', 'K')])

G2 = nx.read_edgelist('G_self_edgelist.txt', delimiter=',', data=[('Weight', int)])

G_df = pd.read_csv('G_self_edgelist.txt', delimiter=',', 
                   header=None, names=['n1', 'n2', 'weight'])
G3 = nx.from_pandas_dataframe(G_df, 'n1', 'n2', edge_attr='weight')

nx.info(G)
G.nodes(data=True)
G.edges(data=True)
nx.draw_networkx(G)

Week 2

「群聚分析」研究的是,網絡中的點互相連結形成群聚的程度。典型由多人形成的群聚,會是圖中一部分由所有點互相連結的完全子圖。而最簡單的一個群聚是由互相認識的三個人形成的「Triadic Closure」,對更複雜的圖的幾種群聚系數,量度的設計是由這形式推展出來的。

首先是圖中某個頂點的「局部群聚系數」-Local Clustering Coefficient,它的大概主意是去計算:與某頂點相連的近鄰們,能夠互相連結成配對的比例。即以下兩者之比:
$v$的近鄰間實際形成的邊數:$|(X,Y)| s.t. X,Y \in N(v)$
$v$的近鄰間最大可能形成的邊數:$\frac{d_v(d_v - 1)}{2}$

當考慮整個圖的整體群聚程度-「全局群聚系數」時,有兩種方法,一個是所有點的局部群聚系數平均起來-「Average Local Clustering Coefficient」。另一個稱為 「Transitivity」 的量度方法是數算圖中由三點形成的「閉三角組」和「開三角組」的比例:
Transitivity = 3 * number triangle / number of opera triad
而兩套方法的分別是對 Transitivity 對 高Degree 的點有較大比重。
nx.average_clustering(G)
nx.transitivity(G)

2018年6月18日 星期一

Coursera - Applied Data Science with Python 學習筆記 04 - Text Mining

《山林道》-「當初說這裡有天 會由樹變成路 一醒覺經已殺出這條路....
我只盼這裡有天 變回樹 撤回路 疏忽了趕快去補趁還未老... 」

Applied Data Science with Python的第四課-Applied Text Mining in Python,是更多有關文字、語言的處理,可以想像最後一課的social network應該有機會處理網絡社交平台上獲取的資料?

最基本的是文字的 Regular Expression 處理,在第一課時已略有使用過,幾個常用方法包括:

### Regular expression
import re
text = '@UN @UN_Women "Ethics are built right into the ideals and objectives of the United Nations" \
UNSG @NY @NY_Society for Ethical Culture bit.ly/2guVelr'   # 字串
text_list = text.split(' ')   # 分拆字串
[w for w in text_list if re.search('@[A-Za-z0-9_]+', w)]   # 查找吻合的pattern

# Dataframe 的字串處理
time_sentences = ["Monday: The doctor's appointment is at 2:45pm.", 
                  "Tuesday: The dentist's appointment is at 11:30 am.",
                  "Wednesday: At 7:00pm, there is a basketball game!",
                  "Thursday: Be back home by 11:15 pm at the latest.",
                  "Friday: Take the train at 08:10 am, arrive at 09:00am."]
df = pd.DataFrame(time_sentences, columns=['text'])

df['text'].str.split().str.len()   # find the number of tokens for each string in df['text']
df['text'].str.findall(r'(\d?\d):(\d\d)')   # group and find the hours and minutes
df['text'].str.replace(r'\w+day\b', '???')   # replace weekdays with '???'
df['text'].str.extractall(r'((\d?\d):(\d\d) ?([ap]m))')   # extract the entire time, the hours, the minutes, and the perio

然後就開始自然語言處理器 NLTK。課程是英語為主,但香港地更實際的一定是中文的處理,從前在 R 就聽過 Jieba 套件,Python世界似乎也是 Jieba 最廣為人所認識,當然這個 Jieba套件之後也要找機會試試。

所以,還是先溫習課程上所學習對英文的流程。首先是把文章進行分詞 (Tokenization),然後針對英文文法上的不同時態/詞型,分辨詞性 (Noun/Verb/Adj/...) 及縮減成詞根的提取 (Stemming) 或還原Lemmatization)。 這樣以後才可以做一些詞頻統計、Vectorization 後做預測模型、兩篇文章內容的相似度的比較。

2018年6月6日 星期三

Coursera - Applied Data Science with Python 學習筆記 03 - machine learning

第三課, Coursera上的最後一課已經開課,加快記完這篇就要再追一追進度了。機器學習隨著人工智能近年變成流行Buzzword,其實在引入神經網路(Neural Networks)前,一些模型例如Regression, logistics regression, KNN Classifier 等 迴歸 或 分類 模型; K means 的叢集;PCA 的縮減維度方法;Decision Tree的決策指引;很多概念都是統計和數學所已有的,只是一個機械學習的課程會對實作更有重視。

今次只是在有課程框架下去學python。當以<第一課>的技巧處理好數據成合用的格式, <第二課>繪圖後對數據有視覺化的印象, 可以進入第三課建立模型去做數據的形容/預測。其他例子可以參考之前幾篇,例如早期用 R 的:
[R] ML4B 課堂重溫 - 淺談 KNN (K-th Nearest Neighbors) 算法
[R] Show Me The Code - Machine Learning的簡易入門

在課堂的練習中,所有今次用到有關的scikit-learn library。從library的架構中可以留意到model selection, preprocessing, models, metrics幾大類別,對應著建立模型過程中的不同需要:
from sklearn.model_selection import train_test_split
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import validation_curve

from sklearn.preprocessing import MinMaxScaler
from sklearn.preprocessing import PolynomialFeatures

from sklearn.neighbors import KNeighborsClassifier 
from sklearn.linear_model import LinearRegression, Ridge, Lasso, LogisticRegression
from sklearn.svm import LinearSVC, SVC
from sklearn.tree import DecisionTreeClassifier
from sklearn.dummy import DummyClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier
from sklearn.neural_network import MLPClassifier

from sklearn.metrics.scorer import SCORERS
from sklearn.metrics import confusion_matrix
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
from sklearn.metrics import classification_report
from sklearn.metrics import precision_recall_curve
from sklearn.metrics import roc_curve, auc
from sklearn.metrics import mean_squared_error, r2_score

from sklearn.datasets import make_classification, make_blobs, make_friedman1, load_breast_cancer

2018年5月29日 星期二

Coursera - Applied Data Science with Python 學習筆記 02 - matplotlib

香港2018年對比以往10年的極端氣溫 - 現在 5月尾 (至27/5) 已經連續出現破記錄的高溫

第二課:<Applied Plotting, Charting & Data Representation in Python> 學的是繪圖,倚重 Jupyter Notebook 中的 %matplotlib 功能來直接顯示繪圖的輸出。以上的圖就是其中一功課改用香港數據表示出來,詳細coding看本文的最後部份。 Jupyter Notebook 以前稱為 IPython notebook,從前安裝 Anaconda 應該是預設了Jupyter,只是一直未有使用。今次先檢查兩個2.7和3.6的python環境中的package,未有Jupyter的話就重新安裝/更新。

# 當前環境的套件
conda list
# 更新 pip
pip install --upgrade pip

# 安裝 jupyter
pip install jupyter

之後當執行jupyter,電腦會打開一個瀏覽器視窗,預設會連到localhost的 port:8888。新增或打開課程的 .ipynb 檔,當中的內容以一個個的「Cell」顯示。按 [Shift+Enter] 執行這個 Cell ,某個 Cell 的 in[?] 的結果會顯示在相應的 out[?] 之中,這樣可以選擇文件中的某部分來執行、逐步去測試。 其他功能可以在文件上方的選項,經常用到 Kernal 中的 Restart, Restart+Run all。在用完某 .ipynb 後可以把它 Shutdown;要離開 Jupyter 就可以在 Terminal 中按 [Ctrl+C] x2

# Use Jupyter
python -m jupyter notebook

用瀏覽器的 localhost:8888/tree/ 作為開頭的路徑,前往電腦中的檔案夾

打開 Jupyter Notebook 的 .ipynb 檔


2018年5月17日 星期四

Coursera - Applied Data Science with Python 學習筆記 01 - Introduction

5月初的放假期間開始了一個Coursera 的 Python Specialization 課程-<Applied Data Science with Python>, 暫時完成了3/5的課,在5月尾開始下一課前,先重溫一下第一課:<Introduction to Data Science in Python> 一些值得記著的codings.

1. 例子

# 關於資料結構
x = (1, 'a', 2, 'b')  # Tuple
x = [1, 'a', 2, 'b']  # List
      # set(x['name'] for x in df).   elist = [n for n in range(0,100) if n%2==0]
x = {1: 'a', 2: 'b'} # Dict
      # x[name], x.values(), x.items()
x = np.array([[7, 8, 9], [10, 11, 12]])     # Array:   import numpy as np.
x = Series(['item1', 'item2', 'item3'], [0, 1, 2])   # Series:  import pandas as pd
x = Dataframe(array, index, columns)   # Dataframe:  import pandas as pd
type()

# 字串 及 正則表示式
x = 'This is a string'
x[0:2]   # 從第 0th 元素開始,停止在第 2nd 元素之前
'This is a string'.split(' ')[0]  # 以空格 '  ' 分拆字串,提取第 0th 元素
re.findall(r'\w+', 'This is a string')  # 以正則表示式尋找特定字符。需要先 import re

# Numpy 中的 Array,用於使用 Vector、Matrix 的時候
a = np.arrange(start, end, step)  # 從 start 至 end,數值間隔為 step 的 Array
a = np.linspace(start, end, count)  # 從 start 至 end,count 個數值的 Array
amax = a.argmax()  # Array 中的最大值
a = np.vstack([array1, array2])  # 垂直合併兩個 Array
arrar2 = array1.copy   # 複製出獨立的 Array


# Pandas 中的 Series/Dataframe, 從 Numpy 的 Array衍生出來,處理數據的資料表時可以用到
a.argmax()
s.loc['name']   # index 為'name'的資料
df.reset_index()  # 重設 index 為 0:len(df)
df.set_index('time').sort_index()  # 以Column 'time' 為 index,並排序
df.dropna()  # 除去包含 NA 的行-Row
df.apply(min_max, axis=1)  # 進行 Row 運算
df.pivot_table(values, index, columns, aggfunc=[np.mean,np.min], margins=True)  # 製作Pivot Table綜合資料表
df= df.set_index('Col1') .groupby(level=0)['Col2'].agg({'avg': np.average}) 
pd.cut(df['avg'],10)

2018年3月24日 星期六

Coursera與Google的新課程後記- Google IT Support Professional Certificate

這星期剛完成了Coursera上的 「Google IT Support Professional Certificate」,由 6課組成的專業證書。 https://www.coursera.org/specializations/google-it-support


以前在Coursera都是用「Audit」旁聽的制度自學,自從Coursera的旁聽制度變得不能交功課甚至打開功課之後,就也沒有在這平台上課了(因為不實實在在地練習的話,只看影片是很難學得好的。)。 忘了當初是什麼文章的介紹而留意到了這個課程了,首先當然是留意到由 Google 準備的 IT 課程應該有質素保證吧。然後看到按月收費的模式,心想先慢慢地旁聽自學,之後才加入課程做功課,應該可以一個月付款期內完成功課吧,那樣就只是$49美元,OK啦。(之後如來實際上還有7天免費期,之後才開始收費。)於是開始了這個Coursera 上的 「Professional Certificate」。 今次也是除了坐定定在電腦看之外,更主要是靠平時交通時間的手機,和1.25 - 1.5倍速的功能,還有作為靠閱讀吸收的人,有時看講稿的文字比慢慢聽片快。最終大概是前前後後用了約一個月時間。而功課大約個多星期完成,剛剛過了免費期T_T,不過就當少少支持吧。

By the way,課程本身的介紹是這樣:
This six-course certificate, developed exclusively by Google, includes innovative curriculum designed to prepare you for an entry-level role in IT support. A job in IT can mean in-person or remote help desk work, either in a small business or at a global company, like Google. Whether you’ve been tinkering with IT or are completely new to the field, you’ve come to the right place.
....
If you dedicate 8-10 hours a week to the courses, you can complete the certificate in about eight months. You can also skip through any content that you might already know and speed ahead to the graded assessments.

2018年2月4日 星期日

[Web] Digital Ocean升級 和 部署到One-click app時修改的 Nginx、Gunicorn 設定。

Digital Ocean 升級

之前的一篇記錄過如何在 Digital Ocean 建立一個雲端主機後,不久的某天早上在查看電郵時,留意到 Digital Ocean 為它的服務升級了。以最低價格每月5美元一個標準主機的Droplet 為例,就有以下更新:從 512MB -> 1GB RAM、 20GB -> 25GB SSD。

但如電郵標題已經講明,這是[Action Required]。這個自製網站的規模不怕暫時離線,也未看到有復原到小容量,或預留那 5GB Disk的需要,所以也沒理由不放心進行 Disk, CPU and RAM 的升級。以 Control Panel 的方式升級也非常容易。



參考:https://www.digitalocean.com/community/tutorials/how-to-resize-your-droplets-on-digitalocean

 

2018年1月19日 星期五

[PowerShell] [Office] 用 Regular Expression 轉換日期格式 (US/GB)

前日上班的車程中,想起同事偶爾會碰到日期格式(美式/英式)的問題。雖然可以在打開Excel,為資料分列(Text to Columns)時做處理,去指定每列資料讀取時的格式。但想到要指示得人人明白卻不太易,能否有個只需簡單一按的小工具,可以做美式/英式間的格式轉換呢?

Office 中的問題,PowerShell 解決。也學到一些Regular Expression(正則表達式)的運用:
$inputfile = "test.csv"

(Get-Content $inputfile) | 
Foreach-Object {$_ -replace "([0-9]{1,2})/([0-9]{1,2})/([0-9]{4})", '$2/$1/$3'} | 
Set-Content '_output.txt'


部份 Regular Expression 的解釋:
字元/符號 範例 說明 成立例子
一般字元 / 含字母 “/” 的字串 25/12
^ ^A 比對字串開始位置AB
$ C$ 比對字串結束位置 ABC
\e\^2避開特殊字元 e^2
[......] B[aeiou]t 比對 [......] 內的任意字元 Bit
Bot

[0-9] [0-9] 比對0到9的任意字元,另有[a-z]和[A-Z]等用法 9
{n} B{2} 比對{n}前的字元n次,n必為正整數 BB
{n,m} [0-9]{2,4} 比對{n,m}前的字元至少n次但最多m次,n,m均為正整數 01
2389

(x) ([0-9]+)/([0-9]+) 比對 x 並將符合的部分存入一個變數 可比對 “123/45” 中的 “123” 、 “45”, 並將這個比對得到的字串設定至變數 \$1 和 \$2







加入給使用者的簡介部份:
$rePattern = '([0-9]{1,2})/([0-9]{1,2})/([0-9]{4})'
Write-Host "This will do date-format conversion for your AA/BB/CCCC into BB/AA/CCCC,"
Write-Host "Output as '_converted.txt'. Enjoy."
Write-Host ""
$fileRaw = Read-Host -Prompt 'Input your filename (same folder, ever with file extension): '
(Get-Content $fileRaw) | Foreach-Object {$_ -replace $rePattern, '$2/$1/$3'} | Set-Content '_convert.txt'


對這類辦公室日常出現的問題,有時太重技術層面去應對了就算的話,也明白就像是諸侯舞庶人之劍的感覺。 而且,這個日期格式的問題本來已有專案去處理和做了改變,好處是應該可以更完善的解決問題。但世上總有意外或突然的需要,再啟動一個項目的形式,過程往往會快費較長時間,而小修小補就是quick-and-dirty。

再者,參考使用者自己也會用的方法,就好像社區提案的概念,這些方案可能更切合用家的需要。如果能讓人人都有能力和空餘可以做些小創新、小改變,應該對人對己都是好處吧。

2018年1月16日 星期二

[Web] 為網站準備的 雲端主機 (Digital Ocean) 和 域名註冊 (Hosting speed)

按此推薦網址註冊,可獲得10美元Credit的優惠【 https://m.do.co/c/586afef63cee 】。

為老闆娘做網頁,自從寫好基本的網頁框架,就把它放下了一段日子,十二月尾至一月初忙著做線下的工作,為訂單起貨。現在網頁仍欠一些產品照和字型配色等的外觀設計,還有要等待和店主討論希望如何展示定價和包裝等等。在這個等待的時候,為了準備之後的正式部署上線,12月中開始租了一個Digital Ocean的雲端主機作虛擬專用伺服器(VPS) 用來寄存和運行網站;1月初還在 Hostingspeed.net 買了一個 .hk 的域名。

Digital Ocean

當開發階段有了雛型時,就向身邊的朋友示範和搜集意見,"上線"這部分就推介了DigitalOcean (D.O.) 這個VPS主機商。作為個人運作的網站,還要是對寫網頁仍在學習中的階段,它的好處是入門門檻相對很低。DO 有不同的租用計劃選擇,最便宜的只需每月$5美金,(新用戶用朋友的邀請連結去註冊,有$10的credit,如上),可以分到一個在新加坡的伺服器, 512mb記憶體,20GB硬碟空間,我選擇 1-click app的版本,預設好 Ubuntu 16.04, Python 2.7.12, Django 1.8.7。


按邀請 [連結] 建立帳戶:

2017年10月25日 星期三

[Math] Derivation of Kepler's Law (Part 2)

上一篇在繼續了解Kepler 1st law 的證明前,先要重溫一下微分方程和幾何,所以到圖書館找找書,借了本 《Applied Maths for Engineering》 重溫一下微積分和各種數學工具。

很多時看微積分的過程時,都會被一些看似是微分 (dx、dy) 的移項而感到混亂。記得聽說過雖然做起來不大分別,但概念仍是不同的。今次重溫的一個得著就是弄清楚這些基礎再出發,對閱讀別人的運算時有幫助。

對導數的正式定義是 $\frac{\text{d}f}{\text{d}t} = \lim_{h \rightarrow 0} \frac{f(t+h)-f(t)}{h}$。但可以換一個形象化的方式再看一次:有一條方程式 y=f(x),在一段很細小的範圍內,斜率是 $\frac{\delta y}{\delta x}$。這裡看成除法或分數仍然有效,因為分母仍不是零,仍未觸及「無窮小」這個所謂「消逝量的幽靈」。接下來當考慮 $\lim_{\delta x \rightarrow 0}$ 時,才開始寫成 $\frac{\text{d}y}{\text{d}x}$。當中的 $\frac{\text{d}}{\text{d}x}$ 是一個符號、函數、或運算子,作用於 $y=f(x)$。所以,從前學「Chain Rule」時可能聽過 $\frac{\text{d}y}{\text{d}x} = \frac{\text{d}y}{\text{d}u}\frac{\text{d}u}{\text{d}x}$ ,或者積分時 $\int \left(u^2 \frac{du}{dx}\right)dx$ 可以「像」分數相約般操作,但實際上,要抽半個符號出來,甚至還能運算,是不合理的。不過,如果回到取「無窮小」($\lim_{\delta x \rightarrow 0}$)之前的 $\frac{\delta y}{\delta x}=\frac{\delta y}{\delta u}\frac{\delta u}{\delta x}$ 或 $\sum_{\delta x} \left(u^2 \frac{\delta u}{\delta x}\right) \delta x$ ,就容易理解了。

還有一個例子是找出一個平面的重心時,可以用這樣的積分:$(x,y) = \left( \frac{\int xy \text{d}x}{\int y \text{d}x}, \frac{\int xy \text{d}y}{\int x \text{d}y} \right) $  也這個有助了解 $x$ 和 $\delta x$ 在積分中的分別。
(這個 $\int xy \text{d}x$ 稱為 "First Moment of Area about y-axis",統計上的 "First moment" $\int x f(x) \text{d}x$  這個名詞跟這個有關嗎?)


一些有用的總結:
 $y=f(x)$  $\frac{\text{d}y}{\text{d}x}$
 $ax^n$  $anx^{n-1}$
 $\sin ax$  $a \cos ax$
 $\cos ax$  $-a \sin ax$
 $\tan ax$  $a {\sec^2} ax$
 $e^{ax}$  $a e^{ax}$
 $\ln ax$  $\frac{1}{x}$
 $uv$  $u\frac{dv}{dx} + \frac{du}{dx} v$
 $f(u)$  $\frac{\text{d}y}{\text{d}u}\frac{\text{d}u}{\text{d}x}$
 $y=f(x)$  $\int y \text{d}x$
 $ax^n$  $\frac{a x^{n+1}}{n+1} + C$   $(n\neq -1)$
 $\sin ax$  $-\frac{1}{a}\cos ax + C$
 $\cos ax$  $\frac{1}{a}\sin ax + C$
 $\sec ax$  $\frac{1}{a}\tan ax + C$
 $e^{ax}$  $\frac{1}{a} e^{ax} + C$
 $\frac{1}{x}$  $\ln{x} + C$
  • $\delta A = y \delta x$  =>  $\int dA = \int y(x) dx $   或   $\int_{A_{x0}}^{A_{x1}} dA = \int_{x_0}^{x_1} y(x) dx$
  • $\sin^2 x =\frac{1}{2}(1-\cos 2x) $

Kepler 1st Law:行星循橢圓軌道圍繞焦點上的太陽運行

回到 Kepler 1st Law 的證明,今次更多需要用到微積分的技巧。溫習過後,從維基就可以找到看得明白的證明。以下開始前先再補充一下背後是什麼回事。當初人們相信地球的公轉軌道應該是完美的圓,但後來從觀察發現似乎是橢圓軌道,這怎樣解釋呢?天上的世界不應該是完美的嗎?......直到牛頓發現了描述物體運動和引力的數學方程式,我們就是要由這些工具導出橢圓形的公轉軌道,原來,數學邏輯和物理規律就是背後的自然原理。 

現在,我們想得到一條形容地球位置的方程式,而這結果中的方程式應該會符合橢圓方程。我隨著物理量的定義和物理關係的理解,手上有大堆砌圖板塊有關,部分是「質量」、「引力常數」等不會隨時間變化的量,變量部分例如地球在軌道上運行時的「位置」、「速度」、「加速度」。而其實,速度是位置隨時間的變化:加速度是速度隨時間的變化;透過形容這些位置衍生量(Derivatives)關係的方程,去找出形容位置的方程,就是求解「微分方程」所能做的事。

從動量 $L= \omega mr^2 = \frac{d \theta}{dt}mr^2$ 開始。設 u=1/r。

$\theta$ 的一次導數:
\begin{align}
\dot{\theta} = \frac{L}{mr^2} = \frac{Lu^2}{m} \\
\end{align}

根據 Chain Rule 和角動量 $L=\dot{\theta}mr^2$,$\frac{d}{dt}$ 的表達可以轉化為 $ \frac{d}{dt} = \frac{d\theta}{dt}\cdot\frac{d}{d\theta} = \frac{L}{mr^2}\cdot\frac{d}{d\theta}
= \frac{Lu^2}{m}\cdot\frac{d}{d\theta} $

r 的一次導數:
\begin{align}
\dot{r} = \frac{d}{dt}(r) &= \frac{d}{dt}(\frac{1}{u})  \\
&= \frac{Lu^2}{m}\cdot\frac{d}{d\theta}(\frac{1}{u})  \\
&= \frac{Lu^2}{m}\cdot-\frac{1}{u^2}\frac{d}{d\theta}(u)  \\
&= -\frac{L}{m}\cdot\frac{d}{d\theta}(u)  \\
\end{align}

r 的二次導數:
\begin{align}
\ddot{r} = {\frac{d}{dt}}^2(r) &= \frac{d}{dt}(\frac{d}{dt}(r))  \\
&= \frac{Lu^2}{m}\cdot\frac{d}{d\theta}(-\frac{L}{m}\frac{d}{d\theta}(u) )  \\
&= -\frac{L^2u^2}{m^2}\cdot\frac{d}{d\theta}(\frac{d}{d\theta}(u) )  \\
&= -\frac{L^2u^2}{m^2}\cdot{\frac{d}{d\theta}}^2(u)  \\
\end{align}

準備有關做成「引力」和「圓周運動」的向心加速度方程式
\begin{align}
a &= -\frac{GM}{r^2} + r{\omega}^2   \\
\ddot{r} - r \dot{\theta}^2 &= -\frac{GM}{r^2}  \\
\end{align}

把 $\theta$ 和 $r$ 的導數放進去,會整理出一條二階微分方程。
\begin{align}
-\frac{L^2u^2}{m^2}\cdot{\frac{d}{d\theta}}^2(u) - \frac{1}{u} \frac{L^2u^4}{m^2} &= -{GMu^2}  \\
{\frac{d}{d\theta}}^2(u) + u &= \frac{m^2}{L^2u^2}\cdot{GMu^2}  \\
{\frac{d}{d\theta}}^2(u) + u &= \frac{GMm^2}{L^2}  \\
\end{align}

$u$ 的一個特解是 $\frac{GMm^2}{L^2}$ 。以及相關的齊次微分方程 ${\frac{d}{d\theta}}^2(u) + u = 0$ 。這個形式的齊次微分方程的解是:$C\cos(\theta-\theta_0)$。

所以完整的一般解是:$u = \frac{GMm^2}{L^2} + C\cos(\theta-\theta_0)$

取 $\theta_0$ 令 $\cos(\theta-\theta_0)=-\cos\theta$;和設 $e = C \frac{L^2}{GMm^2}$,代入後得到 $ \Rightarrow u = \frac{GMm^2}{L^2} (1- e\cos{\theta})$,所以:
$$  r = \frac{L^2/GMm^2}{1-e\cos{\theta}}$$


對比圓錐曲線的方程式:$r = \frac{l}{1-e\cos{\theta}}$ ,對於 $0<e<1$ 會得到橢圓;$e=0$ 會得到正圓軌道;$e=1$ 會得到拋物線軌道;$e>1$ 會得到雙曲線軌道。可以留以到,圓形或拋物線都是一種特例(圓形應該更難得)。如果系統轉動的動量夠大的話,會沿雙曲線軌道接近後飛走;動量不夠大的話,就會被捕獲而循橢圓形軌道公轉。 這些留下來的天體,如太陽系的行星,吸引到開普勒綜合出他的第一定理。

2017年10月17日 星期二

[Math] Derivation of Kepler's Law (Part 1) 和 Briefing on Conic Section

上周提到在重溫《改變世界的17個方程式》。書的第 3、4 篇寫到有關微積分的 $\frac{\text{d}f}{\text{d}t} = \lim_{h \rightarrow 0} \frac{f(t+h)-f(t)}{h}$ 和萬有引力公式 $F=\frac{Gm_1m_2}{d^2}$ 。這書也寫到 Isaac Newton(牛頓) 和 Robert Hooke(虎克) 誰發現萬有引力的爭議,以及牛頓寫成的數學式驗證了 Johannes Kepler(開普勒)行星軌道定律,這個實際應用上的貢獻。開普勒從大量的觀察數據和自身的數學能力,綜合出有關行星軌道的三條定律,在實際運用時比傳統的圓形軌道計算更接近觀察,所謂「The truth is out there」,雖然當時未必明白定律背後的原理,但絕對是當時天文學上的偉大發現。這直到牛頓的出現,1687發表的《自然哲學的數學原理》(Mathematical Principles of Natural Philosophy),一口氣涵蓋了微積分的基本概念、物體運動三大定律、有關引力性質的方程式,從而數學化地推導出開普勒定律,等等⋯⋯ 看到這些,就想起中學數學老師說過他也曾嘗試推導開普勒定律,是用當時我們所學的程度就足夠,現在想來大概是想鼓勵我們嘗試吧。嗯... 我旦求明白就好了。

開普勒三大定律
一:行星循橢圓軌道圍繞焦點上的太陽運行;
二:行星運行時,行星與太陽的連線,在相同時間內所掃過的面積相同;
三:行星公轉的周期平方和橢圓軌道半長軸的立方成正比。 $T^2 \propto a^2$;


《自然哲學的數學原理》據 此連結 分為三篇,開始時先下了有關 質量(m)、動量(mv)、 慣性、力(F)、向心力、向心加速度的八個定義,提出三大運動定律,及其推論。第一篇討論與微積分有關的定理、萬有引力定律和行星運動;第二篇討論介質對物體運動的影響。第三篇討論萬有引力理論在天體運動上的應用。現在物理課學到 Newton's Laws 時,大概也沒有提到這是牛頓為了天體運動的研究。

2017年10月5日 星期四

[Math] 重溫 畢氏定理 及 對數運算公式( Also: Euler's Number e)

問題:試證明長方形 BPDE 的面積等於 $a^2$。
(提示:證明三角形 ABF 與 EBC 全等。)
今個月翻借了這本書《改變世界的17個方程式》來看,回顧一些重要的公式,開首第一篇就是直角三角形的畢氏定理 $a^2+b^2=c^2$。雖然知道畢氏定理的證明有很多很多,但慚愧一直沒有記得過怎樣證明畢氏定理。於是今次上網看看,原來經典的證明就已經很簡單,以 Euclid 在《Elements》中的證法為例,用到全等三角形、和三角形與矩形間的面積等化,只要幾步就可以完成。

2017年9月17日 星期日

[R] Tidyquant 的練習-利用200天平均線的測試

最初大約是3-4月,當時參加了一個 R User group的 Machine Learning Beginner 的課堂,接觸到 "tidyverse" library。Tidyverse" 中的 "dplyr" 在數據整理上十分方便,不過課堂中處理的都是一些非時間序列的數據,好奇在時間序列的股票方面有什麼好工具可以使用呢?那時候開始留意到有一個叫 "tidyquant" 的 R Library,就一直想找時候來學習一下。例如,好不好把之前的股價研究換成用 Tidyquant再試一次?終於,上星期在 Feedly 看到一篇評論信報某專欄的blog post,就正好用這研究來作為練習,有興趣的話建議先看以下兩篇原文:

分析數據還是以數據「作」分析呢?
https://htmichael.blogspot.hk/2017/08/blog-post.html

【EJFQ信析】港股未脫超買 不離三種下場
http://www2.hkej.com/instantnews/market/article/1636469


2017年8月26日 星期六

小型四驅車改造工作坊-RC Mini 4WD-繼續玩 手機的藍牙遙控+3D打印

周日參加了一個由 Loftwork, FabCafe 在青年廣場舉辦的遙控小型四驅車工作坊,將從前孩童時期玩的模型四驅車底板改造成手機遙控的四輪車。

這組遙控車的轉向原理,與去年淘寶購入玩的自組Arduino 小車不同 (參考上年的這篇:<Android + Arduino 小車的手機藍牙遙控計劃> )。今次是由一個 DC馬達 驅動後輪,和一個 Servo馬達 控制前輪左右轉動的方向。(而之前的Arduino小車是用左右兩個DC摩打,分別控制左右兩邊前輪的轉速);同樣透過藍牙連接後可以用手機的Apps控制。整套電子和手機部份都已經有現成的印刷電路板(PCB) 和App Store上的Apps可以使用,

前輪和之間的白色部份,就是打印出來作轉向之用的,3D Print的檔案公開在網上 https://www.thingiverse.com/thing:2230768 。雖然之前都聽過3D 打印成品都比較粗糙,不過多數所見都是已處理好的成品,今次就接觸到未磨好的列印件,所以工作坊當日就有不少時間是用來研磨這些3D打印出來的特製膠件,有些螺絲孔在自己回家還是用電鑽把它再開通開通,Servo與連接杆的接駁位置最好也加個扣穩固一下,前輪才不會亂擺。另外的一些金屬配件就是各種螺絲、墊片等,除此以外就是小型四驅車 TAYIMA - VS Chassis 本身的底盤組裝了。



在後輪馬達上的電路板可見以下這組字,找到那應該就是它的藍牙模組 BLE-113,作用好比之前所用的HC-06藍芽模組,用作手機的藍牙遙控。
   Model: BLE113    
IC: 5128A - BLE118
   www.silabs.com    
Bluegiga BLE113:  https://www.silabs.com/products/wireless/bluetooth/bluetooth-low-energy-modules/ble113-bluetooth-smart-module


2017年8月17日 星期四

Data Science UnHackathon - 加密貨幣,開放數據

這天去了一個以 Data Science 為題的團體所舉辦的 UnHackathon Meetup,https://datasciencehongkong.com/2017/08/22/unhackathon-at-the-hive/。半日時間加上Meetup/性質算比較小規模,不過都有幾組實際地寫出一些Code和有可以展示的結果,至於我在自由的環境下,就只做了花生組中的一員,哈哈~今日也留意到一個香港的hackathon現象,就是香港人還是花生友多,外國人和學生才比較認真。不過另外也聽聞今次的花生比例還己經算低了,今日的 5:1 可能出面己經是1:5。而相比之前的一些IT event,這種Data Science 的活動有個好處,就是R 和 Python 明顯是大家的共同語言,之前那些更著重實際去寫一個應用,就偏向JS, Java, Python,Data Science的角色很少,之前講起R,在開發的導向中真的找不到什麼存在價值。(其實,R就是統計起家的吧,而在這場數據科學熱之中的Machine Learning都去到很多人無需要留意前設或者原理,的純IT Coding知識......)

傾計之前都有留意一些有興趣的題目,首先是一個有關虛擬的加密貨幣Cryptocurrency投資策略,只是我未了解這些虛擬貨幣的交易,例如周初才知道比特幣升穿4000USD,而電視上一個市場解讀是連繫到特朗普作風下的地緣風險,我就未有理解過的,到本周中又繼續上到4400USD了。在策略方面的取向也不同,一向覺得 投資市場內小投資者做短期投機相對風險和心力之下,利潤空間不大;在單一貨幣的Time Series中研究也未必有多大策略的空間。不過這次才體會到,原來至今已發展到市場上幾百種的加密貨幣,從平日多見到 Bitcoin 比特幣 (佔市值50.7%)、 Ethereum 以太幣 (市值佔19.9%),到俗稱Alt-Coins的大量後起的仿效品;也有眾多的交易所同樣進行虛擬貨幣的交易。所以,一些考慮的方向就是這種多貨幣、多交易所的亂象中套利。不過這就是講求Product Knowledge 多於 Statistics 的時候。

至 2017-08-17,https://coinmarketcap.com/ 上超過800種加密貨幣的市值合共 USD$142,970,123,566。需要數據的話,也有一個以JSON格式提供資訊的API:https://coinmarketcap-nexuist.rhcloud.com/


交易所方面比較多見到提及的就有外國的Coinbase、Poloniex;中國的BTCC、OKCoin、CHBTC 等;香港在各處實體的比特幣ATM,到ANX、Gatecoin;台灣也有所涉獵:http://blockcast.it/2017/05/24/introduction-of-local-and-global-cryptocurrency-exchanges/


另一個有興趣的題目是有關Web Data Extraction,提出的人也是今次的主辦者。在開放數據中,香港在開放數據方面的落後已經是經常被咎病了吧,從資料類別、原始程度、開放程度、到檔案格式等問題,不過當日就只是一個網頁資訊擷取的主意,也未見其他人勾起興趣,所以未見有人發展下去。但現在事後想來,如果做到一個像 https://webb-site.com/ 那樣眾多資訊(期望是自動更新),而介面外貌比較好的網站,應該也會是很好的經驗。另外,或許除了不斷『說』開放數據的意義和重要性之外,如果有人專門以開放數據來做研究分析,或許可以透過實際應用的結果,去勾起香港人/政府部門 對這方面的注意。

最後,在聽了當日成果的發佈後,原來自己在這個Blog嘗試過的項目,也有其他人有興趣做類似的東西,也許這個門外漢的興趣都有點意思。這個Blog的紀錄也起碼讓自己儲起生活中嘗試過的結果和方法,有需要時也可以找回這些Source code來加快實作。最後,花生友閒聊之中見識到一間做 保險科技 平台的Startup人,問到一些從前台介面到後台運算的語言選擇,有點欣慰自己早前所嘗試學習的 JS 也許是正確選擇;與Java等相比,Python也許不應放下。

忙完上幾個月的家居事宜,是時候繼續記待記的:有機蔬果、 Tidyquant、ML4B #4、Gym、PMP, etc..... ^_^



2017年6月25日 星期日

[PowerShell] [Office] 自動執行應用程式之間的複製貼上

簡單的補充一篇早前返工時的嘗試,大概這個方法還可以用在其他平台/情況。

話說有個軟件的用家介面在顯示一些設定資料的版面上,沒有「匯出」功能,只讓人逐格地Copy & Paste。不想人手這麼耗時,就找方法來自動Copy&Paste抄寫到Excel中。

# 用家設定參數, 
# $count: 這裡預執行次數=行數-1;
# $winTitle01: Copy的應用程式標題; 
# $winTitle02: Paste的應用程式標題;
param(
$count = 36, 
$winTitle01 = "This Platform x.xx  [ USER - ENVIRONMENT ]",
$winTitle02 = "Book1 - Excel"
)

add-type -AssemblyName microsoft.VisualBasic  #載入VB的部件。
add-type -AssemblyName System.Windows.Forms  #載入System.Windows.Forms的部件。

start-sleep -Milliseconds 1000 #暫停1000微秒
#For-Loop 執行for ($i = 1; $i -lt $count; $i++) { 
    Start-Sleep -Seconds 1  #暫停1秒
  [Microsoft.VisualBasic.Interaction]::AppActivate($winTitle01)  #啟動已在執行中的應用程式。
  [System.Windows.Forms.SendKeys]::SendWait("{DOWN}^(c)")  #傳送指定的按鍵至使用中的應用程式,然後等待訊息的處理。
    Start-Sleep -Seconds 1
  [Microsoft.VisualBasic.Interaction]::AppActive($winTitle02)
  [System.Windows.Forms.SendKeys]::SendWait("{DOWN}^(v)")
}

Powershell - Add-Type
https://ss64.com/ps/add-type.html

MSDN - Interaction.AppActivate Method (String)
https://msdn.microsoft.com/en-us/library/x57y7863(v=vs.110).aspx

MSDN - SendKeys.SendWait Method (String)
https://msdn.microsoft.com/en-us/library/system.windows.forms.sendkeys.sendwait(v=vs.110).aspx

MSDN - SendKeys Class - KeyStoke的對應表
https://msdn.microsoft.com/en-us/library/system.windows.forms.sendkeys(v=vs.110).aspx

2017年6月1日 星期四

[PowerShell] [Office] 快速完成文字檔「搜尋取代」字串的工作

這張圖的設計者應該就是Developer,我也幾喜歡這張圖,但我畢竟不是IT (所以出來寫的code大概在專業眼中會看出奇怪,用的程式也雜亂)。在營運部門的工作中有時接到奇奇怪怪的問題和要求,應不應該做、如何做,都是要討論的問題。其中一個就算要做也是相關的技術部門比我們更適合處理的情況,就是一些批量處理資料庫數據的情況,最近就有個類似的情況。也許我應該也要多站在後面抱頭、蒙眼、尖叫⋯⋯

2017年5月29日 星期一

[JS] 用 NodeJS 製作記錄日間股價的csv檔(Yahoo Finance)

學習Node.JS 有兩個目標希望可以寫到的,一個是自己的後台程式可以按需要查詢自定的指標,二是在日間抓取 網上免費的「即時」股票報價 ( Intraday Data),儲存做本機上的數據庫。兩個需求都在過往星期有所進展,比較接近完成的是日間股價的數據庫。

這個數據庫的建立可以分為兩大部份,首先要可以定時提取數據源的財經數據,免費的當然要數Yahoo Finance,可以自行寫GET request 去用他「隱藏」的接口拿數據,(這是Yahoo Finance 的 CSV API,用Excel的話會用到這方法,它另外還有一套下載歷史股價的方法就好像在這次改版中失效了。以往Yahoo和Google都有股價的API,但似乎在逐漸放棄。原本Yahoo都有寫一些 License上不可 redistribute / commercial usage 的條款,但現在根本連這個功能的說明版面都找不到了)。另外也有現成的Node package,我就當然懶得 Reinvent the wheel,所以這方面就用現有的 node-yahoo-finance。雖然這個Yahoo的API可以有historical 和snapshot的數據,但免費數據一般都沒有即時更新,Snapshot固然一般有15分鐘滯後,所以一定要看Last-Trade-Time。Historical 的也可以留意到一些日子的Close 和ratio數據有點奇怪,引申到52周高低有點問題,大概免費的東西質量總是少點保證的,所以如果打算直接使用的話,一定要小心,不然類似出現 Fat Finger Error 就慘慘了 ( T_T ) ~~

Node package: yahoo-finance

今次的目的是想做一個 Intraday 的數據庫,讓之後可以有數據基礎去研究分析。因為會經過檢查,所以要求並不高。先安裝node-yahoo-finance:
$ npm install yahoo-finance --save

NPM - yahoo-finance
Github - pilwon/node-yahoo-finance
(留意Yahoo在改動原本的API接口 -16May2017,不過見一些常用的field依然可用。open-source的強大之處就是己經有高手去解決 26May2017,原來的snapshot() 功能將被棄用,由新的quotes()。historical() 聲稱不受影響。)

要知如何使用,最好先對Yahoo Finance的接口有點經驗。例如在網址上試試輸入:
http://download.finance.yahoo.com/d/quotes.csv?s=^HSI+0005.HK&f=nsl1t1opc1p2&e=.csv

2017年5月18日 星期四

[JS] Node.JS 開始使用 Express 和 Express-Generator

繼續之前的<Node.JS>記錄。開始了Node.JS的學習,當可以架設到一個簡單Server之後,在Coursera找了一個Node.JS的 Open Course (這應該有三個星期前了)。下一步就是用Express模組來建構同樣的伺服器端程序,Express是一個Node.js 的Web應用程式架構,方便創建各種Web應用、APIs等。今後就會用到它實現旳路由控制(Route),去代替之前要自行寫代碼解析URL中的的請求;用它對模板(Template)的支援,去更方便地回傳HTTP的內容。另外,還會多看幾個模組:Morgan、body-parser,這些稱為Middleware的東西。最後會用Express Generator去生成Express架構。

Express

首先,為你的新專案開啟一個新資料夾,cd到這個資料夾中:
$ npm init  //用npm init開始建立一個專案
$ npm install express --save  //安裝Express, 新增至相依關係清單

例子: server-1.js 。可以看到己經在使用app.get、res.send,去代替url的解析工作和內容顯示:
var express = require('express');
var app = express();

app.get('/', function (req, res) { //當收到 "/" 這個請求時,回應下面的 "Hello World!"
  res.send('Hello World!');
});

app.listen(3000, function () {
  console.log('Example app listening on port 3000!');
});

METHOD 可以使用的 GET, POST, PUT, DELETE 的作用好比: Read, Write, Append, Delete。
路由定義的結構:app.METHOD(PATH, HANDLER)。其中一種 app.all() 是所有的request都會被觸發,適合處理必需執行的部份。下面的例子中應用到。