2016年3月23日 星期三

雲端機器學習上手篇-以非監督式學習演算法為例

由於筆者對於數據分析都非常有興趣,也因為工作關係需要接觸到各種不同的雲端數據分析工具,繼上次筆者分享過「透過Python與Spark做氣象大數據分析」是屬於IBM Bluemix的服務,這次筆者要分享的是關於2015年2月微軟推出的Azure Machine Learning工具,有興趣的朋友可以從這裡選擇「Guest Access」快速進行試用。或是申請一個帳號,依照筆者的步驟執行,進行Microsoft Azure Machine Learning(MAML)的體驗。

過去在實務上經常發現要做一個數學模型與系統整合一起應用,是非常困難的一件事情,通常作法是需要先請統計學家設計好數學模型並驗證後,再交由軟體工程師進行系統整合,然後再依照市場需求做調整,再這樣反覆的過程中,統計學家改模型,軟體工程師調整系統,人力物力都消耗非常多。



在微軟這套Azure Machine Learning有幾個讓筆者覺得很方便的地方,筆者條列如下

  1. 應用模型即刻上線
  2. 多種現成應用選擇
  3. 採用拖拉互動介面
第一「應用模型即可上線」就是機器學習後的模型可反覆利用之外,還可快速佈署到雲端上,以筆者為例,要預測汽車價格,可在二十分鐘內完成模型佈署。第二「多種現成應用選擇」在Azure上有許多使用者分享了數學模型可以馬上使用,像是預測汽車價格、電影推薦、更多......等。第三是「採用拖拉互動介面」介面使用容易,類似SPSS、SAS的概念,都是採用資料探勘的流程來進行資料分析。


