2017-02-22

quake_forecast.py:同時預測時間、地點、規模

2017-02-22 南非德本站 Durban, South Africa Station 空氣2號 Air 2 (Arduino Uno + LF298N) - Analysis

2017-02-22 南非德本站 Durban, South Africa Station 空氣2號 Air 2 (Arduino Uno + LF298N)

我把之前寫的3個程式整合成1個:quake_forecast.py,以同時預測時間、地點、規模。

# coding: utf-8
# Quake Forecast: Predict Time, Location and Magnitude of a Quake
import pandas as pd
from sklearn.linear_model import LinearRegression
from sklearn.ensemble import RandomForestClassifier

left_half_duration = 3
right_half_duration = 1
right_half_estimate = 2
predict_duration = left_half_duration + right_half_duration + right_half_estimate
predict_height = 8

train = pd.read_csv('quake_signals.csv')
print(train)
features = ['Duration', 'Height']
data = train[features]
print(data)

# Predict Time
target = train['Time']
print(target)
model = LinearRegression()
model.fit(data, target)

quake_time = model.predict([[predict_duration, predict_height]])
print(quake_time)
print('Time: ' , round(right_half_estimate + quake_time[0]), ' days')

# Predict Location
target = train['Location']
print(target)
model = RandomForestClassifier()
model.fit(data, target)

quake_location = model.predict([[predict_duration, predict_height]])
print(quake_location)

# Predict Magnitude
target = train['Magnitude']
print(target)
model = LinearRegression()
model.fit(data, target)

quake_magnitude = model.predict([[predict_duration, predict_height]])
print(quake_magnitude)

程式碼放在:https://github.com/dysonlin1/Quake-Forecast

這次的預測,發布為:(AI預測菲律賓;我預測日本) 南非德本站修正地震預報:橙:5日以內,菲律賓或日本,M7.3 南アフリカ ダーバン局補正地震予報:オレンジ:5日以内に、フィリピンまたは日本、M7.3 Durban, South Africa Station Revised Quake Forecast: Orange: within 5 days, Philippines or Japan, M7.3

台灣地震預測研究所 所長
林湧森
2017-02-22 17:01 UTC+8

2017-02-20

改成用Linear Regression預測地震發生時間

2017-02-18 南非德本站 Durban, South Africa Station 空氣2號 Air 2 (Arduino Uno + LF298N) - Analysis

