2017年1月13日 星期五

[R] Show Me The Code - Machine Learning的簡易入門

上星期去了一個程式員的講座交流活動,6個講者就著不同題目介紹和展示相關的coding。怎樣擔起一場有魅力的演說,這種能力很多時候都需要。大約10分鐘的演講,不用Powerpoint的投影片,即場示範效果和做法。同一個活動,今個星期就見到別人已經好好地寫出一篇『親睹Machine Learning辨別靚仔靚女』

收工到場時已經錯過第一位講者講的WebVR。第二位分享用elm這個前端應用開發的經驗,只有少量Javascript認識的我只記得它是讓開發者可以寫完後compile成HTML+CSS+JS,因為先編譯,就不會等到執行時才出現運行時期的錯誤。第三位的標題很吸引,如何用十分鐘開發Facebook Bot』。原來前排見過的應用程式是透過這種工具開發。這技術可以充當你專頁的回覆的機械人,也可以是當FB Messager成為你應用程式的用戶介面。講者用的應該是PHP,網上也有其他用Node.JS,Python 的示範。

「[程式開發] Facebook Messenger 聊天機器人 API 環境建置 教學 (Node.JS)」

「用 Python 開發 Facebook Bot」


第二節開始的一個講者介紹API.AI,雖然示範的只是特定句子的對答,但API.AI這家被Google收購了機械人對話開發公司,還做到更多型式的文字/語音辨析。然後見到R、Python這些比較有親切感的語言。 R有電鋸陳分享他在Network Analysis的過程中,用Rcpp套件以C寫looping 的經驗,這樣編譯和運行的時間可以比用apply function的即譯式更快。之後嘗試rJava時可以留意這個用法吧。不過他的分享中其實有很多時間是放在解釋研究的方法:怎樣的數據形式、什麼是Network analysis 的Triad Census。他做過的分析和文章可以參考明報的報道,報道版當時也讓我深感佩服,原來香港還是有做數據分析的人。

「通識導賞﹕佔領時代的facebook專頁版塊巴爾幹化社會網絡分析」

「數據新聞:香港網絡生態系列之三 沒有最撕裂 只有更撕裂——後佔領時代的Facebook專頁板塊」

用Python 的Andy展示的是所謂Machine Learning、Deep Learning 今天已經可以如何容易地做到。示範用 Keras套件 以神經網絡Neural Network 的方式分辨男或女的面孔照片。有男女各大約1300+ 張相片,32*32 pixel的黑白大頭照。轉換成共約2800行1024列的數據集。2/3 Training, 1/3 Testing。想想這件事應該可以用R 做吧?如果先準備好代表這些相片的矩陣,就可以讓R做緊接的神經網絡分析。數據仍需要準備,但Coding的例子呢? 有,Google 一下就找到 R-Bloggers 上的Coding 例子:



「Fitting a neural network in R; neuralnet package」

### Data 
set.seed(500)
library(MASS)
data <- Boston
apply(data,2,function(x) sum(is.na(x)))
index <- sample(1:nrow(data),round(0.75*nrow(data)))
train <- data[index,]
test <- data[-index,]

### Linear Model
lm.fit <- glm(medv~., data=train)
summary(lm.fit)
pr.lm <- predict(lm.fit,test)
MSE.lm <- sum((pr.lm - test$medv)^2)/nrow(test)

### Neutral Network Model
# Neutral Network - Prepare normalization
maxs <- apply(data, 2, max) 
mins <- apply(data, 2, min)
scaled <- as.data.frame(scale(data, center = mins, scale = maxs - mins))
train_ <- scaled[index,]
test_ <- scaled[-index,]

# Neutral Network - Fitting
library(neuralnet)
n <- names(train_)
f <- as.formula(paste("medv ~", paste(n[!n %in% "medv"], collapse = " + "))) # set formula as med ~ .
nn <- neuralnet(f,data=train_,hidden=c(5,3),linear.output=T) # neutral network as hidden layer (5,3) neutrons
plot(nn)

# Neutral Network - Prediction
pr.nn_ <- compute(nn,test_[,1:13])
pr.nn <- (pr.nn_$net.result) * (max(data$medv)-min(data$medv))+min(data$medv)

# Compare Performance
test.r <- (test_$medv) * (max(data$medv)-min(data$medv))+min(data$medv)
MSE.nn <- sum((test.r - pr.nn)^2)/nrow(test_)
print(paste(MSE.lm,MSE.nn))
par(mfrow=c(1,2))

plot(test$medv,pr.nn_,col='red',main='Real vs predicted NN',pch=18,cex=0.7)
abline(0,1,lwd=2)
legend('bottomright',legend='NN',pch=18,col='red', bty='n')

plot(test$medv,pr.lm,col='blue',main='Real vs predicted lm',pch=18, cex=0.7)
abline(0,1,lwd=2)
legend('bottomright',legend='LM',pch=18,col='blue', bty='n', cex=.95)

plot(test$medv,pr.nn_,col='red',main='Real vs predicted NN',pch=18,cex=0.7)
points(test$medv,pr.lm,col='blue',pch=18,cex=0.7)
abline(0,1,lwd=2)
legend('bottomright',legend=c('NN','LM'),pch=18,col=c('red','blue'))



沒有留言:

張貼留言