接下來在本次的體驗中,我們採用最經典的安德森鳶尾花卉數據集(Anderson's Iris data set)為例,並使用非監督式學習(Unsupervised Learning)方法中的K-means演算法來進行實作,以快速體驗雲端機器學習的便利性。

首先大家須先登入Microsoft Azure的介面,目前Azure新版的介面只要使用到Azure Machine Learning都會跳轉到舊的介面,因此就參考筆者以下的畫面,照著操作即可。

首先選擇機器學習服務。



選擇「新增」,並點選「快速建立」,我們可以在工作區名稱上,建立自己的工作區名稱,像是ML這樣的名稱。



接著進入工作區之後,點選下方的「在Studio中開啟」的選項,進入MAML的使用介面。


接著我們必須點選「DATASETS」去上傳資料集,將資料做上船的動作,我們採用這裡的資料,這是一份相當經典的示範資料集,只要到Google搜尋iris csv就有許多參考資料,資料中有150筆資料與5種資料欄位,下載之後我們點選「NEW」如下圖所示。


接著點選「FROM LOCAL FILE」將資料進行上傳的動作。


接著在介面上面直接「選擇檔案」,將檔案選好之後,點選右下角的勾勾,就可以進行上傳。


接著點選「EXPERIMENTS」,再點選下方的「NEW」。


接著我們會看到許多Machine Learning Samples,不過我們今天要自己做一個,所以點選「Blank Experiment」可以產生新的實驗環境。


接著看到工作區後,我們可以在下圖紅色框中輸入這個專案的名稱,像是筆者輸入「My First Azure Machine Learning Case」,接著就可以開始實作囉!


首先我們從「Saved Datasets」裡面的「My Datasets」將剛剛上傳的資料集「iris.csv」整個拖曳到右邊的工作區。


接下來我們可以很快的對這個資料集做資料視覺化(Visualization),這是筆者覺得滿方便的地方,使用者只要一個右鍵,就可以對資料集做初步的了解。


這個簡易的資料視覺化目前可以透過盒鬚圖(Box-plot)、長條圖(Bar Chart)、平均數(Mean)、中位數(Median)、最小值(Min)、最大值(Max)、標準差(Standard Deviation)......等統計資訊去觀察資料的狀況。


接著原始iris資料集裡面包含萼片長(Sepal length)、萼片寬(Sepal width)、花瓣長(Petal length)、花瓣寬(Petal width)、種類(Species)共五個欄位,我們先拿掉種類(Species)的欄位,這個欄位並不適合放在這個學習模型中,因此我們在下圖左邊紅框中搜尋「Project Columns」將他拖曳到工作區。


接著點選iris資料集的圓點,拖曳到「Project Columns」的圓點,讓兩個功能做一個連線,如下圖所示。

接著點選「Project Columns」,並點選右邊紅框的「Launch column selector」按鈕。


接著選擇「WITH RULES」→「ALL COLUMNS」→「Exclude」將「Class」欄位做排除的動作,如下圖示意。

因為一般來說,我們必須將資料分割成訓練集、測試集才能進行實驗,因此我們必須進行資料切割,這邊使用「Split Data 」,我們找到他之後,將他拖曳到右邊工作區。


接著一樣與Project Columns做連線。


接著我們點選「Split Data」的功能,輸入分割的比例,如下圖紅框所示,輸入0.7表示分割成訓練集70%,測試集30%,如果要分6/4就要輸入0.6,以此類推。


接著我們要有一個控制模型輸出的地方,找到「Train Clustering Model」之後一樣拖曳到右邊工作區。


接著我們將「Split Data」左下的訓練集(70%)拉到「Train Clustering Model」的右上角的圓點上,表示將訓練集放進去。


接著我們在Machine Learning裡面找到「K-mean Clustering」這就是今天我們提到的非監督式學習(Unsupervised Learning)演算法的一種,我們將他拖曳到工作區。


將「K-mean Clustering」的圓點連線到「Train Clustering Model」的左上角圓點,表示我們要使用該演算法建立模型。


因為集群計算之後,都需要設定集群結果給資料集,所以我們要使用「Assign to clusters」這個功能配置模型預測結果。


接著將「Train Clustering Model」左下角的圓點,與「Assign to Clusters」上方的圓點進行相連。


最後我們要再使用「Project Columns」將運算結果輸出,所以一樣找到「Project Columns」然後拖曳到工作區。


接著我們會看到很多個元件上都有紅色驚嘆號,因為我們都還沒幫他設定資料的輸入或輸出。


不過沒關係,我們繼續將「Project Columns」再拖一個出來,將「Train Clustering Model」的右下角圓點與它做連線,這個動作主要是將原始的資料做輸出,不做也能完成實驗。


接著如上面所述,我們將「Train Clustering Model」與它做一個連線,如下圖所示


接著我們要開始針對這些放上去的元件做參數設定,我們先從「K-mean Clustering」開始,我們將他的中心數(K)設定為3個,也就是要分成3群。

接著我們點選「Train Clustering Model」的「Launch column selector」按鈕。


將他的輸入設定成包含萼片長(Sepal length)、萼片寬(Sepal width)、花瓣長(Petal length)、花瓣寬(Petal width)四個欄位,如下圖所示。

接著我們將「Assign to Clusters」右上角的圓點與「Split Data」右下角的圓點,也就是測試資料集做連接,如下圖指標所示。


接著我們選擇「Assign to Clusters」的「Launch column selector」按鈕,設定要使用的欄位。


一樣包含萼片長(Sepal length)、萼片寬(Sepal width)、花瓣長(Petal length)、花瓣寬(Petal width)四個欄位,如下圖所示。


接著我們對最後一個「Project Columns」做個設定。


注意這邊除了選擇包含萼片長(Sepal length)、萼片寬(Sepal width)、花瓣長(Petal length)、花瓣寬(Petal width)四個欄位之外,還要再選擇「Assignment」,如下圖所示。

接著點選「SAVE」,再點選「RUN」。


接著會看到運行時間,因為資料不多,所以在幾秒內即可完成。


接著到這裡會出現下面錯誤,就是「Project Columns」找不到「Assignment」的問題,如下圖所示。


不過沒關係,我們只要到「Project Columns」裡面,再點選「Launch column selector」。



然後把剛剛選的「Assignment」刪掉再選一次即可,筆者推敲問題的原因是,模型還沒計算,所以第一次不會有「Assignment」的結果,所以要再設定一次。


接著再「SAVE」與「RUN」一次


接著我們就可以點選「Project Columns」裡面的「Visualize」就可以看到分群的結果。



我們可以發現測試集的45筆資料,多了一個「Assignments」並且裡面分了0、1、2共三個群。
這就是我們初步的成果,不過還沒結束,接下來我們想把模型應用到系統上。


我們將要進行機器學習與系統整合這塊實作,在「Web Service」裡面,我們拖曳出「Input」。


接著將「Web service input」 與「Project Columns」做連接,表示新的資料有一部分會從這裡輸入。


接著我們將「Output」也拖曳到工作區,並將「Assign to Clusters」的下方圓點與「Web Service Output」做連接。


接著我們點選「SAVE」、「RUN」。


運算完之後,我們點選「SET UP WEB SERVICE」裡面的「Predictive Web Service」進行系統佈署前的設定。


接著可以看到Azure自動將我們的模型與系統做流程調整。


設定完之後,再做一次「SAVE」、「RUN」,將系統模型做儲存。


接著我們再點選一次「SET UP WEB SERVICE」就可以讓我們的演算法轉成API給系統使用,API全名為應用程式介面(Application Programming Interface),通常就是系統與系統間做傳輸共通標準,有了這個標準後,工程師不管寫甚麼系統,都可以直接透過API跟模型做連接,這個就是筆者覺得很方便的地方,因為這樣資料科學家就可以專注做模型即可。


獲得API之後我們可以做一個簡單測試,點選「Test」。


我們嘗試在框框中輸入萼片長(Sepal length)、萼片寬(Sepal width)、花瓣長(Petal length)、花瓣寬(Petal width)四個欄位的新數字,也就是我們想要透過我們的模型去預測它的分群。

點選確認之後,我們就會在下方看到預測結果,筆者依次輸入1.2、1.5、1.7、1.9,他就被分到第1群(我們共有0,1,2三群)。


接著我們想要佈署到系統上,Azure很貼心的準備了C#、R、Python樣本程式碼,我們點選下圖左邊紅框的選項。


除了一些API使用說明之外,這裡就附上了三種語言的樣本檔案。


在每個程式碼當中,都需要加入api_key才能使用。


API KEY的內容可以參考筆者下方紅框中的資料,每個模型都有屬於自己的API KEY,所以不用拷貝筆者的。


接著做了替換之後,如果您是像筆者是寫Python 3,那就必須再做一些程式碼調整,如下圖紅框所示。


接著我們可以在Values裡面輸入我們想要預測的數字,執行之後就可以看到相同的結果。


下圖中,上面是用Test的結果1.2,1.5,1.7,1.8被分到第1群,下面使用Azure樣本python程式碼,一樣也是被分到第1群。


之後就可以把這段程式碼修改並佈署到相關的系統當中。

以上就是雲端機器學習的上手教學,希望能協助讀者做初步雲端機器學習體驗。

2016年2月22日 星期一

透過雲端服務與Node.js打造車聯網大數據分析平台

車聯網(Internet of Vehicles)已經是今年在汽車界熱門的議題,從McKinsey去年的物聯網報告來看,車聯網可以做的事情共有六種,包含「改善汽車的安全與可靠度」、「維修服務推薦」、「加強汽車連結」、「加強客戶體驗」、「提供保險動態價格」、「增加車隊效率與降低成本」,但是做這些事情之前基礎設施就變得非常重要,如果沒有一個好的雲端平台去收集資料、儲存資料、分析資料,就無法與前面提到的服務做整合。

因此本次教學筆者嘗試使用了一個雲端平台(IBM Bluemix)去進行車聯網的系統實作,希望透過一個簡單的實作,讓有興趣的朋友能掌握技術要領,並實際體驗車聯網的初步成果,如下圖所示。



首先我們必須要有Bluemix帳號,進入了平台以後找到,在型錄裡面,找到「Internet of Things Platform」,如下圖所示:


接著點選他,然後在Service Name上面打入我們的服務名稱,像筆者就打「iotcc」,然後點選「Create」將服務進行啟動,如下圖:


之後您回到自己的儀錶板,就可以看到如下的畫面:


接著點選服務名稱,以筆者為例是「iotcc」,點進去以後,再點選「Launch Dashboard」,如下圖:


接著點選IBM Watson IoT Platform的「Devices」選項。


選擇「Add Device」進行新增裝置。


首先我們必須先建立汽車裝置的裝置類型,因此點選「Create Device Type」進行裝置類型新增。

點選「Create device type」的選項。
輸入裝置的一般資訊,包含名稱、描述,筆者這邊分別填「Vehicle」與「Internet of things」,然後點選Next。
以下的幾個步驟,都是針對裝置的細部描述做紀錄,建議都先以「Next」做跳過的動作,


創建完基本的裝置樣本之後,直接在下個畫面中選擇建好的「Vehicle」裝置樣本,並點選「Next」進行裝置的建立。
接著我們新增第一個車聯網裝置「vehicle1」
接著一直下一步到取得裝置的連接號碼:



注意:到這裡的時候,就要記錄下vehicle1的存取ID與相關資料。
筆者在這個時候就會把上面紅框的資料做紀錄,等下要放到車聯網平台上。
接著以此類推,做兩次,將「vehicle2」、「vehicle3」完成另外兩個裝置的設定。

接著我們到「ACCESS」去獲取組織的ID,如下圖所示:
選擇「api keys」然後點選「Generate API Key」,如下圖所示:
接著紀錄一下下圖中的API Key,等下我們會放到程式當中。
到這一步,終於完成IBM Bluemix上的裝置設定,接下來我們要寫一個範例去進行佈署的動作,筆者修改了一個國外的範例給大家下載,如果無法下載可到筆者GitHub下載,裡面包含了兩份檔案:
  1. 檔案「iotcc」為預計佈署到雲端上的車聯網軟體,主要用Node.js、HTML、CSS所撰寫
  2. 檔案「cf-cli-installer_6.15.0_winx64」進行Git Push的工具
首先解壓縮後打開「manifest.yml」檔案,修改您的服務名稱,以下圖為例:
請輸入
host:connectedcar
name:connectedcar
instances:3 (指3台裝置)
接著到public\config資料夾裡面,打開「settings.js」檔案,將前面申請的裝置與組織ID都輸入到該檔案當中,如下:
iot_deviceType:
輸入我們在前面建立的「Vehicle」。
iot_deviceOrg:
輸入在前面裝置申請時獲得的「Organization ID」,如:k8buaf。
iot_deviceSet中的deviceId與token:
輸入前面裝置申請獲得的Device ID,token的部分則輸入Authentication Token如:A!ggkk99y_sstbt)vY