我改成用Linear Regression預測地震發生時間。
程式碼如下(相關程式碼和數據集,都放在https://github.com/dysonlin1/Quake-Forecast):

# coding: utf-8
# Machine Learning: Quake Forecast
import pandas as pd
from sklearn.linear_model import LinearRegression

train = pd.read_csv('quake_signals.csv')
print(train)

features = ['Duration', 'Height']
data = train[features]
print(data)

target = train['Time']
print(target)

model = LinearRegression()
model.fit(data, target)
quake_time = model.predict([[2, 4]])
print(quake_time)

台灣地震預測研究所 所長
林湧森
2017-02-20 18:08 UTC+8

2017-02-17

開始以機器學習預測地震(5):GitHub

2017-02-15 南非德本站 Durban, South Africa Station 空氣2號 Air 2 (Arduino Uno + LF298N) - Analysis

我的開始以機器學習預測地震系列文章,已經順利完成。
在此做個總結。

在這一系列文章中,我建立了以機器學習預測地震的完整程式架構:
開始以機器學習預測地震(1):預處理(Preprocess)數據
開始以機器學習預測地震(2):以Random Forest預測地震發生時間
開始以機器學習預測地震(3):以Random Forest預測地震發生地點
開始以機器學習預測地震(4):以Linear Regression預測地震發生規模

未來將會以此為基礎,繼續發展。

為了方便大家研究,特地將文章中所有的Python程式碼、輸入數據和訊號圖,放在GitHub:
https://github.com/dysonlin1/Quake-Forecast

歡迎大家一起來預測地震!
謝謝!

台灣地震預測研究所 所長
林湧森
2017-02-17 14:17 UTC+8

開始以機器學習預測地震(4):以Linear Regression預測地震發生規模

2017-02-15 南非德本站 Durban, South Africa Station 空氣2號 Air 2 (Arduino Uno + LF298N) - Analysis

預測地震(Earthquake Prediction, Quake Forecast)包含3個部分:時間(Time)、地點(Location)、規模(Magnitude)。

上上篇以Random Forest預測地震發生時間。
上一篇以Random Forest預測地震發生地點。
這篇將以Linear Regression預測地震發生規模。

程式碼如下:

# Machine Learning: Quake Forecast Magnitude
import pandas as pd
from sklearn.linear_model import LinearRegression

train = pd.read_csv('quake_signals.csv')
print(train)

features = ['Duration', 'Height']
data = train[features]
print(data)

target = train['Magnitude']
print(target)

model = LinearRegression()
model.fit(data, target)
quake_magnitude = model.predict([[2, 2.3]])
print(quake_magnitude)

程式執行結果如下:

以Linear Regression預測地震發生規模


所以,Linear Regression預測地震發生規模為:M5.4(以5.3904918四捨五入到小數點後第1位)。

台灣地震預測研究所 所長
林湧森
2017-02-17 08:44 UTC+8

開始以機器學習預測地震(3):以Random Forest預測地震發生地點

2017-02-15 南非德本站 Durban, South Africa Station 空氣2號 Air 2 (Arduino Uno + LF298N) - Analysis

預測地震(Earthquake Prediction, Quake Forecast)包含3個部分:時間(Time)、地點(Location)、規模(Magnitude)。

上一篇以Random Forest預測地震發生時間。
這篇將以Random Forest預測地震發生地點。

程式碼如下:

# Machine Learning: Quake Forecast Location
import pandas as pd
from sklearn.ensemble import RandomForestClassifier

train = pd.read_csv('quake_signals.csv')
print(train)

features = ['Duration', 'Height']
data = train[features]
print(data)

target = train['Location']
print(target)

model = RandomForestClassifier()
model.fit(data, target)
quake_location = model.predict([[2, 2.3]])
print(quake_location )

程式執行結果如下:

以Random Forest預測地震發生地點


所以,Random Forest預測地震發生地點為:印尼(Indonesia)。

台灣地震預測研究所 所長
林湧森
2017-02-17 08:09 UTC+8

開始以機器學習預測地震(2):以Random Forest預測地震發生時間

2017-02-15 南非德本站 Durban, South Africa Station 空氣2號 Air 2 (Arduino Uno + LF298N) - Analysis

預測地震(Earthquake Prediction, Quake Forecast)包含3個部分:時間(Time)、地點(Location)、規模(Magnitude)。

這篇將以Random Forest預測地震發生時間。
也就是說:預測山丘形訊號結束之後的第幾天將發生地震。

上一篇得到的數據為:
ID Duration Height  Time    Location     Magnitude
 2       4         6          2     Philippines       6.5
 3       1         3.5       1        Malawi          5.2
 4       2         3          2      Indonesia        5.2
 5       1         2          1        Alaska           5.3
 6       1         3          1         Japan           5.0

首先,將這些數據儲存成quake_signals.csv檔案,以方便後續的訓練:

將數據儲存成quake_signals.csv檔案


接下來,訓練Random Forest模形。
程式碼如下:

# Machine Learning: Quake Forecast Time
import pandas as pd
from sklearn.ensemble import RandomForestClassifier

train = pd.read_csv('quake_signals.csv')
print(train)

features = ['Duration', 'Height']
data = train[features]
print(data)

target = train['Time']
print(target)

model = RandomForestClassifier()
model.fit(data, target)
quake_time = model.predict([[2, 2.3]])
print(quake_time)

程式執行結果如下:

以Random Forest預測地震發生時間


所以,Random Forest預測地震發生時間為:山丘形訊號結束後1日以內。

台灣地震預測研究所 所長
林湧森
2017-02-17 06:53 UTC+8

2017-02-15

開始以機器學習預測地震(1):預處理(Preprocess)數據

2017-02-15 南非德本站 Durban, South Africa Station 空氣2號 Air 2 (Arduino Uno + LF298N) - Analysis

2017-02-15 南非德本站 Durban, South Africa Station 空氣2號 Air 2 (Arduino Uno + LF298N)

這篇將會開始以機器學習預測地震。

以下先列出一些預測地震的參考資料:
關於我預測地震的方法,請參考:我的地震預測之道 My Way of Earthquake Prediction
關於我判讀地震訊號的方法,請參考:How to Read Quake Signals 如何判讀地震訊號
關於我預測地震的常見問題,請參考:常見問題
關於我開始預測地震的歷史,請參考:歷史回顧
也歡迎加入我成立的臉書社團:台灣地震預測研究所
我的臉書粉絲專頁:台灣地震預測研究所
我的臉書帳號:林湧森 (Dyson Lin)

好,以下進入正題。

地震訊號(Quake signals)有2種:垂直線形訊號(Vertical line signals)和山丘形訊號(Hill  signals)。
垂直線形訊號又可分為2種:單一垂直線形訊號(Single line)與多條垂直線形訊號(Multiple lines)。

我們將以2017-02-15 南非德本站空氣2號的山丘形訊號產生數據集,訓練模形。請參考我以人工預測的這篇地震預報:2017-02-15 15:20 UTC+8 南非德本站地震預報:紅:3日以內,印尼,M5+。南アフリカ ダーバン局地震予報:赤:3日以内に、インドネシア、M5+。Durban, South Africa Station Quake Forecast: Red: within 3 days, Indonesia, M5+.

圖中有6組訊號對應已經發生的地震,有1組訊號對應還沒發生的地震。

已經發生:
(1)紅:2017-02-08 00:03:56 UTC+2 巴基斯坦 M6.3。
(2)橙:2017-02-10 16:03:43 UTC+2 菲律賓 M6.5。
(3)黃:2017-02-10 18:43:38 UTC+2 馬拉威 M5.2。
(4)綠:2017-02-13 05:08:34 UTC+2 印尼 M5.2。
(5)藍:2017-02-13 09:17:12 UTC+2 阿拉斯加 M5.3。
(6)紫:2017-02-14 18:26:19 UTC+2 日本 M5.0。

我們將以這6組訊號做為訓練機器學習模形的數據。
等訓練好模形之後,再以模型預測剩下的那1組訊號對應的地震。

首先,預處理(Preprocess)數據。

(1)的訊號是不完整的,應該捨棄。
所以,剩下(2) ~ (6)這5組訊號。

接下來,把這5組訊號整理成下列表格:

ID Duration Height  Time    Location     Magnitude
 2       4         6          2     Philippines       6.5
 3       1         3.5       1        Malawi          5.2
 4       2         3          2      Indonesia        5.2
 5       1         2          1        Alaska           5.3
 6       1         3          1         Japan           5.0

至此完成預處理數據。
在機器學習的過程中,預處理數據往往是最花時間的。
從下一篇開始,我們將以這些預處理過的數據訓練模形。

台灣地震預測研究所 所長
林湧森
2017-02-15 16:54 UTC+8

2017-02-10

機器學習程式範例:鳶尾花數據集(Iris Dataset)

機器學習程式範例:鳶尾花數據集(Iris Dataset)

我們將要開始寫機器學習的程式碼。
大部分的機器學習功能,都有現成的套件可用。
我們只要學會怎麼用就行了,不用擔心背後複雜的數學理論和演算法。

機器學習的典型步驟是:
1. 讀取數據。
2. 選擇模型。
3. 訓練模型。
4. 預測。

我們先來看一個簡單的機器學習程式範例:鳶尾花數據集(Iris Dataset)。
詳細的說明,請參考:An introduction to machine learning with scikit-learn

程式碼如下:

# Machine Learning: Iris

from sklearn import datasets
from sklearn import svm

iris = datasets.load_iris()
print(iris.data.shape)

model = svm.LinearSVC()
model.fit(iris.data, iris.target)
model.predict([[5.0, 4.0, 2.0, 0.5]])

寥寥數行,就已經完成了我們的第一個機器學習程式!

請參考以下影片,打開Jupyter Notebook,輸入程式碼,執行看看:

機器學習程式範例:鳶尾花數據集(Iris Dataset)

寫程式的時候,最常見的錯誤來源是打字錯誤。
最好每寫1行或2行程式,就執行一次。
如果出現錯誤訊息,請檢查一下是否哪個字打錯了。
請注意:Python區分大小寫,例如LinearSVC和linearsvc會被Python視為不同的字。
所以打字時,務必注意大小寫。

以下,簡單的說明一下程式碼。

# Machine Learning: Iris

#念成Sharp,是Python的註解符號。
和#同一行的右邊所有的字,都會被Python視為註解,不會執行。
註解的功能,是說明程式碼的意義。
此外,也可用來讓一部分程式碼暫時不執行。

# Machine Learning: Iris這一行註解,說明這個程式是Machine Learning: Iris。

from sklearn import datasets
from sklearn import svm

import指令,用來匯入程式碼中要用到的套件(或稱為函式庫)(Libraries)。
Python最大的優點,就是有各種套件。
必須先在程式中匯入要使用的套件。
習慣上,是在程式碼的開頭,就用import匯入要用到的所有套件。
sklearn就是Scikit-Learn套件。
datasets是Scikit-Learn內建的數據集,方便我們練習。
svm是支援向量機。暫時把它當作黑盒子就行。

iris = datasets.load_iris()
print(iris.data.shape)

datasets.load_iris()讀取Iris數據集。
print(iris.data.shape)印出Iris數據集的行數和列數。

model = svm.LinearSVC()
model.fit(iris.data, iris.target)
model.predict([[5.0, 4.0, 2.0, 0.5]])

model = svm.LinearSVC()選擇模型。暫時把它當作黑盒子就行。
model.fit(iris.data, iris.target)以Iris數據集訓練模型。
model.predict([[5.0, 4.0, 2.0, 0.5]])以訓練好的模型,預測[[5.0, 4.0, 2.0, 0.5]]所對應的鳶尾花種類。

本系列文章,以實作為主。
對於機器學習的理論說明,請參考Andrew Ng教授的線上課程:https://www.coursera.org/learn/machine-learning

台灣地震預測研究所 所長
林湧森
2017-02-10 04:22 UTC+8

2017-02-09

如何使用Jupyter Notebook(iPython Notebook)

How to use Jupyter Notebook(iPython Notebook)

在安裝好Anaconda之後,我們就可以透過Jupyter Notebook(iPython Notebook)的圖形介面,輕鬆使用Python。
以下影片,示範如何使用Jupyter Notebook(iPython Notebook):

How to use Jupyter Notebook(iPython Notebook)

Jupyter Notebook(iPython Notebook)會把我們輸入的每一段程式碼編號。

我們在In [1]: 提示符號的右邊輸入:
    print('Hello, quakes!')

輸入完畢之後,以滑鼠點擊上方工具列的向右箭頭,或是按鍵盤上的Shift-Enter(按住Shift不放,然後按Enter),程式碼就開始執行,在底下輸出:
    Hello, quakes!

從下一篇開始,我們將進入機器學習的殿堂。

台灣地震預測研究所 所長
林湧森
2017-02-09 05:05 UTC+8

2017-02-08

架設機器學習Python程式語言開發環境:安裝Anaconda

Anaconda 4.3.0 For Windows

目前最受歡迎的機器學習程式語言是Python。

Python是免費的開源軟體,吸引了全世界的高手幫它寫了各種套件。
而像Google等大公司,也助Python一臂之力。
例如Google推出的TensorFlow

Python的套件很多,可透過pip自行安裝。
但是對初學者而言,最簡單的方法,就是安裝Anaconda
Anaconda會安裝Python以及各種套件,包含機器學習最常用的Scikit-Learn套件。

請下載適合你作業系統的版本安裝。
例如,Anaconda 4.3.0 For Windows: Python 3.6 version 64-BIT INSTALLER (348M)。

安裝過程可能很久,請耐心等候。

台灣地震預測研究所 所長
林湧森
2017-02-08 07:00 UTC+8

機器學習入門部落格開張囉

這是我的新部落格。
主題是機器學習入門。
將會發表一系列文章。
目標是以人工智能預測地震。

請拭目以待。
謝謝!

台灣地震預測研究所 所長
林湧森
2017-02-08 06:06 UTC+8