最後是填入組織的ID
iot_apiKey:輸入前面申請到的API Key
iot_apiToken:輸入前面申請的Authentication Toke

大致上設定完成,最後我們要Cloud Foundry的工具,將車連網服務佈署到雲端平台上,因此要安裝「cf_installer」,基本上一直下一步就可完成安裝。

接著我們打開CMD,進行登入的動作,如下圖所示,筆者先切換到iotcc資料夾底下,打入「cf login」的動作,使用一開始註冊的帳號密碼登入即可。

登入成功後會顯示下面畫面。

最後打入「cf push」進行Deploy的動作

看到下圖畫面表示已經佈署成功。

最後輸入http://<您設定的host名稱>.mybluemix.net,即可看到服務,也可參考筆者下圖成果。


接著可以透過「互動」的功能達到跟模擬汽車互動的動作。

時間的關係,這次就先暫時介紹到這邊吧!



2016年1月26日 星期二

2016年台灣巨量資料(大數據)、資料科學家相關課程 (更新時間2016.07.17)


很快的新的一年又開始了,筆者已經持續整理資料科學相關課程長達兩年,今年也一樣整理相關課程與上課時間給有需要的朋友查詢。



工研院
資策會
MIC產業顧問學院
三星課程網
木刻思
東吳大學



歷年資料參考:


2015年12月19日 星期六

車聯網的即時服務架構-以Uber為例

大數據的架構是很有趣的,因為牽涉既有傳統的資訊設施,也需融合新擁有的數據儲存與分析設施,而且在不同的使用情境下,架構也不相同。

因此想切入大數據的公司,常常面臨到的問題除了「不知要如何開始」之外,就是「要如何建構可以容易擴展的平台」,以及在最節省資源的情況下,如何給予使用者最佳的服務。而筆者所協助的公司,也常常面臨到技術太多無從選擇,導致不知道如何將新技術配置到架構上。因此大部分的大數據專案常常因為「想做的題目太多,不知如何做起」、「技術太多種,不知從何用起」導致上層也無法承擔與拿定主意,最後不是中途喊卡,就是專案失敗。


近幾年車聯網(Internet of Vehicles)的議題開始被討論,而筆者也正在觀察這種不同聯網的技術架構,因此就以最近由優步(Uber)的首席系統架構師Matt Ranney發表的文章中,它們透過開放原始碼建構的即時服務平台Disco,從中整理一些車聯網建構即時服務系統的方式。

首先我們可以從Uber的現有狀態來觀察,甚麼樣的需求,會需要建置這樣的服務平台? 從Uber的全球服務來看,他們每秒必須面臨一百萬筆Uber車子的Geospatial的索引,以及數千個節點的連接。

Uber整理了幾個他們從2009年開始至今約6年間採用的技術,包含「Node.js」、「Python」、「Java」、「Go」、「Native applications on iOS and Android」、「Redis」、「Postgres」、「MySQL」、「Riak」、「Twitter's Twemproxy for Redis」、「Google's S2 Geometry Library」、「ringpop」、「TChannel」、「Thrift」,筆者針對這些技術,整理技術概要介紹如下:

  1. Node.js
    Node.js從2009年誕生之今,也是約6年期間。主要流行的原因是將Java Script帶到後端(Back end)應用,以前專門用JS寫前端的人,只要學Node.js就可以開始寫後端(Back end),所以這些人就變成所謂的全端(Full Stack)。

    Node.js的底層是採用Google V8的引擎,以C++撰寫而成,特性在於撰寫即時的網站服務(Real-Time Web Service),Node.js有所謂的異步I/O模型,一般服務器處理的方式採用同步I/O的方式,如:我們丟一個檔案,服務器就把他印出來,是一個直觀的做法。但在互聯網的環境,大量的請求就會把CPU資源吃光。而異步I/O的方式就是遇到I/O請求就先往後台丟,讓CPU能先處理任務,這樣單一CPU就可以處理多個問題,所以Node.js的異步I/O模型又稱非阻塞I/O。Uber採用Node.js來處理API、訂單的各種即時服務。
  2. Python
    正如其名蟒蛇(Python)一樣,有龐大又好用的套件支持,對於一些想要快速進行服務雛形,都可以透過Python很快的去實作。Python從1991年誕生之今,以優雅、明確、簡單的概念讓開發者可以很快的把各種服務想法快速的實現,因此Uber就是利用Python這種方便「整合」的特性,各種服務機制透過Python來撰寫。
  3. Java
    這個語言資訊相關科系的同學是再熟悉不過了,Java從1995年誕生後至今都仍然很活躍的語言,近年最知名的應用就是Android作業系統,因為Java的語法嚴謹、普遍,因此有些開源軟體會採用Java作為主要開發語言,則虛擬機採用C/C++來做撰寫。Uber則是透過Java與前面的Python整合一些地理資訊上的應用。
  4. Go
    這個語言與Node.js都是在2009年出現,這個語言非常有野心,據說要取代C/C++,當然筆者認為短時間不太可能出現這樣的情形。不過Go因為有了Google的支持,使得在語言發展上較其他語言有更大的優勢。不過筆者觀察的特色在於Go處理需要擴展性(Scalability)與平行性(Concurrency),有很大的優勢,因此Uber把原本要給C/C++要做的事情,部分交給了Go來做處理,藉此提高系統的運作效率。
  5. Native applications on iOS and Android
    因為Uber的服務講究的是好的性能與效率,因此開發了原生的iOS與Android APP。誠如前面提到的Android是採用Java撰寫,而iOS早期為Objective-C所編輯,從2014年開始改Swift語言做開發。
  6. Redis
    這個資料庫也是在2009年出現,屬於NoSQL的一種,採用鍵值(Key–value)的方式儲存資料,它最大的特性在於資料都是儲存於記憶體上,便於使用與高吞吐的情境上,屬於CAP理論中的CP,也就是一致性(Consistent)與分隔容忍性(Partition Tolerance)。Uber採用它做暫存的動作,讓服務能處在低延遲高效率的狀態上。Uber有不少的應用都是採用基於Twemproxy的Redis,使服務能保持不間斷。
  7. PostgreSQL、MySQL
    PostgreSQL與MySQL一樣都是傳統關聯式資料庫(RDBMS),跟Java一樣兩個都是1995年誕生,目前MySQL一直在市場上有一定程度的擁護者,不過近幾年因為MySQL商業化後,當初開發MySQL的開發者轉至MariaDB,因此稍微式微一些。反觀PostgreSQL的使用者仍保持開源的方式持續成長,筆者認為它與MySQL最大的不同在於對於地理資訊的處理有強大的功能支持,因此除了日常服務,PostgreSQL更能處理有關地理資訊的資料儲存。不過Uber看起來是把PostgreSQL作為服務一開始的資料庫,筆者認為應該就是看到PostgreSQL的特性,而MySQL則是來當作一般日常服務的資料儲存。
  8. Riak
    幾年前看到Riak的時候,是因為正在了解Hadoop的架構,Riak較Hadoop更為年輕,是在 2009年誕生。Riak是採用鍵值(Key–value)的方式儲存資料,在CAP理論中屬於AP,也就是可用性(Availability)與分隔容忍性(Partition Tolerance),也就特性是以確保寫入與讀出為主。不過Riak跟Cassandra一樣沒有Master/Slave,因此資料在吞吐上主機的壓力較小。Uber將Riak應用在調度系統上,看起來相當合理,因為即時的調度在資料輸入與輸出上需要不斷的吞吐。
  9. Twitter's Twemproxy for Redis
    Twemproxy是Twitter所推出的開放原始碼,是Twitter貢獻前面提到的Redis的架構,以提供更高效能的服務。Twitter採用龐大的Redis集群提供時間軸的訊息顯示,而Twemproxy最大的特色在於當一個Node失效的時候,自動卸載與自動重新連接,因此Uber採用它來做低延遲的服務應用。
  10. Google's S2 Geometry Library
    過去的Uber只能看到Uber的供應量,但其實無法完全掌握汽車與客戶間的距離作最佳化的處理,因此為了強化匹配的效率,Uber要將每個區塊變成一個id,Uber透過S2切成一個個細胞(cell),讓所有的乘客可以因此降低等待時間,因此透過S2的覆蓋函數,Uber不再只是尋找可以載乘客的司機,更能找到可以「順路」載乘客的司機。
  11. Ringpop
    Ringpop是Uber自己開發的模組,是給Node.js使用。它是一個採用Gossip協定,降低服務的出錯機率,在Gossip協定中一旦節點都獲得認證, 它們就可以快速地進行查詢與散播訊息,Gossip以前最常出現在P2P的服務當中。Uber就是把Gossip結合可擴充可傳導的弱一致性行程群組成員協定(SWIM)放到Node.js當中。
  12. TChannel
    TChannel透過Ringpop的實現,Uber就建立了屬於自己遠端調用程式(PRC)機制,它們稱為TChannel,使得每一個請求與回應都能獨立與安全的運作,因此TChannel在搭配Redis下,通訊效率比HTTP快,Uber正在改變早期採用HTTP與Json通信模式,往TChannel的Thrift通訊方式作發展。
  13. Thrift
    Thrift最早在2007年前,是被Facebook開發,且被用來處理系統間的RPC服務,最大的特色在於支援相當多的語言,快速實現RPC的服務。

Uber服務平台處理的工作,就是協助每一位駕駛與消費者的能夠緊密連接,這件事情的挑戰在於如何在即時的狀態下去做資訊動態的連接,像是一位消費者正準備要找車搭,在自己的手機APP上,系統會顯示附近的車輛,這些過程都是即時呈現,所以服務平台必須能夠快速捕捉駕駛的位置,並回傳到手機APP上,提供準備找車的消費者查詢。

這在日常的時段,做匹配(Matching)的工作還可以應付,當在過新年的時候,才是Uber面臨的巨大挑戰,因為跨年後想要搭車的消費者是瞬間暴增,就像是以前SMS時代,大家跨年之後,想傳簡訊給身邊的朋友祝福,卻發現簡訊發不出去,發生系統滿載的問題,Uber服務平台的挑戰亦同。

大家都知道Uber的服務平台,主要以iOS與Android為主,而真正在調度的機制,幾乎是採用Node.js完成,因為Node.js擁有Java script的特性,資料吞吐上能保有較佳的彈性,因此除了iOS與Android之外,資料介接則是採用Node.js語言建構。以下是其他包含的機制技術:

地圖(Maps/ETA): 最短抵達時間(Estimated Time of Arrival簡稱ETA)該機制被使用來估計抵達的時間,除了可以顯示街道地圖,也可以呈現估計時間,採用了Python、C++與Java語言,採用Python是為了要整合機制,採用C++與Java則考慮提升執行效率。

服務(Service):該服務主要用於提供商業物流服務,大部分是採用Python進行撰寫,因為Python具備開發彈性,並同時採用Microservice的方法。

資料庫(Database):早期採用PostgresSQL,後來採用Redis主要是與Twemproxy結合。也有採用MySQL於線上服務網站。另外還有一些調度服務是採用Riak進行儲存。

配套服務:配套的系統服務,包含收集排名、信件通知、更新資料庫、付款時程......等,都是採用Python進行撰寫,當然還是考量Python的語言可讀性高,且具備開發彈性。

金流:Uber的金流介接都與目前的金流公司合作。


面對Uber接下來的急速增長的客戶數量挑戰,Uber提出新系統的建構想法,像是他們增加了更詳細的資訊交換內容,包含供給端與消費端,供給端提供座位數、車型、小孩座位,消費端則提供需求座位數,結合地理資訊(Geo),做這兩端的調度最佳化(Dispatch Optimization)。

筆者整理Uber的幾個服務項目的新建構思維,如下:
  1. 供給與需求雙方的資訊媒合,消費端的需求可以被快速媒合。
  2. 當消費端出現,服務平台能夠能快速找出最靠近的候選車輛。
  3. 透過較新的技術達到服務的可用性,確保服務不斷線
  4. 每一個服務都有具備重複詢問的功能,確保每一個訂單都能運作。
  5. 從一個可以提供載客的服務,走到可以提供順路載客的服務。
  6. 利用新技術達到減少空載、減少等待、整體到達時間(ETA)最短的服務


基本上現在許多資訊服務都是各種技術混用,因此筆者常需要涉獵各種不同的大數據運行架構,本篇主要針對Uber的技術做了一些整理,希望能提供給需要了解各種技術架構整合的讀者有初步的了解,如果讀者有興趣,也歡迎自行到下面參考資料中作進一步的閱讀。


其他資料參考:

2015年11月13日 星期五

R語言從「初學」到「進階」到「跨界」的32本書籍推薦


R語言一直是數據分析界的熱門語言,也因此R語言相關的書籍也相當的多。筆者在學R的過程也看過許多R語言的書籍,筆者也收集相當多的R書籍,但大多參差不齊,有些寫得很好,有些則寫的較為艱澀,最近看到網路上大家在討論由淺入深的學習參考書籍,因此筆者也想做個小整理,包括初級、中級、高級,以及相關領域,內容如下:

[初級]

適合完全不懂R看的書,前三本都是值得參考。
[中級]

適合對R有初步認識的讀者,前三本都是值得參考。
[高級]

想挑戰R的技術的讀者,三本都非常推薦。
  • Advanced R
    • 這本書提了很多R進階的撰寫技巧,作者目前是RStudio首席資料科學家。
  • Statistical Computing in C++ and R
    • 畢竟R還是高階語言,許多效率的改善還是要去參考C++跟R整合的部分。
  • R Packages
    • 這本書是介紹如何撰寫R Packages的技巧,以及R套件與R核心整合的內容,適合非常熟悉R並且想開發R套件的讀者,與Advanced R是同一個作者。
[資料視覺化]
[網站應用]
[統計學]
[計量經濟學、金融]


[資料探勘]
[機器學習]

[資料科學]
[空間資料]
[市場研究]


其他領域結合R的書也歡迎推薦。