├── roc-auc ├── roc.png ├── roc_and_cost_function.png ├── prediction_type_distribution.png ├── read_and_prepare_titanic_dataset.R ├── SESSION.R ├── log_reg.R ├── dec_tree.R ├── plot_pred_type_distribution.R ├── calculate_roc.R └── plot_roc.R ├── tesseract-training ├── test.png ├── training.png ├── commands.txt ├── training.box └── training.box~ ├── oauth2-google-api ├── oauth2-flow.png ├── readme.md └── console.py ├── people-had-more-sex-in-summer ├── DE-month.png ├── DE-stl.png ├── EE-month.png ├── EE-stl.png ├── IS-month.png ├── IS-stl.png ├── PT-month.png ├── PT-stl.png ├── readme.md ├── SESSION_REMOTE.R ├── SESSION.R ├── extract_ts_for_country.R ├── load_sdmx_from_eurostat.R └── monthplot_for_country.R ├── postgresql-imputation ├── readme.md ├── custom-function.sql ├── locf-simple.sql ├── locf-full.sql ├── create-table-and-insert.sql └── locf-and-linear-full.sql ├── holt-winters-forecast ├── df_to_ts.R ├── csv_to_df.R ├── SESSION.R ├── plot_hw_forecast.R ├── hw_forecast.R ├── temp.csv ├── users-google.csv └── users-all.csv ├── deeplearning-with-caffe ├── config.prototxt ├── config_2hl.prototxt ├── model_prod.prototxt ├── model_train_test.prototxt ├── model_train_test_2hl.prototxt └── Neural-Networks-with-Caffe-on-the-GPU.ipynb ├── r-meets-ipython └── readme.md ├── installing-digits └── transform-and-duplicate-training-images.sh └── opencpu-r-python └── OpenCPU-Session.ipynb /roc-auc/roc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joyofdata/joyofdata-articles/HEAD/roc-auc/roc.png -------------------------------------------------------------------------------- /tesseract-training/test.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joyofdata/joyofdata-articles/HEAD/tesseract-training/test.png -------------------------------------------------------------------------------- /tesseract-training/training.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joyofdata/joyofdata-articles/HEAD/tesseract-training/training.png -------------------------------------------------------------------------------- /oauth2-google-api/oauth2-flow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joyofdata/joyofdata-articles/HEAD/oauth2-google-api/oauth2-flow.png -------------------------------------------------------------------------------- /roc-auc/roc_and_cost_function.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joyofdata/joyofdata-articles/HEAD/roc-auc/roc_and_cost_function.png -------------------------------------------------------------------------------- /people-had-more-sex-in-summer/DE-month.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joyofdata/joyofdata-articles/HEAD/people-had-more-sex-in-summer/DE-month.png -------------------------------------------------------------------------------- /people-had-more-sex-in-summer/DE-stl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joyofdata/joyofdata-articles/HEAD/people-had-more-sex-in-summer/DE-stl.png -------------------------------------------------------------------------------- /people-had-more-sex-in-summer/EE-month.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joyofdata/joyofdata-articles/HEAD/people-had-more-sex-in-summer/EE-month.png -------------------------------------------------------------------------------- /people-had-more-sex-in-summer/EE-stl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joyofdata/joyofdata-articles/HEAD/people-had-more-sex-in-summer/EE-stl.png -------------------------------------------------------------------------------- /people-had-more-sex-in-summer/IS-month.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joyofdata/joyofdata-articles/HEAD/people-had-more-sex-in-summer/IS-month.png -------------------------------------------------------------------------------- /people-had-more-sex-in-summer/IS-stl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joyofdata/joyofdata-articles/HEAD/people-had-more-sex-in-summer/IS-stl.png -------------------------------------------------------------------------------- /people-had-more-sex-in-summer/PT-month.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joyofdata/joyofdata-articles/HEAD/people-had-more-sex-in-summer/PT-month.png -------------------------------------------------------------------------------- /people-had-more-sex-in-summer/PT-stl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joyofdata/joyofdata-articles/HEAD/people-had-more-sex-in-summer/PT-stl.png -------------------------------------------------------------------------------- /roc-auc/prediction_type_distribution.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/joyofdata/joyofdata-articles/HEAD/roc-auc/prediction_type_distribution.png -------------------------------------------------------------------------------- /postgresql-imputation/readme.md: -------------------------------------------------------------------------------- 1 | ["LOCF and Linear Imputation with PostgreSQL" on joyofdata.de](http://www.joyofdata.de/blog/locf-linear-imputation-postgresql-tutorial/) 2 | -------------------------------------------------------------------------------- /holt-winters-forecast/df_to_ts.R: -------------------------------------------------------------------------------- 1 | df_to_ts <- function(df) { 2 | ts_df <- ts(df$users, frequency=7, start=c(df$sn[1],df$wdn[1]), end=c(df$sn[nrow(df)],df$wdn[nrow(df)])) 3 | return(ts_df) 4 | } -------------------------------------------------------------------------------- /people-had-more-sex-in-summer/readme.md: -------------------------------------------------------------------------------- 1 | Further details: [Germans used to have more Sex in Summer!](http://www.joyofdata.de/blog/germans-used-to-have-more-sex-in-summer-live-births-stl/) 2 | 3 | --- 4 | 5 | ![](./DE-month.png) 6 | ![](./DE-stl.png) 7 | -------------------------------------------------------------------------------- /postgresql-imputation/custom-function.sql: -------------------------------------------------------------------------------- 1 | create or replace function fun(a float, b float) 2 | returns float 3 | language sql 4 | as ' 5 | SELECT COALESCE(b, a) 6 | '; 7 | 8 | select a,b,t,v, 9 | fun(t,v) as v_or_t 10 | from tbl 11 | order by a,b,t 12 | ; 13 | -------------------------------------------------------------------------------- /deeplearning-with-caffe/config.prototxt: -------------------------------------------------------------------------------- 1 | net: "model_train_test.prototxt" 2 | 3 | test_iter: 100 4 | test_interval: 10000 5 | 6 | base_lr: 0.01 7 | momentum: 0.9 8 | weight_decay: 0.0005 9 | 10 | lr_policy: "inv" 11 | gamma: 0.0001 12 | power: 0.75 13 | 14 | display: 10000 15 | max_iter: 100000 16 | 17 | solver_mode: GPU 18 | -------------------------------------------------------------------------------- /deeplearning-with-caffe/config_2hl.prototxt: -------------------------------------------------------------------------------- 1 | net: "model_train_test_2hl.prototxt" 2 | 3 | test_iter: 100 4 | test_interval: 10000 5 | 6 | base_lr: 0.01 7 | momentum: 0.9 8 | weight_decay: 0.0005 9 | 10 | lr_policy: "inv" 11 | gamma: 0.0001 12 | power: 0.75 13 | 14 | display: 10000 15 | max_iter: 100000 16 | 17 | solver_mode: GPU 18 | -------------------------------------------------------------------------------- /oauth2-google-api/readme.md: -------------------------------------------------------------------------------- 1 | [console.py](console.py) illustrates how to implement OAuth 2.0 authorization for Google APIs - specifically featuring Google Analytics. 2 | 3 | Further details and documentation you may find in my article: 4 | 5 | [OAuth 2.0 for Google (Analytics) API with Python Explained](http://www.joyofdata.de/blog/oauth2-google-api-python-google-analytics/) 6 | 7 | ![OAuth 2.0 authorization flow](oauth2-flow.png) 8 | -------------------------------------------------------------------------------- /postgresql-imputation/locf-simple.sql: -------------------------------------------------------------------------------- 1 | create or replace function locf_s(a float, b float) 2 | returns float 3 | language sql 4 | as ' 5 | SELECT COALESCE(b, a) 6 | '; 7 | 8 | drop aggregate if exists locf(float); 9 | create aggregate locf(float) ( 10 | sfunc = locf_s, 11 | stype = float 12 | ); 13 | 14 | select a,b,t,v, 15 | locf(v) over (partition by a,b order by t) as v_locf 16 | from tbl 17 | order by a,b,t 18 | ; 19 | -------------------------------------------------------------------------------- /roc-auc/read_and_prepare_titanic_dataset.R: -------------------------------------------------------------------------------- 1 | read_and_prepare_titanic_dataset <- function(f) { 2 | df <- read.table(f, header = TRUE, sep=",", stringsAsFactors = FALSE) 3 | 4 | df$pclass <- as.factor(df$pclass) 5 | df$survived <- as.factor(df$survived) 6 | df$sex <- as.factor(df$sex) 7 | 8 | df <- df[,c("survived","pclass","sex","age","sibsp","parch")] 9 | df <- df[complete.cases(df),] 10 | 11 | return(df) 12 | } -------------------------------------------------------------------------------- /roc-auc/SESSION.R: -------------------------------------------------------------------------------- 1 | # http://biostat.mc.vanderbilt.edu/wiki/Main/DataSets 2 | 3 | library(ggplot2) 4 | library(party) 5 | library(pROC) 6 | 7 | df_tree <- dec_tree() 8 | plot_pred_type_distribution(df_tree, 0.7) 9 | roc_tree <- calculate_roc(df_tree, 1, 3) 10 | 11 | df_reg <- log_reg() 12 | roc_reg <- calculate_roc(df_reg, 1, 3) 13 | 14 | plot_roc(roc_reg) 15 | 16 | pROC::auc(df$survived, df$pred) 17 | 18 | #plot(roc$threshold, roc$cost) 19 | 20 | -------------------------------------------------------------------------------- /r-meets-ipython/readme.md: -------------------------------------------------------------------------------- 1 | #Ubuntu 14.04 2 | 3 | ##Bash: 4 | 5 | `pip install --upgrade jupyter` 6 | 7 | Source: [http://blog.jupyter.org/2015/08/12/first-release-of-jupyter/]() 8 | 9 | #R: 10 | 11 | ``` 12 | install.packages(c('rzmq','repr','IRkernel','IRdisplay'), 13 | repos = c('http://irkernel.github.io/', getOption('repos')), 14 | type = 'source') 15 | 16 | IRkernel::installspec() 17 | ``` 18 | 19 | Source: [https://github.com/IRkernel/IRkernel]() 20 | -------------------------------------------------------------------------------- /holt-winters-forecast/csv_to_df.R: -------------------------------------------------------------------------------- 1 | csv_to_df <- function(csv) { 2 | df <- read.table(csv, sep=",", header=TRUE, stringsAsFactors = FALSE) 3 | 4 | df$date <- as.Date(df$date, format="%m/%d/%y") 5 | df$users <- as.numeric(df$users) 6 | df$wd <- substr(lubridate::wday(df$date, label=TRUE),1,3) 7 | df$week <- lubridate::week(df$date) 8 | df$wdn <- lubridate::wday(df$date) 9 | df$wdn <- with(df, ifelse(wdn-1 == 0, 7, wdn-1)) 10 | df$sn <- c(rep(0,7-df$wdn[1]+1),rep(1:nrow(df),rep(7,nrow(df))))[1:nrow(df)] 11 | 12 | return(df) 13 | } -------------------------------------------------------------------------------- /holt-winters-forecast/SESSION.R: -------------------------------------------------------------------------------- 1 | library(lubridate) 2 | library(forecast) 3 | 4 | source("csv_to_df.R") 5 | source("df_to_ts.R") 6 | source("hw_forecast.R") 7 | source("plot_hw_forecast.R") 8 | 9 | df_users_all <- csv_to_df("users-all.csv") 10 | df_users_google <- csv_to_df("users-google.csv") 11 | 12 | df <- subset(df_users_google, date >= "2014-01-06" & date <= "2014-11-30") 13 | obj <- hw_forecast(df, m=7, h=28, al=.1, be=.1, ga=.1) 14 | plot_hw_forecast(obj) 15 | 16 | mod <- ets(ts(df$users, frequency=7), model="AAA") 17 | plot(forecast(mod, h=28)) 18 | -------------------------------------------------------------------------------- /roc-auc/log_reg.R: -------------------------------------------------------------------------------- 1 | log_reg <- function(df, size=10) { 2 | N <- nrow(df) 3 | size=10 4 | 5 | df <- df[sample(N),] 6 | 7 | num <- floor(N/size) 8 | rest <- N - num * size 9 | ncv <- cumsum(c(rep(size,num), rest)) 10 | 11 | predictions <- data.frame(survived = df$survived, pred = NA) 12 | 13 | for(n in ncv) { 14 | v <- rep(TRUE, N) 15 | v[(n-size+1):n] <- FALSE 16 | 17 | lr <- glm(survived ~ ., data = df[v,], family = binomial(logit)) 18 | predictions[!v,"pred"] <- predict(lr, newdata=df[!v,], type="response") 19 | } 20 | 21 | return(predictions) 22 | } -------------------------------------------------------------------------------- /roc-auc/dec_tree.R: -------------------------------------------------------------------------------- 1 | dec_tree <- function() { 2 | df <- read_and_prepare_titanic_dataset("~/Downloads/titanic3.csv") 3 | 4 | tree <- ctree(survived ~ ., data=df, 5 | controls = ctree_control( 6 | teststat="quad", 7 | testtype="Univariate", 8 | mincriterion=.95, 9 | minsplit=10, 10 | minbucket=5, 11 | maxdepth=0 12 | )) 13 | 14 | df$pred <- predict(tree, newdata=df, type="prob") 15 | df$pred <- unlist(lapply(df$pred, function(el)el[2])) 16 | 17 | return(df) 18 | } -------------------------------------------------------------------------------- /people-had-more-sex-in-summer/SESSION_REMOTE.R: -------------------------------------------------------------------------------- 1 | library(rsdmx) 2 | library(forecast) 3 | library(devtools) 4 | 5 | base_url <- cat( 6 | "https://raw.githubusercontent.com/joyofdata/", 7 | "joyofdata-articles/master/people-had-more-sex-in-summer" 8 | ) 9 | 10 | source_url(sprintf("%s/extract_ts_for_country.R", base_url)) 11 | source_url(sprintf("%s/load_sdmx_from_eurostat.R", base_url)) 12 | source_url(sprintf("%s/monthplot_for_country.R", base_url)) 13 | 14 | d <- load_sdmx_from_eurostat(dataset = "demo_fmonth") 15 | 16 | #> table(d$data$geo)[table(d$data$geo) > 600] 17 | 18 | monthplot_for_country(d$data, "DE", sw=36, tw=48, pstl=TRUE, yred=1990) 19 | -------------------------------------------------------------------------------- /postgresql-imputation/locf-full.sql: -------------------------------------------------------------------------------- 1 | create or replace function locf_s(a float, b float) 2 | returns float 3 | language sql 4 | as ' 5 | SELECT COALESCE(b, a) 6 | '; 7 | 8 | drop aggregate if exists locf(float); 9 | create aggregate locf(float) ( 10 | sfunc = locf_s, 11 | stype = float 12 | ); 13 | 14 | select a,b,t,v, 15 | locf(v) over t_asc as v_locf, 16 | locf(v) over t_desc as v_focb, 17 | coalesce( 18 | locf(v) over t_asc, 19 | locf(v) over t_desc 20 | ) as v_final 21 | from tbl 22 | window 23 | t_asc as (partition by a,b order by t), 24 | t_desc as (partition by a,b order by t desc) 25 | order by a,b,t 26 | ; 27 | -------------------------------------------------------------------------------- /people-had-more-sex-in-summer/SESSION.R: -------------------------------------------------------------------------------- 1 | library(rsdmx) 2 | library(forecast) 3 | 4 | source("./extract_ts_for_country.R") 5 | source("./load_sdmx_from_eurostat.R") 6 | source("./monthplot_for_country.R") 7 | 8 | d <- load_sdmx_from_eurostat(dataset = "demo_fmonth") 9 | 10 | #> table(d$data$geo)[table(d$data$geo) > 600] 11 | # 12 | #AT BE CH DE DE_TOT DK EE EL ES FI FX IE IS IT LU NL NO PT SE 13 | #751 754 750 742 754 751 749 635 754 751 751 631 751 604 750 751 742 633 751 14 | 15 | monthplot_for_country(d$data, "PT", sw=36, tw=48, pstl=TRUE, yred=1990) 16 | 17 | -------------------------------------------------------------------------------- /postgresql-imputation/create-table-and-insert.sql: -------------------------------------------------------------------------------- 1 | drop table if exists tbl; 2 | create table tbl ( 3 | t float, 4 | a int, 5 | b int, 6 | v float 7 | ); 8 | 9 | insert into tbl (t, a, b, v) 10 | values 11 | -- a=10, b=7 12 | (1.0, 10, 7, NULL), 13 | (2.0, 10, 7, NULL), 14 | (3.0, 10, 7, 1), 15 | (3.5, 10, 7, NULL), 16 | (4.0, 10, 7, NULL), 17 | (5.0, 10, 7, 5), 18 | (5.8, 10, 7, NULL), 19 | (6.0, 10, 7, 3), 20 | (6.5, 10, 7, NULL), 21 | -- a=14, b=7 22 | (1.0, 14, 7, NULL), 23 | (2.0, 14, 7, NULL), 24 | (3.0, 14, 7, 10), 25 | (3.5, 14, 7, NULL), 26 | (4.0, 14, 7, NULL), 27 | (5.0, 14, 7, -10), 28 | (5.8, 14, 7, NULL), 29 | (6.0, 14, 7, 5), 30 | (6.5, 14, 7, NULL) 31 | ; 32 | -------------------------------------------------------------------------------- /roc-auc/plot_pred_type_distribution.R: -------------------------------------------------------------------------------- 1 | plot_pred_type_distribution <- function(df, threshold) { 2 | v <- rep(NA, nrow(df)) 3 | v <- ifelse(df$pred >= threshold & df$survived == 1, "TP", v) 4 | v <- ifelse(df$pred >= threshold & df$survived == 0, "FP", v) 5 | v <- ifelse(df$pred < threshold & df$survived == 1, "FN", v) 6 | v <- ifelse(df$pred < threshold & df$survived == 0, "TN", v) 7 | 8 | df$pred_type <- v 9 | 10 | ggplot(data=df, aes(x=survived, y=pred)) + 11 | geom_violin(fill=rgb(1,1,1,alpha=0.6), color=NA) + 12 | geom_jitter(aes(color=pred_type), alpha=0.6) + 13 | geom_hline(yintercept=threshold, color="red", alpha=0.6) + 14 | scale_color_discrete(name = "type") + 15 | labs(title=sprintf("Threshold at %.2f", threshold)) 16 | } -------------------------------------------------------------------------------- /people-had-more-sex-in-summer/extract_ts_for_country.R: -------------------------------------------------------------------------------- 1 | extract_ts_for_country <- function(d, country) { 2 | ts <- d[d$geo==country & grepl("M\\d\\d",d$month),] 3 | ts <- ts[order(ts$TIME_PERIOD, ts$month),] 4 | ts[,c("TIME_PERIOD","OBS_VALUE")] <- lapply(ts[,c("TIME_PERIOD","OBS_VALUE")], as.numeric) 5 | 6 | y1 <- min(ts$TIME_PERIOD) 7 | y2 <- max(ts$TIME_PERIOD) 8 | 9 | if(ts$month[1] != "M01") { 10 | y1 <- y1+1 11 | } 12 | if(ts$month[nrow(ts)] != "M12") { 13 | y2 <- y2-1 14 | } 15 | ts <- ts[ts$TIME_PERIOD >= y1 & ts$TIME_PERIOD <= y2,] 16 | TS <<- ts 17 | 18 | if(! sum(ts$month == rep(sprintf("M%02d",1:12),(y2-y1+1))) == (y2-y1+1)*12) { 19 | stop("there seem to be months missing :/") 20 | } 21 | 22 | ts <- ts(ts$OBS_VALUE, start=c(y1,1), end=c(y2,12), frequency=12) 23 | 24 | return(ts) 25 | } -------------------------------------------------------------------------------- /people-had-more-sex-in-summer/load_sdmx_from_eurostat.R: -------------------------------------------------------------------------------- 1 | load_sdmx_from_eurostat <- function(dataset = "demo_fmonth") { 2 | url <- sprintf("http://ec.europa.eu/eurostat/estat-navtree-portlet-prod/BulkDownloadListing?sort=1&file=data%%2F%s.sdmx.zip", dataset) 3 | sdmx <- sprintf("%s.sdmx.xml", dataset) 4 | dsd <- sprintf("%s.dsd.xml", dataset) 5 | 6 | # downloading and unzipping 7 | # http://stackoverflow.com/a/3053883/562440 8 | 9 | temp <- tempfile() 10 | download.file(url,temp) 11 | 12 | sdmx <- readSDMX(unzip(temp, files=sdmx), isURL=FALSE) 13 | dsd <- readSDMX(unzip(temp, files=dsd), isURL=FALSE) 14 | 15 | unlink(temp) 16 | 17 | d <- as.data.frame(sdmx) 18 | d <- as.data.frame(lapply(d, as.character), stringsAsFactors=FALSE) 19 | 20 | return(list( 21 | sdmx = sdmx, 22 | dsd = dsd, 23 | data = d 24 | )) 25 | } -------------------------------------------------------------------------------- /roc-auc/calculate_roc.R: -------------------------------------------------------------------------------- 1 | calculate_roc <- function(df, cost_of_fp, cost_of_fn, n=100) { 2 | tpr <- function(df, threshold) { 3 | sum(df$pred >= threshold & df$survived == 1) / sum(df$survived == 1) 4 | } 5 | 6 | fpr <- function(df, threshold) { 7 | sum(df$pred >= threshold & df$survived == 0) / sum(df$survived == 0) 8 | } 9 | 10 | cost <- function(df, threshold, cost_of_fp, cost_of_fn) { 11 | sum(df$pred >= threshold & df$survived == 0) * cost_of_fp + 12 | sum(df$pred < threshold & df$survived == 1) * cost_of_fn 13 | } 14 | 15 | roc <- data.frame(threshold = seq(0,1,length.out=n), tpr=NA, fpr=NA) 16 | roc$tpr <- sapply(roc$threshold, function(th) tpr(df, th)) 17 | roc$fpr <- sapply(roc$threshold, function(th) fpr(df, th)) 18 | roc$cost <- sapply(roc$threshold, function(th) cost(df, th, cost_of_fp, cost_of_fn)) 19 | 20 | return(roc) 21 | } -------------------------------------------------------------------------------- /holt-winters-forecast/plot_hw_forecast.R: -------------------------------------------------------------------------------- 1 | plot_hw_forecast <- function(obj) { 2 | d <- obj$data$date 3 | d <- c(d, d[length(d)]+(1:obj$horizon)) 4 | 5 | par(mfrow=c(5,1), mar=c(2,3,1,1)) 6 | plot(d, obj$ts$yh, type="l", col=rgb(1,0,0,.5), ylim=c(0,max(c(obj$ts$y,obj$ts$yh),na.rm=TRUE))) 7 | lines(d, obj$ts$y, type="l") 8 | mtext("Time Series", side=3, adj=0.2, line=-2, col="blue", cex=1) 9 | 10 | pf <- function(v, d, h, str) { 11 | n <- length(v)-h 12 | plot(d, v, type="l") 13 | abline(v=d[n+1], col=rgb(0,0,1,0.5), lty=2) 14 | mtext(str, side=3, adj=0.2, line=-2, col="blue", cex=.8) 15 | } 16 | pf(obj$ts$level, d, obj$horizon, str="LEVEL") 17 | pf(obj$ts$season, d, obj$horizon, str="SEASON") 18 | pf(obj$ts$trend, d, obj$horizon, str="TREND") 19 | 20 | monthplot(ts(obj$ts$season, frequency=obj$frequency), labels=obj$data$wd[1:7]) 21 | par(mfrow=c(1,1), mar=c(3,3,3,3)) 22 | } -------------------------------------------------------------------------------- /deeplearning-with-caffe/model_prod.prototxt: -------------------------------------------------------------------------------- 1 | name: "otto" 2 | input: "data" 3 | input_dim: 1 4 | input_dim: 93 5 | input_dim: 1 6 | input_dim: 1 7 | layer { 8 | name: "ip1" 9 | type: "InnerProduct" 10 | bottom: "data" 11 | top: "ip1" 12 | inner_product_param { 13 | num_output: 30 14 | weight_filler { 15 | type: "xavier" 16 | } 17 | bias_filler { 18 | type: "constant" 19 | value: 0 20 | } 21 | } 22 | } 23 | layer { 24 | name: "relu1" 25 | type: "ReLU" 26 | bottom: "ip1" 27 | top: "ip1" 28 | } 29 | layer { 30 | name: "ip2" 31 | type: "InnerProduct" 32 | bottom: "ip1" 33 | top: "ip2" 34 | inner_product_param { 35 | num_output: 9 36 | weight_filler { 37 | type: "xavier" 38 | } 39 | bias_filler { 40 | type: "constant" 41 | value: 0 42 | } 43 | } 44 | } 45 | layer { 46 | name: "prob" 47 | type: "Softmax" 48 | bottom: "ip2" 49 | top: "prob" 50 | } 51 | -------------------------------------------------------------------------------- /holt-winters-forecast/hw_forecast.R: -------------------------------------------------------------------------------- 1 | hw_forecast <- function(df, m, h, al, be, ga) { 2 | 3 | y <- as.vector(df$users) 4 | l <- rep(NA,length(y)+h) 5 | b <- rep(NA,length(y)+h) 6 | s <- rep(NA,length(y)+h) 7 | yh <- rep(NA,length(y)+h) 8 | 9 | l[1] <- 1 10 | b[1] <- 1 11 | s[1] <- 1 12 | yh[1:2] <- y[1:2] 13 | 14 | # smoothing 15 | for(t in 2:length(y)) { 16 | yh[t] <- l[t-1] + b[t-1] + s[max(1,t-m)] 17 | 18 | l[t] <- al * (y[t] - s[max(1,t-m)]) + (1 - al) * (l[t-1] + b[t-1]) 19 | b[t] <- be * (l[t] - l[t-1]) + (1 - be) * b[t-1] 20 | s[t] <- ga * (y[t] - l[t-1] - b[t-1]) + (1 - ga) * s[max(1,t-m)] 21 | } 22 | 23 | # forecasting 24 | n <- length(y) 25 | for(t in 1:h) { 26 | yh[n+t] <- l[n] + t*b[n] + s[n-m+(t-1)%%m+1] 27 | b[n+t] <- b[n] 28 | s[n+t] <- s[n-m+(t-1)%%m+1] 29 | l[n+t] <- l[n] 30 | } 31 | 32 | return(list( 33 | data = df, 34 | ts = data.frame( 35 | y = c(y,rep(NA, length(b)-length(y))), 36 | yh = yh[1:length(b)], 37 | trend = b, 38 | level = l, 39 | season = s 40 | ), 41 | frequency = m, 42 | horizon = h, 43 | hw = list( 44 | alpha = al, 45 | beta = be, 46 | gamma = ga 47 | ) 48 | )) 49 | } -------------------------------------------------------------------------------- /roc-auc/plot_roc.R: -------------------------------------------------------------------------------- 1 | plot_roc <- function(roc, threshold, cost_of_fp, cost_of_fn) { 2 | library(gridExtra) 3 | 4 | norm_vec <- function(v) (v - min(v))/diff(range(v)) 5 | 6 | idx_threshold = which.min(abs(roc$threshold-threshold)) 7 | 8 | col_ramp <- colorRampPalette(c("green","orange","red","black"))(100) 9 | col_by_cost <- col_ramp[ceiling(norm_vec(roc$cost)*99)+1] 10 | p_roc <- ggplot(roc, aes(fpr,tpr)) + 11 | geom_line(color=rgb(0,0,1,alpha=0.3)) + 12 | geom_point(color=col_by_cost, size=4, alpha=0.5) + 13 | coord_fixed() + 14 | geom_line(aes(threshold,threshold), color=rgb(0,0,1,alpha=0.5)) + 15 | labs(title = sprintf("ROC")) + xlab("FPR") + ylab("TPR") + 16 | geom_hline(yintercept=roc[idx_threshold,"tpr"], alpha=0.5, linetype="dashed") + 17 | geom_vline(xintercept=roc[idx_threshold,"fpr"], alpha=0.5, linetype="dashed") 18 | 19 | p_cost <- ggplot(roc, aes(threshold, cost)) + 20 | geom_line(color=rgb(0,0,1,alpha=0.3)) + 21 | geom_point(color=col_by_cost, size=4, alpha=0.5) + 22 | labs(title = sprintf("cost function")) + 23 | geom_vline(xintercept=threshold, alpha=0.5, linetype="dashed") 24 | 25 | sub_title <- sprintf("threshold at %.2f - cost of FP = %d, cost of FN = %d", threshold, cost_of_fp, cost_of_fn) 26 | 27 | grid.arrange(p_roc, p_cost, ncol=2, sub=textGrob(sub_title, gp=gpar(cex=1), just="bottom")) 28 | } -------------------------------------------------------------------------------- /tesseract-training/commands.txt: -------------------------------------------------------------------------------- 1 | Install tesseract RC 3.03 2 | Install Leptonica 1.7+ 3 | Install jTessBoxEditor 4 | 5 | convert -density 500 test.pdf -quality 100 test.png 6 | convert -density 500 training.pdf -quality 100 training.png 7 | tesseract test.png test -l eng 8 | 9 | PDF to TIFF: 10 | gs -dNOPAUSE -q -r300 -sDEVICE=tiffg4 -dBATCH -sOutputFile=eng2.LobsterTwo.exp0.tif -dFirstPage=1 -dLastPage=3 LobsterTwo.pdf 11 | 12 | 13 | Create Box file: 14 | 15 | tesseract eng2.LobsterTwo.exp0.tif eng2.LobsterTwo.exp0 batch.nochop makebox 16 | tesseract eng2.LobsterTwo.exp0.tif eng2.LobsterTwo.exp0 -l eng2 batch.nochop makebox 17 | 18 | Correct Box file (mind order of characters) 19 | 20 | Two files: 21 | - eng2.LobsterTwo.exp0.tif 22 | - eng2.LobsterTwo.exp0.box 23 | 24 | Training: 25 | 26 | tesseract eng2.LobsterTwo.exp0.tif eng2.LobsterTwo.exp0 nobatch box.train 27 | 28 | unicharset_extractor eng.LobsterTwo.exp0.box 29 | 30 | echo "LobsterTwo 0 0 0 0 0" > font_properties 31 | 32 | shapeclustering -F font_properties -U unicharset eng2.LobsterTwo.exp0.tr 33 | mftraining -F font_properties -U unicharset -O eng2.unicharset eng2.LobsterTwo.exp0.tr 34 | cntraining eng2.LobsterTwo.exp0.tr 35 | 36 | 37 | mv inttemp eng2.inttemp 38 | mv normproto eng2.normproto 39 | mv pffmtable eng2.pffmtable 40 | mv shapetable eng2.shapetable 41 | combine_tessdata eng2. 42 | 43 | sudo cp eng2.traineddata /usr/local/share/tessdata/ 44 | 45 | tesseract test_LobsterTwo.png test_LobsterTwo_1 -l eng2 46 | -------------------------------------------------------------------------------- /deeplearning-with-caffe/model_train_test.prototxt: -------------------------------------------------------------------------------- 1 | name: "otto" 2 | layer { 3 | name: "otto" 4 | type: "Data" 5 | top: "data" 6 | top: "label" 7 | include { 8 | phase: TRAIN 9 | } 10 | data_param { 11 | source: "train_data_lmdb" 12 | batch_size: 64 13 | backend: LMDB 14 | } 15 | } 16 | layer { 17 | name: "simple" 18 | type: "Data" 19 | top: "data" 20 | top: "label" 21 | include { 22 | phase: TEST 23 | } 24 | data_param { 25 | source: "test_data_lmdb" 26 | batch_size: 100 27 | backend: LMDB 28 | } 29 | } 30 | layer { 31 | name: "ip1" 32 | type: "InnerProduct" 33 | bottom: "data" 34 | top: "ip1" 35 | inner_product_param { 36 | num_output: 30 37 | weight_filler { 38 | type: "xavier" 39 | } 40 | bias_filler { 41 | type: "constant" 42 | value: 0 43 | } 44 | } 45 | } 46 | layer { 47 | name: "relu1" 48 | type: "ReLU" 49 | bottom: "ip1" 50 | top: "ip1" 51 | } 52 | layer { 53 | name: "ip2" 54 | type: "InnerProduct" 55 | bottom: "ip1" 56 | top: "ip2" 57 | inner_product_param { 58 | num_output: 9 59 | weight_filler { 60 | type: "xavier" 61 | } 62 | bias_filler { 63 | type: "constant" 64 | value: 0 65 | } 66 | } 67 | } 68 | layer { 69 | name: "accuracy" 70 | type: "Accuracy" 71 | bottom: "ip2" 72 | bottom: "label" 73 | top: "accuracy" 74 | include { 75 | phase: TEST 76 | } 77 | } 78 | layer { 79 | name: "loss" 80 | type: "SoftmaxWithLoss" 81 | bottom: "ip2" 82 | bottom: "label" 83 | top: "loss" 84 | } 85 | -------------------------------------------------------------------------------- /holt-winters-forecast/temp.csv: -------------------------------------------------------------------------------- 1 | "y" "yh" "trend" "level" "season" 2 | "324" 356 308.740937991624 1.774781623046 252.746257859098 65.4464925342015 3 | "325" 342 304.030469360439 2.15447692944162 258.3179925461 53.306382942251 4 | "326" 266 309.618051935224 1.71829641008937 256.110664282019 44.7837772661604 5 | "327" 267 275.740854508523 1.63088786500414 256.954875241256 17.0378083655624 6 | "328" 108 153.876409406988 1.17212377093426 253.998122165561 -109.296994639971 7 | "329" 123 150.56970957483 0.896426675185958 252.413274979013 -107.357507319148 8 | "330" NA 295.354009257002 0.896426675185957 253.309701654199 42.0443076028028 9 | "331" NA 319.652620863586 0.896426675185959 254.206128329385 65.4464925342015 10 | "332" NA 308.408937946822 0.896426675185958 255.102555004571 53.306382942251 11 | "333" NA 300.782758945917 0.896426675185957 255.998981679757 44.7837772661604 12 | "334" NA 273.933216720505 0.896426675185959 256.895408354943 17.0378083655624 13 | "335" NA 148.494840390157 0.896426675185961 257.791835030128 -109.296994639971 14 | "336" NA 151.330754386166 0.896426675185963 258.688261705314 -107.357507319148 15 | "337" NA 301.628995983303 0.896426675185965 259.5846883805 42.0443076028028 16 | "338" NA 325.927607589888 0.896426675185966 260.481115055686 65.4464925342015 17 | "339" NA 314.683924673123 0.896426675185967 261.377541730872 53.306382942251 18 | "340" NA 307.057745672219 0.896426675185968 262.273968406058 44.7837772661604 19 | "341" NA 280.208203446807 0.896426675185969 263.170395081244 17.0378083655624 20 | "342" NA 154.769827116459 0.89642667518597 264.06682175643 -109.296994639971 21 | "343" NA 157.605741112468 0.896426675185971 264.963248431616 -107.357507319148 22 | -------------------------------------------------------------------------------- /postgresql-imputation/locf-and-linear-full.sql: -------------------------------------------------------------------------------- 1 | create or replace function locf_s(a float, b float) 2 | returns float 3 | language sql 4 | as ' 5 | select coalesce(b, a) 6 | '; 7 | 8 | drop aggregate if exists locf(float); 9 | create aggregate locf(float) ( 10 | sfunc = locf_s, 11 | stype = float 12 | ); 13 | 14 | with 15 | tbl0 as ( 16 | select a, b, t, v, 17 | locf(v) over t_asc as v_locf, 18 | locf(v) over t_desc as v_focb, 19 | locf(case when v is not null then t else null end) 20 | over t_asc as t_locf, 21 | locf(case when v is not null then t else null end) 22 | over t_desc as t_focb 23 | from tbl 24 | window t_asc as (partition by a,b order by t), 25 | t_desc as (partition by a,b order by t desc) 26 | ), 27 | tbl1 as ( 28 | select a, b, t, v, v_locf, v_focb, t_locf, t_focb, 29 | case 30 | when 31 | t_focb != t_locf 32 | and v_locf is not null 33 | and v_focb is not null 34 | then 35 | v_locf + ( 36 | (v_focb - v_locf) 37 | * 38 | (t - t_locf) / 39 | (t_focb - t_locf) 40 | ) 41 | else coalesce(v_locf, v_focb) 42 | end as v_final 43 | from tbl0 44 | order by a,b,t 45 | ) 46 | select * from tbl1 order by a,b,t; 47 | 48 | /* 49 | -- use this instead of the last select above to 50 | -- directly update the values in tbl.v 51 | 52 | update tbl as tb 53 | set v = t1.v_final 54 | from t1 55 | where 56 | tb.a = t1.a and tb.b = t1.b and tb.t = t1.t 57 | ;*/ 58 | -------------------------------------------------------------------------------- /people-had-more-sex-in-summer/monthplot_for_country.R: -------------------------------------------------------------------------------- 1 | monthplot_for_country <- function(data, country, sw=12, tw=36, pstl=FALSE, yred) { 2 | ts <- extract_ts_for_country(data, country) 3 | 4 | stl <- stl(ts, s.window=sw, t.window=tw) 5 | 6 | start <- start(ts) 7 | end <- end(ts) 8 | 9 | title <- sprintf("Live Births for %s from %d-%d until %d-%d",country,start[1],start[2],end[1],end[2]) 10 | 11 | if(pstl) { 12 | plot(stl, main=title) 13 | cat("press [any key] ...") 14 | l <- readline() 15 | } 16 | 17 | monthplot(stl$time.series[,"seasonal"], main=title, ylab="") 18 | lim <- par("usr") 19 | col <- list( 20 | winter = rgb( 20/255, 129/255, 255/255, 0.1), 21 | spring = rgb( 67/255, 255/255, 20/255, 0.1), 22 | summer = rgb(255/255, 168/255, 20/255, 0.1), 23 | autumn = rgb(107/255, 62/255, 0/255, 0.1) 24 | ) 25 | 26 | rect(0.55, lim[3]-1, 2.45, lim[4]+1, border = col$winter, col = col$winter) 27 | rect(11.55, lim[3]-1, 12.45, lim[4]+1, border = col$winter, col = col$winter) 28 | rect(2.55, lim[3]-1, 5.45, lim[4]+1, border = col$spring, col = col$spring) 29 | rect(5.55, lim[3]-1, 8.45, lim[4]+1, border = col$summer, col = col$summer) 30 | rect(8.55, lim[3]-1, 11.45, lim[4]+1, border = col$autumn, col = col$autumn) 31 | 32 | if(!is.null(yred)) { 33 | abline(v=(1:12)-0.45+0.9*(yred-start[1])/(end[1]-start[1]), col=rgb(1,0,0,0.4)) 34 | str <- sprintf("lines mark year %d",yred) 35 | mtext(str, side=3, adj=1, line=1, col="red", cex=.8) 36 | } 37 | 38 | mtext("(joyofdata.de)", side=3, adj=0, line=1, col="black", cex=.8) 39 | mtext("F.x. a birth in September indicates (ML) associated month of intercourse being December.", side=1, adj=0.5, line=2, col=rgb(.4,.4,.4), cex=.8) 40 | } -------------------------------------------------------------------------------- /deeplearning-with-caffe/model_train_test_2hl.prototxt: -------------------------------------------------------------------------------- 1 | name: "otto" 2 | layer { 3 | name: "otto" 4 | type: "Data" 5 | top: "data" 6 | top: "label" 7 | include { 8 | phase: TRAIN 9 | } 10 | data_param { 11 | source: "train_data_lmdb" 12 | batch_size: 64 13 | backend: LMDB 14 | } 15 | } 16 | layer { 17 | name: "simple" 18 | type: "Data" 19 | top: "data" 20 | top: "label" 21 | include { 22 | phase: TEST 23 | } 24 | data_param { 25 | source: "test_data_lmdb" 26 | batch_size: 100 27 | backend: LMDB 28 | } 29 | } 30 | layer { 31 | name: "ip1" 32 | type: "InnerProduct" 33 | bottom: "data" 34 | top: "ip1" 35 | inner_product_param { 36 | num_output: 20 37 | weight_filler { 38 | type: "xavier" 39 | } 40 | bias_filler { 41 | type: "constant" 42 | value: 0 43 | } 44 | } 45 | } 46 | layer { 47 | name: "relu1" 48 | type: "ReLU" 49 | bottom: "ip1" 50 | top: "ip1" 51 | } 52 | layer { 53 | name: "ip2" 54 | type: "InnerProduct" 55 | bottom: "ip1" 56 | top: "ip2" 57 | inner_product_param { 58 | num_output: 20 59 | weight_filler { 60 | type: "xavier" 61 | } 62 | bias_filler { 63 | type: "constant" 64 | value: 0 65 | } 66 | } 67 | } 68 | layer { 69 | name: "relu2" 70 | type: "ReLU" 71 | bottom: "ip2" 72 | top: "ip2" 73 | } 74 | layer { 75 | name: "ip3" 76 | type: "InnerProduct" 77 | bottom: "ip2" 78 | top: "ip3" 79 | inner_product_param { 80 | num_output: 9 81 | weight_filler { 82 | type: "xavier" 83 | } 84 | bias_filler { 85 | type: "constant" 86 | value: 0 87 | } 88 | } 89 | } 90 | layer { 91 | name: "accuracy" 92 | type: "Accuracy" 93 | bottom: "ip3" 94 | bottom: "label" 95 | top: "accuracy" 96 | include { 97 | phase: TEST 98 | } 99 | } 100 | layer { 101 | name: "loss" 102 | type: "SoftmaxWithLoss" 103 | bottom: "ip2" 104 | bottom: "label" 105 | top: "loss" 106 | } 107 | -------------------------------------------------------------------------------- /installing-digits/transform-and-duplicate-training-images.sh: -------------------------------------------------------------------------------- 1 | # this file is not intended to be run at once 2 | # but instead manually line by line 3 | 4 | sudo apt-get install lynx-cur 5 | sudo apt-get install unzip 6 | sudo apt-get install imagemagick 7 | 8 | # A 100 GB EBS volume is mounted at ~/data 9 | 10 | # make sure that temporary download files are stored on the EBS 11 | export LYNX_TEMP_SPACE=~/data 12 | lynx www.kaggle.com 13 | 14 | cat train.zip.* > train.zip 15 | unzip train.zip -d . 16 | 17 | mkdir ~/data/training_0 18 | mkdir ~/data/training_0/train_sm 19 | mkdir ~/data/training_0/train_sm_180 20 | mkdir ~/data/training_0/train_sm_flop 21 | mkdir ~/data/training_0/train_sm_180_flop 22 | 23 | # transforming the original JPEGs into four versions 24 | 25 | for f in ~/data/train/*.jpeg 26 | do 27 | convert $f -fuzz 15% -trim -resize 256x256 \ 28 | -background black -gravity center -extent 256x256 \ 29 | ~/data/training_0/train_sm/$(basename -s .jpeg $f).png 30 | done 31 | 32 | for f in ~/data/training_0/train_sm/*.png 33 | do 34 | convert $f -rotate 180 ~/data/training_0/train_sm_180/$(basename $f) 35 | done 36 | 37 | for f in ~/data/training_0/train_sm/*.png 38 | do 39 | convert $f -flop ~/data/training_0/train_sm_flop/$(basename $f) 40 | done 41 | 42 | for f in ~/data/training_0/train_sm_180/*.png 43 | do 44 | convert $f -flop ~/data/training_0/train_sm_180_flop/$(basename $f) 45 | done 46 | 47 | # trainLabels.csv is provided by Kaggle for the training data set 48 | 49 | # skip first line, adjust paths, add extension, treat label {1,..,4} as 1 50 | tail -n +2 trainLabels.csv | \ 51 | sed 's/,/.png\t/g' | \ 52 | sed 's#^#/home/ubuntu/data/training_0/train_sm/#g' | \ 53 | sed 's/[234]$/1/g' \ 54 | > training_0/imgs.csv 55 | 56 | # manual intermediate step: 57 | # remove images which caused errors during above transformations (about 15) 58 | 59 | # create four lists (img,label) for all four versions 60 | cp imgs.csv train_sm.csv 61 | sed 's/train_sm/train_sm_180/g' imgs.csv > train_sm_180.csv 62 | sed 's/train_sm/train_sm_flop/g' imgs.csv > train_sm_flop.csv 63 | sed 's/train_sm/train_sm_180_flop/g' imgs.csv > train_sm_180_flop.csv 64 | 65 | # combine, shuffle and save in one file 66 | cat train_sm*.csv | shuf > train_all.csv 67 | 68 | # first 2000 images for testing 69 | # next 6000 images for validation 70 | # rest for training 71 | sed -n '1,2000p' < train_all.csv > testing.csv 72 | sed -n '2001,8000p' < train_all.csv > validation.csv 73 | sed -n '8001,$p' < train_all.csv > training.csv 74 | -------------------------------------------------------------------------------- /oauth2-google-api/console.py: -------------------------------------------------------------------------------- 1 | # https://developers.google.com/analytics/solutions/articles/hello-analytics-api 2 | # https://developers.google.com/api-client-library/python/auth/installed-app 3 | # https://developers.google.com/api-client-library/python/auth/web-app 4 | 5 | import sys 6 | import json 7 | import webbrowser 8 | import logging 9 | 10 | import httplib2 11 | import os.path 12 | 13 | 14 | from apiclient import discovery 15 | from oauth2client import client 16 | from oauth2client.file import Storage 17 | 18 | def get_first_profile_id(service): 19 | """Fetches first profile ID of account.""" 20 | accounts = service.management().accounts().list().execute() 21 | 22 | if accounts.get('items'): 23 | first_account_id = accounts.get('items')[0].get('id') 24 | webprops = service.management().webproperties() 25 | webprops = webprops.list(accountId = first_account_id).execute() 26 | 27 | if webproperties.get('items'): 28 | first_webproperty_id = webproperties.get('items')[0].get('id') 29 | 30 | profiles = service.management().profiles().list( 31 | accountId = first_account_id, 32 | webPropertyId = first_webproperty_id 33 | ).execute() 34 | 35 | if profiles.get('items')[0].get('id'): 36 | return profiles.get('items')[0].get('id') 37 | 38 | return None 39 | 40 | 41 | def query_analytics(service, profile_id, start_date, end_date, metric): 42 | """Performes simple query for profile.""" 43 | if profile_id == None or profile_id == "0": 44 | profile_id = get_first_profile_id(service) 45 | 46 | result = service.data().ga().get( 47 | ids = 'ga:' + profile_id, 48 | start_date = start_date, 49 | end_date = end_date, 50 | metrics = 'ga:' + metric 51 | ).execute() 52 | 53 | return result 54 | 55 | 56 | def read_credentials(fname): 57 | """Reads JSON with credentials from file.""" 58 | if os.path.isfile(fname): 59 | f = open(fname, "r") 60 | credentials = client.OAuth2Credentials.from_json(f.read()) 61 | f.close() 62 | else: 63 | credentials = None 64 | 65 | return credentials 66 | 67 | 68 | def write_credentials(fname, credentials): 69 | """Writes credentials as JSON to file.""" 70 | f = file(fname, "w") 71 | f.write(credentials.to_json()) 72 | f.close() 73 | 74 | 75 | def acquire_oauth2_credentials(secrets_file): 76 | """Flows through OAuth 2.0 authorization process for credentials.""" 77 | flow = client.flow_from_clientsecrets( 78 | secrets_file, 79 | scope='https://www.googleapis.com/auth/analytics.readonly', 80 | redirect_uri='urn:ietf:wg:oauth:2.0:oob') 81 | 82 | auth_uri = flow.step1_get_authorize_url() 83 | webbrowser.open(auth_uri) 84 | 85 | auth_code = raw_input('Enter the authentication code: ') 86 | 87 | credentials = flow.step2_exchange(auth_code) 88 | return credentials 89 | 90 | 91 | def create_service_object(credentials): 92 | """Creates Service object for credentials.""" 93 | http_auth = httplib2.Http() 94 | http_auth = credentials.authorize(http_auth) 95 | service = discovery.build('analytics', 'v3', http_auth) 96 | return service 97 | 98 | 99 | def oauth2_and_query_analytics( 100 | credentials_file, secrets_file, profile_id, 101 | start_date, end_date, metric): 102 | logging.basicConfig() 103 | """Performs authorization and then queries GA.""" 104 | 105 | credentials = read_credentials(credentials_file) 106 | 107 | if credentials is None or credentials.invalid: 108 | credentials = acquire_oauth2_credentials(secrets_file) 109 | write_credentials(credentials_file, credentials) 110 | 111 | service = create_service_object(credentials) 112 | results = query_analytics(service, profile_id, start_date, end_date, metric) 113 | 114 | return json.dumps(results, indent=4) 115 | 116 | 117 | 118 | if __name__ == '__main__': 119 | profile_id, start_date, end_date, metric = sys.argv[1:5] 120 | 121 | credentials_file = "credentials.json" 122 | secrets_file = "client_secrets.json" 123 | 124 | print oauth2_and_query_analytics( 125 | credentials_file, secrets_file, profile_id, 126 | start_date, end_date, metric) 127 | -------------------------------------------------------------------------------- /tesseract-training/training.box: -------------------------------------------------------------------------------- 1 | A 235 3220 263 3260 0 2 | e 278 3225 307 3260 0 3 | E 323 3225 348 3260 0 4 | b 358 3224 389 3260 0 5 | E 405 3225 427 3260 0 6 | T 437 3225 462 3260 0 7 | g 477 3215 501 3260 0 8 | A 516 3225 545 3260 0 9 | T 561 3225 577 3260 0 10 | a 614 3215 632 3260 0 11 | A 648 3224 678 3260 0 12 | t 688 3217 720 3260 0 13 | w 722 3225 755 3260 0 14 | on 770 3225 888 3260 0 15 | o 901 3221 934 3260 0 16 | A 948 3224 978 3260 0 17 | E 991 3224 1012 3260 0 18 | T 1026 3225 1058 3260 0 19 | w 1070 3225 1103 3260 0 20 | T 1118 3225 1148 3260 0 21 | w 1161 3225 1207 3260 0 22 | T 1220 3225 1248 3260 0 23 | T 1261 3225 1290 3260 0 24 | E 1300 3225 1323 3260 0 25 | a 1360 3225 1385 3249 0 26 | b 1396 3225 1414 3258 0 27 | c 1428 3225 1447 3249 0 28 | d 1457 3225 1482 3258 0 29 | e 1492 3225 1511 3249 0 30 | f 1516 3214 1536 3260 0 31 | g 1544 3214 1570 3249 0 32 | h 1581 3225 1605 3258 0 33 | i 1614 3225 1624 3258 0 34 | f 1655 3214 1673 3258 0 35 | h 1683 3225 1707 3258 0 36 | t 1718 3225 1730 3258 0 37 | w 1740 3225 1774 3249 0 38 | n 1785 3225 1809 3249 0 39 | o 1820 3225 1843 3249 0 40 | p 1852 3214 1870 3250 0 41 | a 1884 3214 1902 3249 0 42 | r 1917 3225 1931 3249 0 43 | s 1944 3225 1963 3249 0 44 | t 1972 3225 1987 3256 0 45 | u 1997 3225 2017 3249 0 46 | v 2054 3225 2069 3249 0 47 | w 2085 3225 2111 3249 0 48 | w 2128 3225 2152 3251 0 49 | y 2163 3214 2179 3249 0 50 | e 240 3145 258 3169 0 51 | o 271 3145 295 3180 0 52 | i 310 3145 320 3180 0 53 | E 337 3145 358 3180 0 54 | E 373 3145 395 3180 0 55 | g 409 3145 431 3180 0 56 | E 446 3145 466 3180 0 57 | o 482 3145 505 3180 0 58 | T 519 3145 539 3180 0 59 | E 553 3145 573 3180 0 60 | g 590 3145 613 3180 0 61 | . 627 3145 633 3151 0 62 | E 650 3139 673 3180 0 63 | d 689 3143 719 3178 0 64 | T 735 3145 753 3178 0 65 | h 238 2983 287 3018 0 66 | e 310 2983 326 3007 0 67 | w 363 2983 389 3007 0 68 | o 405 2983 428 3007 0 69 | r 437 2983 451 3007 0 70 | t 465 2983 477 3016 0 71 | d 487 2983 509 3016 0 72 | i 545 2983 558 3016 0 73 | s 568 2983 582 3007 0 74 | a 620 2983 642 3007 0 75 | d 678 2983 703 3016 0 76 | a 714 2983 739 3007 0 77 | n 749 2983 773 3007 0 78 | g 782 2972 808 3007 0 79 | e 818 2983 837 3007 0 80 | r 848 2983 862 3007 0 81 | o 876 2983 899 3007 0 82 | u 908 2983 931 3007 0 83 | s 941 2983 955 3007 0 84 | p 994 2972 1012 3008 0 85 | t 1026 2983 1038 3016 0 86 | a 1048 2983 1073 3007 0 87 | c 1084 2983 1103 3007 0 88 | e 1113 2983 1129 3007 0 89 | t 1164 2983 1179 3014 0 90 | o 1190 2983 1210 3007 0 91 | t 1247 2983 1259 3016 0 92 | i 1268 2983 1281 3016 0 93 | v 1292 2983 1307 3007 0 94 | e 1323 2983 1339 3007 0 95 | ; 1355 2981 1361 3004 0 96 | n 1400 2983 1424 3007 0 97 | o 1435 2983 1458 3007 0 98 | t 1465 2983 1476 3014 0 99 | b 1513 2983 1531 3016 0 100 | e 1545 2983 1564 3007 0 101 | c 1575 2983 1594 3007 0 102 | a 1604 2983 1629 3007 0 103 | u 1640 2983 1663 3007 0 104 | s 1672 2983 1691 3007 0 105 | e 1702 2983 1718 3007 0 106 | o 1755 2983 1778 3007 0 107 | f 1781 2972 1801 3018 0 108 | t 1831 2983 1846 3014 0 109 | h 1857 2983 1881 3016 0 110 | e 1891 2983 1907 3007 0 111 | p 1945 2972 1963 3008 0 112 | e 1977 2983 1996 3007 0 113 | o 2007 2983 2030 3007 0 114 | p 2038 2972 2056 3008 0 115 | t 2071 2983 2083 3016 0 116 | e 2093 2983 2109 3007 0 117 | w 239 2902 265 2926 0 118 | h 280 2902 304 2935 0 119 | o 314 2902 334 2926 0 120 | a 371 2902 396 2926 0 121 | r 407 2902 421 2926 0 122 | e 435 2902 451 2926 0 123 | e 488 2902 507 2926 0 124 | v 518 2902 533 2926 0 125 | i 548 2902 561 2935 0 126 | l 572 2902 581 2935 0 127 | ' 595 2896 601 2908 0 128 | b 640 2902 658 2935 0 129 | u 672 2902 695 2926 0 130 | t 704 2902 715 2933 0 131 | b 752 2902 770 2935 0 132 | e 784 2902 803 2926 0 133 | c 814 2902 833 2926 0 134 | a 843 2902 868 2926 0 135 | u 878 2902 901 2926 0 136 | s 911 2902 930 2926 0 137 | e 940 2902 956 2926 0 138 | o 994 2902 1017 2926 0 139 | f 1020 2891 1040 2937 0 140 | t 1070 2902 1085 2933 0 141 | h 1096 2902 1120 2935 0 142 | e 1130 2902 1146 2926 0 143 | p 1183 2891 1201 2927 0 144 | e 1215 2902 1234 2926 0 145 | o 1245 2902 1268 2926 0 146 | p 1277 2891 1295 2927 0 147 | t 1310 2902 1322 2935 0 148 | e 1332 2902 1348 2926 0 149 | w 1386 2902 1412 2926 0 150 | h 1427 2902 1451 2935 0 151 | o 1461 2902 1481 2926 0 152 | d 1518 2902 1543 2935 0 153 | o 1554 2902 1577 2926 0 154 | n 1586 2902 1607 2926 0 155 | ' 1621 2928 1626 2937 0 156 | t 1639 2902 1650 2933 0 157 | d 1687 2902 1712 2935 0 158 | o 1722 2902 1742 2926 0 159 | a 1779 2902 1804 2926 0 160 | n 1814 2902 1838 2926 0 161 | g 1849 2891 1872 2926 0 162 | t 1880 2902 1895 2933 0 163 | h 1906 2902 1930 2935 0 164 | i 1939 2902 1952 2935 0 165 | n 1963 2902 1987 2926 0 166 | g 1996 2891 2015 2926 0 167 | a 2054 2902 2079 2926 0 168 | b 2089 2902 2107 2935 0 169 | o 2121 2902 2144 2926 0 170 | u 2153 2902 2176 2926 0 171 | t 2185 2902 2196 2933 0 172 | t 238 2822 251 2855 0 173 | t 260 2822 271 2853 0 174 | . 285 2822 291 2828 0 175 | A 235 2736 263 2776 0 176 | t 279 2741 291 2774 0 177 | b 302 2741 320 2774 0 178 | e 334 2741 353 2765 0 179 | r 364 2741 378 2765 0 180 | t 390 2741 401 2772 0 181 | E 438 2741 460 2776 0 182 | i 471 2741 484 2774 0 183 | n 494 2741 518 2765 0 184 | s 528 2741 547 2765 0 185 | t 555 2741 570 2772 0 186 | e 581 2741 600 2765 0 187 | i 609 2741 622 2774 0 188 | n 633 2741 654 2765 0 189 | -------------------------------------------------------------------------------- /holt-winters-forecast/users-google.csv: -------------------------------------------------------------------------------- 1 | date,users 2 | 1/1/13,0 3 | 1/2/13,1 4 | 1/3/13,4 5 | 1/4/13,4 6 | 1/5/13,2 7 | 1/6/13,2 8 | 1/7/13,4 9 | 1/8/13,2 10 | 1/9/13,1 11 | 1/10/13,6 12 | 1/11/13,1 13 | 1/12/13,2 14 | 1/13/13,1 15 | 1/14/13,4 16 | 1/15/13,2 17 | 1/16/13,1 18 | 1/17/13,1 19 | 1/18/13,2 20 | 1/19/13,3 21 | 1/20/13,1 22 | 1/21/13,2 23 | 1/22/13,2 24 | 1/23/13,2 25 | 1/24/13,1 26 | 1/25/13,2 27 | 1/26/13,1 28 | 1/27/13,1 29 | 1/28/13,0 30 | 1/29/13,3 31 | 1/30/13,3 32 | 1/31/13,0 33 | 2/1/13,4 34 | 2/2/13,0 35 | 2/3/13,3 36 | 2/4/13,4 37 | 2/5/13,3 38 | 2/6/13,5 39 | 2/7/13,4 40 | 2/8/13,3 41 | 2/9/13,0 42 | 2/10/13,1 43 | 2/11/13,1 44 | 2/12/13,2 45 | 2/13/13,1 46 | 2/14/13,4 47 | 2/15/13,3 48 | 2/16/13,0 49 | 2/17/13,0 50 | 2/18/13,3 51 | 2/19/13,4 52 | 2/20/13,3 53 | 2/21/13,0 54 | 2/22/13,3 55 | 2/23/13,3 56 | 2/24/13,0 57 | 2/25/13,4 58 | 2/26/13,2 59 | 2/27/13,4 60 | 2/28/13,4 61 | 3/1/13,7 62 | 3/2/13,3 63 | 3/3/13,2 64 | 3/4/13,6 65 | 3/5/13,5 66 | 3/6/13,8 67 | 3/7/13,5 68 | 3/8/13,4 69 | 3/9/13,5 70 | 3/10/13,5 71 | 3/11/13,10 72 | 3/12/13,6 73 | 3/13/13,8 74 | 3/14/13,9 75 | 3/15/13,8 76 | 3/16/13,1 77 | 3/17/13,5 78 | 3/18/13,14 79 | 3/19/13,11 80 | 3/20/13,13 81 | 3/21/13,13 82 | 3/22/13,15 83 | 3/23/13,2 84 | 3/24/13,5 85 | 3/25/13,14 86 | 3/26/13,17 87 | 3/27/13,18 88 | 3/28/13,12 89 | 3/29/13,8 90 | 3/30/13,9 91 | 3/31/13,2 92 | 4/1/13,13 93 | 4/2/13,15 94 | 4/3/13,19 95 | 4/4/13,17 96 | 4/5/13,9 97 | 4/6/13,3 98 | 4/7/13,3 99 | 4/8/13,14 100 | 4/9/13,9 101 | 4/10/13,16 102 | 4/11/13,22 103 | 4/12/13,12 104 | 4/13/13,3 105 | 4/14/13,3 106 | 4/15/13,17 107 | 4/16/13,17 108 | 4/17/13,13 109 | 4/18/13,14 110 | 4/19/13,14 111 | 4/20/13,5 112 | 4/21/13,1 113 | 4/22/13,16 114 | 4/23/13,13 115 | 4/24/13,12 116 | 4/25/13,16 117 | 4/26/13,15 118 | 4/27/13,2 119 | 4/28/13,8 120 | 4/29/13,12 121 | 4/30/13,15 122 | 5/1/13,11 123 | 5/2/13,5 124 | 5/3/13,6 125 | 5/4/13,7 126 | 5/5/13,8 127 | 5/6/13,16 128 | 5/7/13,14 129 | 5/8/13,13 130 | 5/9/13,13 131 | 5/10/13,19 132 | 5/11/13,8 133 | 5/12/13,4 134 | 5/13/13,11 135 | 5/14/13,21 136 | 5/15/13,15 137 | 5/16/13,25 138 | 5/17/13,13 139 | 5/18/13,2 140 | 5/19/13,5 141 | 5/20/13,10 142 | 5/21/13,14 143 | 5/22/13,14 144 | 5/23/13,20 145 | 5/24/13,11 146 | 5/25/13,8 147 | 5/26/13,7 148 | 5/27/13,17 149 | 5/28/13,18 150 | 5/29/13,19 151 | 5/30/13,21 152 | 5/31/13,14 153 | 6/1/13,7 154 | 6/2/13,5 155 | 6/3/13,20 156 | 6/4/13,18 157 | 6/5/13,12 158 | 6/6/13,12 159 | 6/7/13,13 160 | 6/8/13,7 161 | 6/9/13,8 162 | 6/10/13,16 163 | 6/11/13,20 164 | 6/12/13,13 165 | 6/13/13,13 166 | 6/14/13,19 167 | 6/15/13,6 168 | 6/16/13,4 169 | 6/17/13,17 170 | 6/18/13,9 171 | 6/19/13,16 172 | 6/20/13,21 173 | 6/21/13,21 174 | 6/22/13,4 175 | 6/23/13,5 176 | 6/24/13,22 177 | 6/25/13,19 178 | 6/26/13,11 179 | 6/27/13,29 180 | 6/28/13,11 181 | 6/29/13,6 182 | 6/30/13,4 183 | 7/1/13,23 184 | 7/2/13,15 185 | 7/3/13,23 186 | 7/4/13,7 187 | 7/5/13,15 188 | 7/6/13,6 189 | 7/7/13,5 190 | 7/8/13,16 191 | 7/9/13,23 192 | 7/10/13,24 193 | 7/11/13,28 194 | 7/12/13,18 195 | 7/13/13,5 196 | 7/14/13,8 197 | 7/15/13,22 198 | 7/16/13,21 199 | 7/17/13,18 200 | 7/18/13,22 201 | 7/19/13,11 202 | 7/20/13,5 203 | 7/21/13,7 204 | 7/22/13,16 205 | 7/23/13,19 206 | 7/24/13,21 207 | 7/25/13,23 208 | 7/26/13,14 209 | 7/27/13,3 210 | 7/28/13,4 211 | 7/29/13,19 212 | 7/30/13,18 213 | 7/31/13,15 214 | 8/1/13,27 215 | 8/2/13,21 216 | 8/3/13,4 217 | 8/4/13,6 218 | 8/5/13,20 219 | 8/6/13,17 220 | 8/7/13,21 221 | 8/8/13,27 222 | 8/9/13,21 223 | 8/10/13,8 224 | 8/11/13,5 225 | 8/12/13,17 226 | 8/13/13,18 227 | 8/14/13,10 228 | 8/15/13,20 229 | 8/16/13,22 230 | 8/17/13,6 231 | 8/18/13,6 232 | 8/19/13,20 233 | 8/20/13,20 234 | 8/21/13,18 235 | 8/22/13,17 236 | 8/23/13,18 237 | 8/24/13,7 238 | 8/25/13,7 239 | 8/26/13,20 240 | 8/27/13,26 241 | 8/28/13,27 242 | 8/29/13,30 243 | 8/30/13,19 244 | 8/31/13,10 245 | 9/1/13,5 246 | 9/2/13,21 247 | 9/3/13,24 248 | 9/4/13,25 249 | 9/5/13,19 250 | 9/6/13,15 251 | 9/7/13,7 252 | 9/8/13,8 253 | 9/9/13,19 254 | 9/10/13,25 255 | 9/11/13,19 256 | 9/12/13,30 257 | 9/13/13,26 258 | 9/14/13,5 259 | 9/15/13,11 260 | 9/16/13,20 261 | 9/17/13,20 262 | 9/18/13,23 263 | 9/19/13,15 264 | 9/20/13,24 265 | 9/21/13,7 266 | 9/22/13,8 267 | 9/23/13,32 268 | 9/24/13,29 269 | 9/25/13,32 270 | 9/26/13,23 271 | 9/27/13,23 272 | 9/28/13,12 273 | 9/29/13,8 274 | 9/30/13,26 275 | 10/1/13,24 276 | 10/2/13,38 277 | 10/3/13,29 278 | 10/4/13,31 279 | 10/5/13,6 280 | 10/6/13,11 281 | 10/7/13,27 282 | 10/8/13,32 283 | 10/9/13,25 284 | 10/10/13,32 285 | 10/11/13,34 286 | 10/12/13,8 287 | 10/13/13,6 288 | 10/14/13,30 289 | 10/15/13,27 290 | 10/16/13,29 291 | 10/17/13,37 292 | 10/18/13,24 293 | 10/19/13,15 294 | 10/20/13,13 295 | 10/21/13,30 296 | 10/22/13,39 297 | 10/23/13,31 298 | 10/24/13,36 299 | 10/25/13,33 300 | 10/26/13,10 301 | 10/27/13,13 302 | 10/28/13,27 303 | 10/29/13,47 304 | 10/30/13,32 305 | 10/31/13,22 306 | 11/1/13,26 307 | 11/2/13,6 308 | 11/3/13,13 309 | 11/4/13,42 310 | 11/5/13,25 311 | 11/6/13,31 312 | 11/7/13,34 313 | 11/8/13,32 314 | 11/9/13,8 315 | 11/10/13,14 316 | 11/11/13,32 317 | 11/12/13,45 318 | 11/13/13,31 319 | 11/14/13,45 320 | 11/15/13,35 321 | 11/16/13,18 322 | 11/17/13,19 323 | 11/18/13,45 324 | 11/19/13,56 325 | 11/20/13,50 326 | 11/21/13,52 327 | 11/22/13,39 328 | 11/23/13,15 329 | 11/24/13,23 330 | 11/25/13,54 331 | 11/26/13,49 332 | 11/27/13,50 333 | 11/28/13,42 334 | 11/29/13,43 335 | 11/30/13,18 336 | 12/1/13,18 337 | 12/2/13,44 338 | 12/3/13,52 339 | 12/4/13,48 340 | 12/5/13,48 341 | 12/6/13,60 342 | 12/7/13,20 343 | 12/8/13,13 344 | 12/9/13,55 345 | 12/10/13,51 346 | 12/11/13,52 347 | 12/12/13,60 348 | 12/13/13,58 349 | 12/14/13,21 350 | 12/15/13,18 351 | 12/16/13,44 352 | 12/17/13,65 353 | 12/18/13,57 354 | 12/19/13,46 355 | 12/20/13,54 356 | 12/21/13,18 357 | 12/22/13,15 358 | 12/23/13,42 359 | 12/24/13,34 360 | 12/25/13,13 361 | 12/26/13,35 362 | 12/27/13,28 363 | 12/28/13,16 364 | 12/29/13,14 365 | 12/30/13,17 366 | 12/31/13,22 367 | 1/1/14,12 368 | 1/2/14,38 369 | 1/3/14,44 370 | 1/4/14,25 371 | 1/5/14,18 372 | 1/6/14,49 373 | 1/7/14,60 374 | 1/8/14,48 375 | 1/9/14,66 376 | 1/10/14,52 377 | 1/11/14,27 378 | 1/12/14,22 379 | 1/13/14,62 380 | 1/14/14,62 381 | 1/15/14,51 382 | 1/16/14,65 383 | 1/17/14,56 384 | 1/18/14,30 385 | 1/19/14,23 386 | 1/20/14,51 387 | 1/21/14,59 388 | 1/22/14,65 389 | 1/23/14,81 390 | 1/24/14,64 391 | 1/25/14,25 392 | 1/26/14,23 393 | 1/27/14,63 394 | 1/28/14,76 395 | 1/29/14,57 396 | 1/30/14,73 397 | 1/31/14,57 398 | 2/1/14,30 399 | 2/2/14,28 400 | 2/3/14,67 401 | 2/4/14,62 402 | 2/5/14,71 403 | 2/6/14,63 404 | 2/7/14,66 405 | 2/8/14,22 406 | 2/9/14,29 407 | 2/10/14,86 408 | 2/11/14,71 409 | 2/12/14,82 410 | 2/13/14,71 411 | 2/14/14,69 412 | 2/15/14,33 413 | 2/16/14,19 414 | 2/17/14,59 415 | 2/18/14,70 416 | 2/19/14,83 417 | 2/20/14,85 418 | 2/21/14,73 419 | 2/22/14,23 420 | 2/23/14,34 421 | 2/24/14,94 422 | 2/25/14,94 423 | 2/26/14,74 424 | 2/27/14,71 425 | 2/28/14,87 426 | 3/1/14,39 427 | 3/2/14,34 428 | 3/3/14,61 429 | 3/4/14,61 430 | 3/5/14,79 431 | 3/6/14,71 432 | 3/7/14,70 433 | 3/8/14,34 434 | 3/9/14,29 435 | 3/10/14,87 436 | 3/11/14,73 437 | 3/12/14,66 438 | 3/13/14,71 439 | 3/14/14,75 440 | 3/15/14,35 441 | 3/16/14,39 442 | 3/17/14,60 443 | 3/18/14,85 444 | 3/19/14,76 445 | 3/20/14,98 446 | 3/21/14,57 447 | 3/22/14,34 448 | 3/23/14,32 449 | 3/24/14,88 450 | 3/25/14,103 451 | 3/26/14,89 452 | 3/27/14,86 453 | 3/28/14,93 454 | 3/29/14,36 455 | 3/30/14,29 456 | 3/31/14,84 457 | 4/1/14,98 458 | 4/2/14,121 459 | 4/3/14,121 460 | 4/4/14,84 461 | 4/5/14,35 462 | 4/6/14,41 463 | 4/7/14,88 464 | 4/8/14,107 465 | 4/9/14,105 466 | 4/10/14,92 467 | 4/11/14,98 468 | 4/12/14,44 469 | 4/13/14,41 470 | 4/14/14,96 471 | 4/15/14,83 472 | 4/16/14,91 473 | 4/17/14,83 474 | 4/18/14,84 475 | 4/19/14,34 476 | 4/20/14,27 477 | 4/21/14,76 478 | 4/22/14,110 479 | 4/23/14,107 480 | 4/24/14,101 481 | 4/25/14,105 482 | 4/26/14,54 483 | 4/27/14,67 484 | 4/28/14,137 485 | 4/29/14,108 486 | 4/30/14,110 487 | 5/1/14,75 488 | 5/2/14,88 489 | 5/3/14,56 490 | 5/4/14,33 491 | 5/5/14,94 492 | 5/6/14,103 493 | 5/7/14,114 494 | 5/8/14,109 495 | 5/9/14,102 496 | 5/10/14,51 497 | 5/11/14,43 498 | 5/12/14,132 499 | 5/13/14,121 500 | 5/14/14,139 501 | 5/15/14,133 502 | 5/16/14,117 503 | 5/17/14,46 504 | 5/18/14,44 505 | 5/19/14,146 506 | 5/20/14,114 507 | 5/21/14,85 508 | 5/22/14,127 509 | 5/23/14,115 510 | 5/24/14,51 511 | 5/25/14,42 512 | 5/26/14,118 513 | 5/27/14,105 514 | 5/28/14,147 515 | 5/29/14,81 516 | 5/30/14,84 517 | 5/31/14,45 518 | 6/1/14,50 519 | 6/2/14,136 520 | 6/3/14,101 521 | 6/4/14,152 522 | 6/5/14,152 523 | 6/6/14,108 524 | 6/7/14,44 525 | 6/8/14,38 526 | 6/9/14,130 527 | 6/10/14,164 528 | 6/11/14,127 529 | 6/12/14,160 530 | 6/13/14,150 531 | 6/14/14,52 532 | 6/15/14,47 533 | 6/16/14,119 534 | 6/17/14,150 535 | 6/18/14,151 536 | 6/19/14,164 537 | 6/20/14,139 538 | 6/21/14,56 539 | 6/22/14,61 540 | 6/23/14,159 541 | 6/24/14,167 542 | 6/25/14,151 543 | 6/26/14,142 544 | 6/27/14,141 545 | 6/28/14,57 546 | 6/29/14,55 547 | 6/30/14,180 548 | 7/1/14,171 549 | 7/2/14,164 550 | 7/3/14,161 551 | 7/4/14,116 552 | 7/5/14,46 553 | 7/6/14,53 554 | 7/7/14,142 555 | 7/8/14,173 556 | 7/9/14,172 557 | 7/10/14,198 558 | 7/11/14,153 559 | 7/12/14,71 560 | 7/13/14,56 561 | 7/14/14,161 562 | 7/15/14,158 563 | 7/16/14,175 564 | 7/17/14,155 565 | 7/18/14,176 566 | 7/19/14,62 567 | 7/20/14,50 568 | 7/21/14,167 569 | 7/22/14,203 570 | 7/23/14,173 571 | 7/24/14,162 572 | 7/25/14,149 573 | 7/26/14,66 574 | 7/27/14,59 575 | 7/28/14,150 576 | 7/29/14,176 577 | 7/30/14,184 578 | 7/31/14,193 579 | 8/1/14,169 580 | 8/2/14,58 581 | 8/3/14,57 582 | 8/4/14,171 583 | 8/5/14,193 584 | 8/6/14,206 585 | 8/7/14,200 586 | 8/8/14,189 587 | 8/9/14,82 588 | 8/10/14,104 589 | 8/11/14,208 590 | 8/12/14,277 591 | 8/13/14,278 592 | 8/14/14,208 593 | 8/15/14,134 594 | 8/16/14,63 595 | 8/17/14,69 596 | 8/18/14,199 597 | 8/19/14,191 598 | 8/20/14,246 599 | 8/21/14,208 600 | 8/22/14,199 601 | 8/23/14,75 602 | 8/24/14,68 603 | 8/25/14,198 604 | 8/26/14,233 605 | 8/27/14,224 606 | 8/28/14,191 607 | 8/29/14,168 608 | 8/30/14,66 609 | 8/31/14,70 610 | 9/1/14,162 611 | 9/2/14,209 612 | 9/3/14,233 613 | 9/4/14,211 614 | 9/5/14,198 615 | 9/6/14,69 616 | 9/7/14,77 617 | 9/8/14,193 618 | 9/9/14,237 619 | 9/10/14,210 620 | 9/11/14,235 621 | 9/12/14,204 622 | 9/13/14,106 623 | 9/14/14,70 624 | 9/15/14,215 625 | 9/16/14,249 626 | 9/17/14,237 627 | 9/18/14,250 628 | 9/19/14,201 629 | 9/20/14,86 630 | 9/21/14,70 631 | 9/22/14,250 632 | 9/23/14,266 633 | 9/24/14,255 634 | 9/25/14,251 635 | 9/26/14,236 636 | 9/27/14,86 637 | 9/28/14,69 638 | 9/29/14,259 639 | 9/30/14,232 640 | 10/1/14,237 641 | 10/2/14,214 642 | 10/3/14,200 643 | 10/4/14,70 644 | 10/5/14,100 645 | 10/6/14,221 646 | 10/7/14,263 647 | 10/8/14,255 648 | 10/9/14,250 649 | 10/10/14,244 650 | 10/11/14,111 651 | 10/12/14,85 652 | 10/13/14,285 653 | 10/14/14,307 654 | 10/15/14,260 655 | 10/16/14,292 656 | 10/17/14,236 657 | 10/18/14,106 658 | 10/19/14,91 659 | 10/20/14,283 660 | 10/21/14,284 661 | 10/22/14,250 662 | 10/23/14,269 663 | 10/24/14,218 664 | 10/25/14,97 665 | 10/26/14,104 666 | 10/27/14,256 667 | 10/28/14,291 668 | 10/29/14,290 669 | 10/30/14,285 670 | 10/31/14,209 671 | 11/1/14,95 672 | 11/2/14,106 673 | 11/3/14,242 674 | 11/4/14,311 675 | 11/5/14,272 676 | 11/6/14,275 677 | 11/7/14,263 678 | 11/8/14,111 679 | 11/9/14,117 680 | 11/10/14,267 681 | 11/11/14,258 682 | 11/12/14,277 683 | 11/13/14,287 684 | 11/14/14,276 685 | 11/15/14,111 686 | 11/16/14,115 687 | 11/17/14,299 688 | 11/18/14,323 689 | 11/19/14,298 690 | 11/20/14,318 691 | 11/21/14,275 692 | 11/22/14,124 693 | 11/23/14,120 694 | 11/24/14,298 695 | 11/25/14,356 696 | 11/26/14,342 697 | 11/27/14,266 698 | 11/28/14,267 699 | 11/29/14,108 700 | 11/30/14,123 701 | 12/1/14,315 702 | 12/2/14,317 703 | 12/3/14,352 704 | 12/4/14,337 705 | 12/5/14,307 706 | 12/6/14,116 707 | 12/7/14,130 708 | 12/8/14,308 709 | 12/9/14,342 710 | 12/10/14,279 711 | 12/11/14,327 712 | 12/12/14,284 713 | 12/13/14,111 714 | 12/14/14,105 715 | 12/15/14,321 716 | 12/16/14,325 717 | 12/17/14,316 718 | 12/18/14,308 719 | 12/19/14,261 720 | 12/20/14,105 721 | 12/21/14,104 722 | 12/22/14,281 723 | 12/23/14,271 724 | 12/24/14,188 725 | 12/25/14,89 726 | 12/26/14,138 727 | 12/27/14,107 728 | 12/28/14,94 729 | 12/29/14,232 730 | 12/30/14,214 731 | 12/31/14,162 732 | 1/1/15,93 733 | 1/2/15,181 734 | 1/3/15,106 735 | 1/4/15,103 736 | 1/5/15,295 737 | -------------------------------------------------------------------------------- /holt-winters-forecast/users-all.csv: -------------------------------------------------------------------------------- 1 | date,users 2 | 1/1/13,0 3 | 1/2/13,1 4 | 1/3/13,4 5 | 1/4/13,5 6 | 1/5/13,2 7 | 1/6/13,2 8 | 1/7/13,5 9 | 1/8/13,2 10 | 1/9/13,1 11 | 1/10/13,8 12 | 1/11/13,2 13 | 1/12/13,2 14 | 1/13/13,4 15 | 1/14/13,4 16 | 1/15/13,5 17 | 1/16/13,2 18 | 1/17/13,3 19 | 1/18/13,2 20 | 1/19/13,3 21 | 1/20/13,2 22 | 1/21/13,3 23 | 1/22/13,2 24 | 1/23/13,4 25 | 1/24/13,2 26 | 1/25/13,3 27 | 1/26/13,1 28 | 1/27/13,2 29 | 1/28/13,1 30 | 1/29/13,3 31 | 1/30/13,3 32 | 1/31/13,1 33 | 2/1/13,6 34 | 2/2/13,1 35 | 2/3/13,4 36 | 2/4/13,5 37 | 2/5/13,3 38 | 2/6/13,7 39 | 2/7/13,6 40 | 2/8/13,3 41 | 2/9/13,0 42 | 2/10/13,1 43 | 2/11/13,3 44 | 2/12/13,3 45 | 2/13/13,1 46 | 2/14/13,8 47 | 2/15/13,3 48 | 2/16/13,1 49 | 2/17/13,4 50 | 2/18/13,4 51 | 2/19/13,6 52 | 2/20/13,4 53 | 2/21/13,4 54 | 2/22/13,7 55 | 2/23/13,4 56 | 2/24/13,2 57 | 2/25/13,5 58 | 2/26/13,2 59 | 2/27/13,6 60 | 2/28/13,10 61 | 3/1/13,10 62 | 3/2/13,3 63 | 3/3/13,4 64 | 3/4/13,9 65 | 3/5/13,8 66 | 3/6/13,10 67 | 3/7/13,9 68 | 3/8/13,6 69 | 3/9/13,7 70 | 3/10/13,7 71 | 3/11/13,15 72 | 3/12/13,10 73 | 3/13/13,14 74 | 3/14/13,11 75 | 3/15/13,10 76 | 3/16/13,2 77 | 3/17/13,6 78 | 3/18/13,16 79 | 3/19/13,17 80 | 3/20/13,20 81 | 3/21/13,14 82 | 3/22/13,17 83 | 3/23/13,3 84 | 3/24/13,5 85 | 3/25/13,21 86 | 3/26/13,30 87 | 3/27/13,23 88 | 3/28/13,13 89 | 3/29/13,12 90 | 3/30/13,10 91 | 3/31/13,5 92 | 4/1/13,18 93 | 4/2/13,26 94 | 4/3/13,36 95 | 4/4/13,52 96 | 4/5/13,50 97 | 4/6/13,16 98 | 4/7/13,10 99 | 4/8/13,23 100 | 4/9/13,14 101 | 4/10/13,23 102 | 4/11/13,40 103 | 4/12/13,192 104 | 4/13/13,18 105 | 4/14/13,14 106 | 4/15/13,26 107 | 4/16/13,21 108 | 4/17/13,18 109 | 4/18/13,22 110 | 4/19/13,28 111 | 4/20/13,15 112 | 4/21/13,3 113 | 4/22/13,20 114 | 4/23/13,20 115 | 4/24/13,18 116 | 4/25/13,24 117 | 4/26/13,18 118 | 4/27/13,5 119 | 4/28/13,8 120 | 4/29/13,15 121 | 4/30/13,18 122 | 5/1/13,12 123 | 5/2/13,10 124 | 5/3/13,10 125 | 5/4/13,9 126 | 5/5/13,10 127 | 5/6/13,18 128 | 5/7/13,18 129 | 5/8/13,18 130 | 5/9/13,21 131 | 5/10/13,25 132 | 5/11/13,9 133 | 5/12/13,5 134 | 5/13/13,12 135 | 5/14/13,23 136 | 5/15/13,18 137 | 5/16/13,27 138 | 5/17/13,16 139 | 5/18/13,4 140 | 5/19/13,7 141 | 5/20/13,11 142 | 5/21/13,19 143 | 5/22/13,16 144 | 5/23/13,23 145 | 5/24/13,13 146 | 5/25/13,13 147 | 5/26/13,8 148 | 5/27/13,25 149 | 5/28/13,19 150 | 5/29/13,20 151 | 5/30/13,21 152 | 5/31/13,21 153 | 6/1/13,9 154 | 6/2/13,8 155 | 6/3/13,28 156 | 6/4/13,20 157 | 6/5/13,15 158 | 6/6/13,13 159 | 6/7/13,16 160 | 6/8/13,8 161 | 6/9/13,9 162 | 6/10/13,22 163 | 6/11/13,23 164 | 6/12/13,15 165 | 6/13/13,20 166 | 6/14/13,24 167 | 6/15/13,7 168 | 6/16/13,7 169 | 6/17/13,20 170 | 6/18/13,14 171 | 6/19/13,17 172 | 6/20/13,22 173 | 6/21/13,24 174 | 6/22/13,8 175 | 6/23/13,7 176 | 6/24/13,28 177 | 6/25/13,24 178 | 6/26/13,20 179 | 6/27/13,38 180 | 6/28/13,20 181 | 6/29/13,10 182 | 6/30/13,4 183 | 7/1/13,26 184 | 7/2/13,19 185 | 7/3/13,28 186 | 7/4/13,10 187 | 7/5/13,23 188 | 7/6/13,10 189 | 7/7/13,7 190 | 7/8/13,17 191 | 7/9/13,30 192 | 7/10/13,29 193 | 7/11/13,32 194 | 7/12/13,27 195 | 7/13/13,10 196 | 7/14/13,13 197 | 7/15/13,26 198 | 7/16/13,29 199 | 7/17/13,25 200 | 7/18/13,34 201 | 7/19/13,18 202 | 7/20/13,8 203 | 7/21/13,8 204 | 7/22/13,20 205 | 7/23/13,30 206 | 7/24/13,26 207 | 7/25/13,29 208 | 7/26/13,18 209 | 7/27/13,7 210 | 7/28/13,6 211 | 7/29/13,24 212 | 7/30/13,28 213 | 7/31/13,20 214 | 8/1/13,32 215 | 8/2/13,23 216 | 8/3/13,4 217 | 8/4/13,9 218 | 8/5/13,25 219 | 8/6/13,21 220 | 8/7/13,25 221 | 8/8/13,31 222 | 8/9/13,23 223 | 8/10/13,29 224 | 8/11/13,31 225 | 8/12/13,29 226 | 8/13/13,35 227 | 8/14/13,45 228 | 8/15/13,25 229 | 8/16/13,28 230 | 8/17/13,10 231 | 8/18/13,7 232 | 8/19/13,27 233 | 8/20/13,27 234 | 8/21/13,28 235 | 8/22/13,24 236 | 8/23/13,28 237 | 8/24/13,9 238 | 8/25/13,11 239 | 8/26/13,28 240 | 8/27/13,33 241 | 8/28/13,32 242 | 8/29/13,36 243 | 8/30/13,22 244 | 8/31/13,11 245 | 9/1/13,8 246 | 9/2/13,23 247 | 9/3/13,27 248 | 9/4/13,29 249 | 9/5/13,29 250 | 9/6/13,19 251 | 9/7/13,9 252 | 9/8/13,11 253 | 9/9/13,32 254 | 9/10/13,34 255 | 9/11/13,24 256 | 9/12/13,35 257 | 9/13/13,32 258 | 9/14/13,7 259 | 9/15/13,12 260 | 9/16/13,30 261 | 9/17/13,29 262 | 9/18/13,29 263 | 9/19/13,23 264 | 9/20/13,28 265 | 9/21/13,10 266 | 9/22/13,12 267 | 9/23/13,33 268 | 9/24/13,37 269 | 9/25/13,44 270 | 9/26/13,40 271 | 9/27/13,31 272 | 9/28/13,14 273 | 9/29/13,15 274 | 9/30/13,33 275 | 10/1/13,34 276 | 10/2/13,46 277 | 10/3/13,38 278 | 10/4/13,43 279 | 10/5/13,12 280 | 10/6/13,17 281 | 10/7/13,35 282 | 10/8/13,40 283 | 10/9/13,31 284 | 10/10/13,39 285 | 10/11/13,54 286 | 10/12/13,13 287 | 10/13/13,11 288 | 10/14/13,34 289 | 10/15/13,30 290 | 10/16/13,38 291 | 10/17/13,40 292 | 10/18/13,32 293 | 10/19/13,17 294 | 10/20/13,19 295 | 10/21/13,35 296 | 10/22/13,46 297 | 10/23/13,40 298 | 10/24/13,44 299 | 10/25/13,39 300 | 10/26/13,11 301 | 10/27/13,19 302 | 10/28/13,34 303 | 10/29/13,51 304 | 10/30/13,37 305 | 10/31/13,31 306 | 11/1/13,33 307 | 11/2/13,23 308 | 11/3/13,22 309 | 11/4/13,52 310 | 11/5/13,38 311 | 11/6/13,44 312 | 11/7/13,47 313 | 11/8/13,38 314 | 11/9/13,14 315 | 11/10/13,16 316 | 11/11/13,45 317 | 11/12/13,59 318 | 11/13/13,39 319 | 11/14/13,59 320 | 11/15/13,49 321 | 11/16/13,21 322 | 11/17/13,20 323 | 11/18/13,50 324 | 11/19/13,70 325 | 11/20/13,66 326 | 11/21/13,66 327 | 11/22/13,56 328 | 11/23/13,19 329 | 11/24/13,28 330 | 11/25/13,68 331 | 11/26/13,64 332 | 11/27/13,74 333 | 11/28/13,53 334 | 11/29/13,56 335 | 11/30/13,33 336 | 12/1/13,24 337 | 12/2/13,56 338 | 12/3/13,64 339 | 12/4/13,64 340 | 12/5/13,66 341 | 12/6/13,72 342 | 12/7/13,23 343 | 12/8/13,17 344 | 12/9/13,66 345 | 12/10/13,66 346 | 12/11/13,60 347 | 12/12/13,70 348 | 12/13/13,131 349 | 12/14/13,35 350 | 12/15/13,27 351 | 12/16/13,60 352 | 12/17/13,78 353 | 12/18/13,70 354 | 12/19/13,64 355 | 12/20/13,64 356 | 12/21/13,22 357 | 12/22/13,18 358 | 12/23/13,49 359 | 12/24/13,45 360 | 12/25/13,21 361 | 12/26/13,41 362 | 12/27/13,37 363 | 12/28/13,20 364 | 12/29/13,15 365 | 12/30/13,25 366 | 12/31/13,38 367 | 1/1/14,17 368 | 1/2/14,49 369 | 1/3/14,53 370 | 1/4/14,70 371 | 1/5/14,26 372 | 1/6/14,69 373 | 1/7/14,83 374 | 1/8/14,69 375 | 1/9/14,87 376 | 1/10/14,59 377 | 1/11/14,33 378 | 1/12/14,27 379 | 1/13/14,81 380 | 1/14/14,76 381 | 1/15/14,67 382 | 1/16/14,81 383 | 1/17/14,71 384 | 1/18/14,41 385 | 1/19/14,29 386 | 1/20/14,64 387 | 1/21/14,71 388 | 1/22/14,77 389 | 1/23/14,100 390 | 1/24/14,76 391 | 1/25/14,31 392 | 1/26/14,30 393 | 1/27/14,79 394 | 1/28/14,83 395 | 1/29/14,72 396 | 1/30/14,83 397 | 1/31/14,67 398 | 2/1/14,32 399 | 2/2/14,35 400 | 2/3/14,80 401 | 2/4/14,71 402 | 2/5/14,79 403 | 2/6/14,76 404 | 2/7/14,72 405 | 2/8/14,27 406 | 2/9/14,34 407 | 2/10/14,98 408 | 2/11/14,86 409 | 2/12/14,100 410 | 2/13/14,84 411 | 2/14/14,81 412 | 2/15/14,51 413 | 2/16/14,35 414 | 2/17/14,82 415 | 2/18/14,94 416 | 2/19/14,91 417 | 2/20/14,105 418 | 2/21/14,94 419 | 2/22/14,35 420 | 2/23/14,47 421 | 2/24/14,103 422 | 2/25/14,113 423 | 2/26/14,84 424 | 2/27/14,91 425 | 2/28/14,108 426 | 3/1/14,48 427 | 3/2/14,44 428 | 3/3/14,81 429 | 3/4/14,82 430 | 3/5/14,92 431 | 3/6/14,92 432 | 3/7/14,83 433 | 3/8/14,53 434 | 3/9/14,37 435 | 3/10/14,101 436 | 3/11/14,143 437 | 3/12/14,91 438 | 3/13/14,88 439 | 3/14/14,102 440 | 3/15/14,65 441 | 3/16/14,45 442 | 3/17/14,78 443 | 3/18/14,113 444 | 3/19/14,97 445 | 3/20/14,112 446 | 3/21/14,91 447 | 3/22/14,44 448 | 3/23/14,44 449 | 3/24/14,102 450 | 3/25/14,112 451 | 3/26/14,102 452 | 3/27/14,102 453 | 3/28/14,113 454 | 3/29/14,54 455 | 3/30/14,36 456 | 3/31/14,111 457 | 4/1/14,120 458 | 4/2/14,140 459 | 4/3/14,146 460 | 4/4/14,111 461 | 4/5/14,42 462 | 4/6/14,54 463 | 4/7/14,107 464 | 4/8/14,133 465 | 4/9/14,139 466 | 4/10/14,117 467 | 4/11/14,130 468 | 4/12/14,78 469 | 4/13/14,62 470 | 4/14/14,120 471 | 4/15/14,100 472 | 4/16/14,121 473 | 4/17/14,113 474 | 4/18/14,105 475 | 4/19/14,45 476 | 4/20/14,65 477 | 4/21/14,170 478 | 4/22/14,173 479 | 4/23/14,147 480 | 4/24/14,142 481 | 4/25/14,143 482 | 4/26/14,109 483 | 4/27/14,258 484 | 4/28/14,343 485 | 4/29/14,201 486 | 4/30/14,173 487 | 5/1/14,117 488 | 5/2/14,135 489 | 5/3/14,96 490 | 5/4/14,62 491 | 5/5/14,199 492 | 5/6/14,160 493 | 5/7/14,273 494 | 5/8/14,288 495 | 5/9/14,205 496 | 5/10/14,92 497 | 5/11/14,254 498 | 5/12/14,517 499 | 5/13/14,255 500 | 5/14/14,949 501 | 5/15/14,604 502 | 5/16/14,331 503 | 5/17/14,154 504 | 5/18/14,104 505 | 5/19/14,258 506 | 5/20/14,209 507 | 5/21/14,163 508 | 5/22/14,193 509 | 5/23/14,184 510 | 5/24/14,99 511 | 5/25/14,81 512 | 5/26/14,179 513 | 5/27/14,187 514 | 5/28/14,264 515 | 5/29/14,129 516 | 5/30/14,143 517 | 5/31/14,119 518 | 6/1/14,83 519 | 6/2/14,210 520 | 6/3/14,175 521 | 6/4/14,296 522 | 6/5/14,1221 523 | 6/6/14,690 524 | 6/7/14,171 525 | 6/8/14,138 526 | 6/9/14,258 527 | 6/10/14,293 528 | 6/11/14,286 529 | 6/12/14,253 530 | 6/13/14,217 531 | 6/14/14,80 532 | 6/15/14,72 533 | 6/16/14,168 534 | 6/17/14,200 535 | 6/18/14,212 536 | 6/19/14,212 537 | 6/20/14,179 538 | 6/21/14,83 539 | 6/22/14,85 540 | 6/23/14,210 541 | 6/24/14,215 542 | 6/25/14,211 543 | 6/26/14,182 544 | 6/27/14,188 545 | 6/28/14,84 546 | 6/29/14,74 547 | 6/30/14,219 548 | 7/1/14,224 549 | 7/2/14,204 550 | 7/3/14,191 551 | 7/4/14,141 552 | 7/5/14,72 553 | 7/6/14,85 554 | 7/7/14,198 555 | 7/8/14,210 556 | 7/9/14,227 557 | 7/10/14,241 558 | 7/11/14,201 559 | 7/12/14,92 560 | 7/13/14,73 561 | 7/14/14,206 562 | 7/15/14,208 563 | 7/16/14,230 564 | 7/17/14,217 565 | 7/18/14,207 566 | 7/19/14,95 567 | 7/20/14,79 568 | 7/21/14,211 569 | 7/22/14,248 570 | 7/23/14,221 571 | 7/24/14,221 572 | 7/25/14,194 573 | 7/26/14,92 574 | 7/27/14,82 575 | 7/28/14,196 576 | 7/29/14,231 577 | 7/30/14,248 578 | 7/31/14,241 579 | 8/1/14,215 580 | 8/2/14,77 581 | 8/3/14,75 582 | 8/4/14,225 583 | 8/5/14,238 584 | 8/6/14,254 585 | 8/7/14,247 586 | 8/8/14,235 587 | 8/9/14,111 588 | 8/10/14,147 589 | 8/11/14,262 590 | 8/12/14,759 591 | 8/13/14,523 592 | 8/14/14,307 593 | 8/15/14,193 594 | 8/16/14,113 595 | 8/17/14,173 596 | 8/18/14,341 597 | 8/19/14,283 598 | 8/20/14,326 599 | 8/21/14,285 600 | 8/22/14,270 601 | 8/23/14,110 602 | 8/24/14,99 603 | 8/25/14,286 604 | 8/26/14,306 605 | 8/27/14,286 606 | 8/28/14,250 607 | 8/29/14,215 608 | 8/30/14,111 609 | 8/31/14,120 610 | 9/1/14,336 611 | 9/2/14,371 612 | 9/3/14,312 613 | 9/4/14,339 614 | 9/5/14,487 615 | 9/6/14,154 616 | 9/7/14,138 617 | 9/8/14,279 618 | 9/9/14,320 619 | 9/10/14,282 620 | 9/11/14,307 621 | 9/12/14,269 622 | 9/13/14,135 623 | 9/14/14,108 624 | 9/15/14,277 625 | 9/16/14,314 626 | 9/17/14,296 627 | 9/18/14,311 628 | 9/19/14,269 629 | 9/20/14,113 630 | 9/21/14,109 631 | 9/22/14,317 632 | 9/23/14,391 633 | 9/24/14,341 634 | 9/25/14,335 635 | 9/26/14,294 636 | 9/27/14,113 637 | 9/28/14,116 638 | 9/29/14,328 639 | 9/30/14,297 640 | 10/1/14,293 641 | 10/2/14,259 642 | 10/3/14,254 643 | 10/4/14,98 644 | 10/5/14,120 645 | 10/6/14,284 646 | 10/7/14,338 647 | 10/8/14,327 648 | 10/9/14,314 649 | 10/10/14,298 650 | 10/11/14,137 651 | 10/12/14,114 652 | 10/13/14,343 653 | 10/14/14,371 654 | 10/15/14,333 655 | 10/16/14,355 656 | 10/17/14,301 657 | 10/18/14,130 658 | 10/19/14,126 659 | 10/20/14,336 660 | 10/21/14,351 661 | 10/22/14,323 662 | 10/23/14,347 663 | 10/24/14,275 664 | 10/25/14,136 665 | 10/26/14,140 666 | 10/27/14,340 667 | 10/28/14,365 668 | 10/29/14,350 669 | 10/30/14,357 670 | 10/31/14,271 671 | 11/1/14,132 672 | 11/2/14,143 673 | 11/3/14,315 674 | 11/4/14,386 675 | 11/5/14,335 676 | 11/6/14,338 677 | 11/7/14,319 678 | 11/8/14,152 679 | 11/9/14,158 680 | 11/10/14,326 681 | 11/11/14,341 682 | 11/12/14,326 683 | 11/13/14,356 684 | 11/14/14,329 685 | 11/15/14,144 686 | 11/16/14,151 687 | 11/17/14,362 688 | 11/18/14,398 689 | 11/19/14,362 690 | 11/20/14,385 691 | 11/21/14,340 692 | 11/22/14,160 693 | 11/23/14,152 694 | 11/24/14,383 695 | 11/25/14,429 696 | 11/26/14,393 697 | 11/27/14,330 698 | 11/28/14,320 699 | 11/29/14,140 700 | 11/30/14,164 701 | 12/1/14,368 702 | 12/2/14,392 703 | 12/3/14,421 704 | 12/4/14,462 705 | 12/5/14,378 706 | 12/6/14,153 707 | 12/7/14,169 708 | 12/8/14,376 709 | 12/9/14,410 710 | 12/10/14,341 711 | 12/11/14,396 712 | 12/12/14,329 713 | 12/13/14,150 714 | 12/14/14,152 715 | 12/15/14,694 716 | 12/16/14,534 717 | 12/17/14,504 718 | 12/18/14,796 719 | 12/19/14,539 720 | 12/20/14,207 721 | 12/21/14,225 722 | 12/22/14,442 723 | 12/23/14,387 724 | 12/24/14,265 725 | 12/25/14,148 726 | 12/26/14,216 727 | 12/27/14,154 728 | 12/28/14,143 729 | 12/29/14,303 730 | 12/30/14,278 731 | 12/31/14,216 732 | 1/1/15,222 733 | 1/2/15,549 734 | 1/3/15,200 735 | 1/4/15,205 736 | 1/5/15,506 737 | -------------------------------------------------------------------------------- /opencpu-r-python/OpenCPU-Session.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "metadata": { 3 | "name": "", 4 | "signature": "sha256:725b3fe7321309c58acf1c70703d570fef9ab9450eed9099dc3bc1cee6b2062d" 5 | }, 6 | "nbformat": 3, 7 | "nbformat_minor": 0, 8 | "worksheets": [ 9 | { 10 | "cells": [ 11 | { 12 | "cell_type": "heading", 13 | "level": 1, 14 | "metadata": {}, 15 | "source": [ 16 | "Illustrating Interaction with OpenCPU" 17 | ] 18 | }, 19 | { 20 | "cell_type": "markdown", 21 | "metadata": {}, 22 | "source": [ 23 | "[**Introduction to OpenCPU for R on EC2 with Python**](http://www.joyofdata.de/blog/introduction-to-opencpu-for-r-on-ec2-with-python) - [joyofdata.de](http://www.joyofdata.de/blog/) / [GitHub](https://github.com/joyofdata) /\n", 24 | "[Twitter](https://twitter.com/joyofdata)" 25 | ] 26 | }, 27 | { 28 | "cell_type": "markdown", 29 | "metadata": {}, 30 | "source": [ 31 | "---" 32 | ] 33 | }, 34 | { 35 | "cell_type": "heading", 36 | "level": 2, 37 | "metadata": {}, 38 | "source": [ 39 | "Remotely Calling Procedures on HTTP" 40 | ] 41 | }, 42 | { 43 | "cell_type": "code", 44 | "collapsed": false, 45 | "input": [ 46 | "import json\n", 47 | "import requests" 48 | ], 49 | "language": "python", 50 | "metadata": {}, 51 | "outputs": [], 52 | "prompt_number": 81 53 | }, 54 | { 55 | "cell_type": "code", 56 | "collapsed": false, 57 | "input": [ 58 | "v = json.dumps([1,2,3,4,5])\n", 59 | "v" 60 | ], 61 | "language": "python", 62 | "metadata": {}, 63 | "outputs": [ 64 | { 65 | "metadata": {}, 66 | "output_type": "pyout", 67 | "prompt_number": 82, 68 | "text": [ 69 | "'[1, 2, 3, 4, 5]'" 70 | ] 71 | } 72 | ], 73 | "prompt_number": 82 74 | }, 75 | { 76 | "cell_type": "code", 77 | "collapsed": false, 78 | "input": [ 79 | "r = requests.post(\"http://public.opencpu.org/ocpu/library/base/R/mean\", data={\"x\":v})" 80 | ], 81 | "language": "python", 82 | "metadata": {}, 83 | "outputs": [], 84 | "prompt_number": 83 85 | }, 86 | { 87 | "cell_type": "code", 88 | "collapsed": false, 89 | "input": [ 90 | "print r.content" 91 | ], 92 | "language": "python", 93 | "metadata": {}, 94 | "outputs": [ 95 | { 96 | "output_type": "stream", 97 | "stream": "stdout", 98 | "text": [ 99 | "/ocpu/tmp/x0984badaa5/R/.val\n", 100 | "/ocpu/tmp/x0984badaa5/stdout\n", 101 | "/ocpu/tmp/x0984badaa5/source\n", 102 | "/ocpu/tmp/x0984badaa5/console\n", 103 | "/ocpu/tmp/x0984badaa5/info\n", 104 | "/ocpu/tmp/x0984badaa5/files/DESCRIPTION\n", 105 | "\n" 106 | ] 107 | } 108 | ], 109 | "prompt_number": 84 110 | }, 111 | { 112 | "cell_type": "code", 113 | "collapsed": false, 114 | "input": [ 115 | "r = requests.get(\"http://public.opencpu.org/ocpu/tmp/x0984badaa5/R/.val\")" 116 | ], 117 | "language": "python", 118 | "metadata": {}, 119 | "outputs": [], 120 | "prompt_number": 85 121 | }, 122 | { 123 | "cell_type": "code", 124 | "collapsed": false, 125 | "input": [ 126 | "print r.content" 127 | ], 128 | "language": "python", 129 | "metadata": {}, 130 | "outputs": [ 131 | { 132 | "output_type": "stream", 133 | "stream": "stdout", 134 | "text": [ 135 | "[1] 3\n", 136 | "\n" 137 | ] 138 | } 139 | ], 140 | "prompt_number": 86 141 | }, 142 | { 143 | "cell_type": "code", 144 | "collapsed": false, 145 | "input": [ 146 | "r_json = requests.post(\"http://public.opencpu.org/ocpu/library/base/R/mean/json\", data={\"x\":v})" 147 | ], 148 | "language": "python", 149 | "metadata": {}, 150 | "outputs": [], 151 | "prompt_number": 87 152 | }, 153 | { 154 | "cell_type": "code", 155 | "collapsed": false, 156 | "input": [ 157 | "print r_json.content" 158 | ], 159 | "language": "python", 160 | "metadata": {}, 161 | "outputs": [ 162 | { 163 | "output_type": "stream", 164 | "stream": "stdout", 165 | "text": [ 166 | "[\n", 167 | " 3\n", 168 | "]\n", 169 | "\n", 170 | "\n" 171 | ] 172 | } 173 | ], 174 | "prompt_number": 88 175 | }, 176 | { 177 | "cell_type": "code", 178 | "collapsed": false, 179 | "input": [ 180 | "r = requests.post(\"http://public.opencpu.org/ocpu/library/base/R/mean\", data={\"x\":v})\n", 181 | "\n", 182 | "for path in r.content.split():\n", 183 | " print \"\\n--------------------\\n\" + path + \" :\\n\\n\" \\\n", 184 | " + requests.get(\"http://public.opencpu.org{}\".format(path)).content" 185 | ], 186 | "language": "python", 187 | "metadata": {}, 188 | "outputs": [ 189 | { 190 | "output_type": "stream", 191 | "stream": "stdout", 192 | "text": [ 193 | "\n", 194 | "--------------------\n", 195 | "/ocpu/tmp/x0984badaa5/R/.val :\n", 196 | "\n", 197 | "[1] 3\n", 198 | "\n", 199 | "\n", 200 | "--------------------\n", 201 | "/ocpu/tmp/x0984badaa5/stdout :\n", 202 | "\n", 203 | "[1] 3\n" 204 | ] 205 | }, 206 | { 207 | "output_type": "stream", 208 | "stream": "stdout", 209 | "text": [ 210 | "\n", 211 | "\n", 212 | "--------------------\n", 213 | "/ocpu/tmp/x0984badaa5/source :\n", 214 | "\n", 215 | "mean(x = x)" 216 | ] 217 | }, 218 | { 219 | "output_type": "stream", 220 | "stream": "stdout", 221 | "text": [ 222 | "\n", 223 | "\n", 224 | "--------------------\n", 225 | "/ocpu/tmp/x0984badaa5/console :\n", 226 | "\n", 227 | "> mean(x = x)\n", 228 | "[1] 3" 229 | ] 230 | }, 231 | { 232 | "output_type": "stream", 233 | "stream": "stdout", 234 | "text": [ 235 | "\n", 236 | "\n", 237 | "--------------------\n", 238 | "/ocpu/tmp/x0984badaa5/info :\n", 239 | "\n", 240 | "R version 3.1.2 (2014-10-31)\n", 241 | "Platform: x86_64-pc-linux-gnu (64-bit)\n", 242 | "\n", 243 | "locale:\n", 244 | " [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C LC_TIME=en_US.UTF-8 \n", 245 | " [4] LC_COLLATE=en_US.UTF-8 LC_MONETARY=en_US.UTF-8 LC_MESSAGES=C \n", 246 | " [7] LC_PAPER=C LC_NAME=C LC_ADDRESS=C \n", 247 | "[10] LC_TELEPHONE=C LC_MEASUREMENT=C LC_IDENTIFICATION=C \n", 248 | "\n", 249 | "attached base packages:\n", 250 | "[1] stats graphics grDevices utils datasets methods base \n", 251 | "\n", 252 | "other attached packages:\n", 253 | "[1] opencpu_1.4.6\n", 254 | "\n", 255 | "loaded via a namespace (and not attached):\n", 256 | " [1] base64enc_0.1-2 brew_1.0-6 colorspace_1.2-4 devtools_1.6.1 \n", 257 | " [5] digest_0.6.7 evaluate_0.5.5 formatR_1.0 ggplot2_1.0.0 \n", 258 | " [9] grid_3.1.2 gtable_0.1.2 httpuv_99.999 httr_0.6.0 \n", 259 | "[13] jsonlite_0.9.14 knitr_1.8 lattice_0.20-29 MASS_7.3-35 \n", 260 | "[17] Matrix_1.1-4 mgcv_1.8-4 munsell_0.4.2 nlme_3.1-118 \n", 261 | "[21] openssl_0.2 parallel_3.1.2 plyr_1.8.1 proto_0.3-10 \n", 262 | "[25] RAppArmor_1.0.1.99 Rcpp_0.11.3 reshape2_1.4.1 scales_0.2.4 \n", 263 | "[29] sendmailR_1.2-1 stringr_0.6.2 tools_3.1.2 unixtools_0.1-1 \n" 264 | ] 265 | }, 266 | { 267 | "output_type": "stream", 268 | "stream": "stdout", 269 | "text": [ 270 | "\n", 271 | "\n", 272 | "--------------------\n", 273 | "/ocpu/tmp/x0984badaa5/files/DESCRIPTION :\n", 274 | "\n", 275 | "Package: x0984badaa5\n", 276 | "Type: Session\n", 277 | "Version: 1.0\n", 278 | "Author: OpenCPU\n", 279 | "Date: 2015-02-15\n", 280 | "Description: This file is automatically generated by OpenCPU.\n" 281 | ] 282 | }, 283 | { 284 | "output_type": "stream", 285 | "stream": "stdout", 286 | "text": [ 287 | "\n" 288 | ] 289 | } 290 | ], 291 | "prompt_number": 89 292 | }, 293 | { 294 | "cell_type": "markdown", 295 | "metadata": {}, 296 | "source": [ 297 | "---" 298 | ] 299 | }, 300 | { 301 | "cell_type": "heading", 302 | "level": 2, 303 | "metadata": {}, 304 | "source": [ 305 | "Chained RPC with Graphical Output" 306 | ] 307 | }, 308 | { 309 | "cell_type": "code", 310 | "collapsed": false, 311 | "input": [ 312 | "r = requests.post(\"http://public.opencpu.org/ocpu/library/stats/R/lm\", \n", 313 | " data={\"formula\":\"speed~dist\",\"data\":\"cars\"})" 314 | ], 315 | "language": "python", 316 | "metadata": {}, 317 | "outputs": [], 318 | "prompt_number": 90 319 | }, 320 | { 321 | "cell_type": "code", 322 | "collapsed": false, 323 | "input": [ 324 | "print r.content" 325 | ], 326 | "language": "python", 327 | "metadata": {}, 328 | "outputs": [ 329 | { 330 | "output_type": "stream", 331 | "stream": "stdout", 332 | "text": [ 333 | "/ocpu/tmp/x00fbf1aa4e/R/.val\n", 334 | "/ocpu/tmp/x00fbf1aa4e/stdout\n", 335 | "/ocpu/tmp/x00fbf1aa4e/source\n", 336 | "/ocpu/tmp/x00fbf1aa4e/console\n", 337 | "/ocpu/tmp/x00fbf1aa4e/info\n", 338 | "/ocpu/tmp/x00fbf1aa4e/files/DESCRIPTION\n", 339 | "\n" 340 | ] 341 | } 342 | ], 343 | "prompt_number": 91 344 | }, 345 | { 346 | "cell_type": "code", 347 | "collapsed": false, 348 | "input": [ 349 | "res = requests.get(\"http://public.opencpu.org/ocpu/tmp/x00fbf1aa4e/R/.val\")" 350 | ], 351 | "language": "python", 352 | "metadata": {}, 353 | "outputs": [], 354 | "prompt_number": 92 355 | }, 356 | { 357 | "cell_type": "code", 358 | "collapsed": false, 359 | "input": [ 360 | "print res.content" 361 | ], 362 | "language": "python", 363 | "metadata": {}, 364 | "outputs": [ 365 | { 366 | "output_type": "stream", 367 | "stream": "stdout", 368 | "text": [ 369 | "\n", 370 | "Call:\n", 371 | "lm(formula = speed ~ dist, data = cars)\n", 372 | "\n", 373 | "Coefficients:\n", 374 | "(Intercept) dist \n", 375 | " 8.2839 0.1656 \n", 376 | "\n", 377 | "\n" 378 | ] 379 | } 380 | ], 381 | "prompt_number": 93 382 | }, 383 | { 384 | "cell_type": "code", 385 | "collapsed": false, 386 | "input": [ 387 | "res = requests.post(\"http://public.opencpu.org/ocpu/library/base/R/get/json\", \n", 388 | " data={\"x\":\"'coefficients'\",\"pos\":\"x00fbf1aa4e\"})" 389 | ], 390 | "language": "python", 391 | "metadata": {}, 392 | "outputs": [], 393 | "prompt_number": 94 394 | }, 395 | { 396 | "cell_type": "code", 397 | "collapsed": false, 398 | "input": [ 399 | "print res.content" 400 | ], 401 | "language": "python", 402 | "metadata": {}, 403 | "outputs": [ 404 | { 405 | "output_type": "stream", 406 | "stream": "stdout", 407 | "text": [ 408 | "[\n", 409 | " 8.2839,\n", 410 | " 0.1656\n", 411 | "]\n", 412 | "\n", 413 | "\n" 414 | ] 415 | } 416 | ], 417 | "prompt_number": 95 418 | }, 419 | { 420 | "cell_type": "code", 421 | "collapsed": false, 422 | "input": [ 423 | "req = requests.post(\"http://public.opencpu.org/ocpu/library/graphics/R/plot\", \n", 424 | " data={\"x\":\"x00fbf1aa4e\"})" 425 | ], 426 | "language": "python", 427 | "metadata": {}, 428 | "outputs": [], 429 | "prompt_number": 96 430 | }, 431 | { 432 | "cell_type": "code", 433 | "collapsed": false, 434 | "input": [ 435 | "print req.content" 436 | ], 437 | "language": "python", 438 | "metadata": {}, 439 | "outputs": [ 440 | { 441 | "output_type": "stream", 442 | "stream": "stdout", 443 | "text": [ 444 | "/ocpu/tmp/x08b1e1b4b2/R/.val\n", 445 | "/ocpu/tmp/x08b1e1b4b2/graphics/1\n", 446 | "/ocpu/tmp/x08b1e1b4b2/graphics/2\n", 447 | "/ocpu/tmp/x08b1e1b4b2/graphics/3\n", 448 | "/ocpu/tmp/x08b1e1b4b2/graphics/4\n", 449 | "/ocpu/tmp/x08b1e1b4b2/source\n", 450 | "/ocpu/tmp/x08b1e1b4b2/console\n", 451 | "/ocpu/tmp/x08b1e1b4b2/info\n", 452 | "/ocpu/tmp/x08b1e1b4b2/files/DESCRIPTION\n", 453 | "\n" 454 | ] 455 | } 456 | ], 457 | "prompt_number": 97 458 | }, 459 | { 460 | "cell_type": "code", 461 | "collapsed": false, 462 | "input": [ 463 | "from IPython.display import Image" 464 | ], 465 | "language": "python", 466 | "metadata": {}, 467 | "outputs": [], 468 | "prompt_number": 98 469 | }, 470 | { 471 | "cell_type": "code", 472 | "collapsed": false, 473 | "input": [ 474 | "Image(url='http://public.opencpu.org/ocpu/tmp/x0f64e80a9b/graphics/1')" 475 | ], 476 | "language": "python", 477 | "metadata": {}, 478 | "outputs": [ 479 | { 480 | "html": [ 481 | "" 482 | ], 483 | "metadata": {}, 484 | "output_type": "pyout", 485 | "prompt_number": 99, 486 | "text": [ 487 | "" 488 | ] 489 | } 490 | ], 491 | "prompt_number": 99 492 | }, 493 | { 494 | "cell_type": "code", 495 | "collapsed": false, 496 | "input": [ 497 | "Image(url='http://public.opencpu.org/ocpu/tmp/x0f64e80a9b/graphics/2/png?width=300&height=300')" 498 | ], 499 | "language": "python", 500 | "metadata": {}, 501 | "outputs": [ 502 | { 503 | "html": [ 504 | "" 505 | ], 506 | "metadata": {}, 507 | "output_type": "pyout", 508 | "prompt_number": 100, 509 | "text": [ 510 | "" 511 | ] 512 | } 513 | ], 514 | "prompt_number": 100 515 | } 516 | ], 517 | "metadata": {} 518 | } 519 | ] 520 | } -------------------------------------------------------------------------------- /tesseract-training/training.box~: -------------------------------------------------------------------------------- 1 | T 502 4922 554 4980 0 2 | h 556 4922 590 4977 0 3 | e 590 4922 624 4977 0 4 | w 637 4922 682 4963 0 5 | o 685 4922 713 4961 0 6 | r 717 4922 742 4961 0 7 | l 746 4922 763 4977 0 8 | d 764 4922 803 4977 0 9 | i 816 4922 832 4977 0 10 | s 834 4922 864 4977 0 11 | a 877 4922 919 4961 0 12 | d 932 4921 970 4977 0 13 | a 971 4921 1007 4962 0 14 | n 1009 4921 1040 4962 0 15 | g 1043 4902 1074 4962 0 16 | e 1079 4921 1109 4962 0 17 | r 1110 4921 1134 4962 0 18 | o 1135 4922 1168 4963 0 19 | u 1170 4922 1201 4963 0 20 | s 1203 4922 1234 4963 0 21 | p 1250 4902 1279 4964 0 22 | l 1283 4922 1299 4977 0 23 | a 1300 4921 1334 4964 0 24 | c 1335 4920 1363 4962 0 25 | e 1363 4920 1398 4962 0 26 | t 1409 4922 1427 4973 0 27 | o 1428 4921 1469 4961 0 28 | l 1479 4922 1493 4977 0 29 | i 1493 4922 1507 4977 0 30 | v 1508 4921 1537 4963 0 31 | e 1542 4919 1571 4961 0 32 | ; 1572 4919 1585 4961 0 33 | n 1609 4921 1642 4962 0 34 | o 1644 4921 1674 4962 0 35 | t 1674 4920 1704 4973 0 36 | b 1714 4922 1743 4977 0 37 | e 1744 4922 1771 4963 0 38 | c 1772 4922 1800 4963 0 39 | a 1802 4922 1838 4963 0 40 | u 1841 4922 1871 4963 0 41 | s 1873 4922 1900 4963 0 42 | e 1901 4922 1935 4963 0 43 | o 1945 4922 1979 4963 0 44 | f 1972 4901 2006 4982 0 45 | t 2013 4920 2034 4975 0 46 | h 2035 4920 2067 4980 0 47 | e 2068 4920 2103 4963 0 48 | p 2118 4902 2147 4964 0 49 | e 2149 4921 2177 4964 0 50 | o 2177 4921 2210 4964 0 51 | p 2211 4902 2242 4964 0 52 | l 2245 4922 2258 4977 0 53 | e 2260 4921 2292 4962 0 54 | w 2307 4922 2352 4963 0 55 | h 2357 4922 2390 4977 0 56 | o 2390 4921 2432 4962 0 57 | a 2442 4922 2476 4961 0 58 | r 2479 4922 2504 4961 0 59 | e 2505 4922 2538 4961 0 60 | e 2550 4922 2578 4963 0 61 | v 2578 4922 2606 4963 0 62 | i 2610 4922 2627 4977 0 63 | l 2629 4920 2643 4977 0 64 | , 2644 4912 2657 4934 0 65 | b 2680 4922 2709 4977 0 66 | u 2712 4922 2741 4973 0 67 | t 2741 4922 2770 4973 0 68 | b 2783 4922 2812 4977 0 69 | e 2814 4922 2842 4963 0 70 | c 2843 4922 2871 4963 0 71 | a 2871 4922 2908 4963 0 72 | u 2909 4922 2941 4963 0 73 | s 2942 4922 2970 4963 0 74 | e 2971 4922 3004 4963 0 75 | o 3017 4921 3049 4962 0 76 | f 3041 4902 3073 4981 0 77 | t 3084 4922 3104 4977 0 78 | h 3104 4922 3137 4977 0 79 | e 3138 4921 3173 4963 0 80 | p 3187 4902 3216 4964 0 81 | e 3218 4921 3247 4964 0 82 | o 3247 4921 3280 4964 0 83 | p 3280 4899 3313 4964 0 84 | l 3313 4920 3330 4979 0 85 | e 3329 4921 3363 4964 0 86 | w 3376 4922 3421 4963 0 87 | h 3426 4922 3458 4977 0 88 | o 3459 4921 3499 4962 0 89 | d 3511 4922 3547 4981 0 90 | o 3547 4921 3581 4962 0 91 | n 3582 4921 3623 4962 0 92 | ' 3617 4963 3628 4983 0 93 | t 3629 4922 3654 4973 0 94 | d 3667 4922 3702 4977 0 95 | o 3702 4922 3741 4977 0 96 | a 503 4817 538 4858 0 97 | n 538 4817 573 4858 0 98 | y 573 4796 608 4858 0 99 | t 608 4817 630 4871 0 100 | h 631 4816 662 4874 0 101 | i 661 4816 683 4874 0 102 | n 685 4817 719 4858 0 103 | g 718 4796 761 4858 0 104 | a 774 4815 813 4858 0 105 | b 813 4816 844 4874 0 106 | o 844 4816 879 4858 0 107 | u 877 4816 912 4858 0 108 | t 911 4816 938 4870 0 109 | i 948 4819 963 4873 0 110 | t 965 4819 986 4873 0 111 | . 983 4817 997 4830 0 112 | A 496 4705 544 4773 0 113 | l 551 4714 566 4769 0 114 | b 574 4714 597 4769 0 115 | e 599 4714 625 4753 0 116 | r 625 4714 651 4753 0 117 | t 653 4714 678 4765 0 118 | E 690 4713 722 4773 0 119 | i 722 4713 738 4773 0 120 | n 742 4711 774 4755 0 121 | s 772 4711 804 4755 0 122 | t 802 4712 822 4766 0 123 | e 823 4712 849 4755 0 124 | i 851 4712 868 4770 0 125 | n 868 4712 910 4755 0 126 | @ 501 4505 547 4564 0 127 | w 549 4505 628 4546 0 128 | a 630 4505 683 4544 0 129 | M 702 4505 751 4560 0 130 | J 763 4485 819 4564 0 131 | W 830 4505 895 4556 0 132 | G 898 4505 939 4544 0 133 | W 949 4505 1112 4560 0 134 | © 1133 4505 1185 4564 0 135 | m 1191 4505 1259 4544 0 136 | w 1271 4505 1320 4560 0 137 | w 1332 4505 1395 4560 0 138 | m 1396 4505 1579 4560 0 139 | b 1592 4505 1621 4560 0 140 | g 1624 4485 1663 4544 0 141 | m 1674 4505 1763 4560 0 142 | f 1767 4485 1800 4564 0 143 | w 1794 4505 1885 4544 0 144 | q 1904 4485 1961 4564 0 145 | p 1974 4485 2003 4547 0 146 | m 2007 4505 2301 4560 0 147 | m 2313 4505 2429 4560 0 148 | m 2440 4505 2529 4560 0 149 | m 2542 4505 2682 4560 0 150 | qu 2703 4485 2903 4560 0 151 | d 2914 4485 2971 4564 0 152 | m 2984 4505 3059 4560 0 153 | a 3063 4505 3103 4544 0 154 | @ 3124 4505 3170 4564 0 155 | w 3172 4505 3251 4546 0 156 | a 3253 4505 3306 4544 0 157 | me 3327 4505 3580 4560 0 158 | m 3594 4505 3669 4560 0 159 | e 3673 4505 3706 4544 0 160 | M 502 4401 551 4456 0 161 | G 563 4401 605 4440 0 162 | W 616 4401 884 4456 0 163 | W 895 4401 1046 4456 0 164 | W 1059 4401 1169 4440 0 165 | B 1171 4401 1204 4440 0 166 | fi 1217 4381 1288 4460 0 167 | m 1283 4401 1402 4456 0 168 | e 1406 4401 1439 4440 0 169 | m 1453 4401 1569 4456 0 170 | p 1583 4381 1612 4443 0 171 | a 1614 4401 1667 4440 0 172 | m 1670 4401 1887 4452 0 173 | m 1897 4401 2023 4456 0 174 | m 2034 4401 2123 4456 0 175 | m 2135 4401 2238 4440 0 176 | w 2251 4401 2341 4456 0 177 | w 2343 4401 2387 4456 0 178 | w 2391 4401 2463 4456 0 179 | f 2466 4381 2499 4460 0 180 | r 2494 4401 2517 4440 0 181 | m 2520 4401 2611 4440 0 182 | f 2614 4381 2647 4460 0 183 | w 2642 4401 2733 4440 0 184 | 4 2752 4381 2808 4460 0 185 | p 2822 4381 2851 4443 0 186 | m 2855 4401 3154 4456 0 187 | M 502 4297 557 4356 0 188 | W 562 4297 789 4352 0 189 | Q 801 4281 842 4356 0 190 | M 848 4297 1016 4352 0 191 | me 501 4089 742 4148 0 192 | f 745 4069 778 4148 0 193 | m 773 4089 860 4144 0 194 | w 873 4089 949 4144 0 195 | m 959 4089 1048 4144 0 196 | p 1063 4069 1092 4131 0 197 | w 1094 4069 1186 4131 0 198 | w 1190 4089 1238 4144 0 199 | m 1251 4089 1397 4130 0 200 | q 1410 4069 1467 4148 0 201 | m 1477 4089 1566 4144 0 202 | m 1578 4079 1709 4144 0 203 | M 1732 4089 1848 4144 0 204 | m 1860 4089 2006 4130 0 205 | q 2019 4069 2076 4148 0 206 | m 2086 4089 2175 4144 0 207 | p 2189 4069 2218 4131 0 208 | m 2221 4069 2313 4131 0 209 | w 2317 4089 2365 4144 0 210 | w 2378 4089 2454 4144 0 211 | m 2465 4089 2554 4144 0 212 | m 2565 4079 2697 4144 0 213 | b 2720 4089 2749 4144 0 214 | m 2753 4089 2810 4140 0 215 | w 2823 4069 2930 4128 0 216 | m 2942 4089 3138 4140 0 217 | f 3140 4069 3173 4148 0 218 | m 3168 4089 3256 4144 0 219 | w 3268 4089 3344 4144 0 220 | m 3355 4089 3444 4144 0 221 | p 3458 4069 3487 4131 0 222 | m 3489 4069 3582 4131 0 223 | w 3586 4089 3634 4144 0 224 | w 3647 4089 3723 4144 0 225 | m 501 3984 590 4039 0 226 | m 601 3984 732 4039 0 227 | fl 496 3871 544 3939 0 228 | b 551 3880 580 3935 0 229 | r 583 3880 606 3919 0 230 | m 609 3880 779 3935 0 231 | t 790 3866 845 3938 0 232 | m 828 3880 999 3935 0 233 | q 501 3672 528 3731 0 234 | n 535 3672 574 3711 0 235 | ng 588 3652 873 3727 0 236 | M 884 3672 993 3727 0 237 | B 995 3672 1028 3711 0 238 | U 1041 3672 1089 3727 0 239 | M 1103 3672 1178 3711 0 240 | w 1188 3672 1233 3713 0 241 | w 1237 3672 1298 3711 0 242 | w 1318 3672 1363 3713 0 243 | m 1367 3672 1488 3727 0 244 | w 1501 3672 1546 3713 0 245 | m 1550 3672 1619 3713 0 246 | m 1633 3672 1724 3723 0 247 | m 1737 3672 1964 3727 0 248 | qu 1978 3652 2149 3727 0 249 | w 2162 3652 2259 3713 0 250 | a 2263 3672 2316 3711 0 251 | m 2320 3662 2531 3723 0 252 | m 2552 3672 2641 3727 0 253 | w 2654 3652 2751 3713 0 254 | a 2755 3672 2808 3711 0 255 | m 2812 3672 3017 3723 0 256 | m 3029 3662 3193 3727 0 257 | qu 502 3548 803 3627 0 258 | m 814 3568 902 3623 0 259 | p 917 3548 946 3610 0 260 | m 948 3548 1041 3610 0 261 | m 1045 3558 1100 3623 0 262 | w 1121 3568 1181 3619 0 263 | w 1191 3568 1236 3609 0 264 | m 1240 3568 1367 3623 0 265 | w 1380 3568 1425 3609 0 266 | w 1428 3568 1489 3607 0 267 | w 1508 3568 1557 3623 0 268 | w 1570 3568 1669 3623 0 269 | w 1673 3548 1778 3609 0 270 | p 1791 3548 1820 3610 0 271 | a 1822 3568 1875 3607 0 272 | M 1879 3568 2076 3623 0 273 | w 2088 3568 2143 3609 0 274 | m 2148 3568 2217 3607 0 275 | me 2231 3548 2622 3627 0 276 | m 2619 3568 2680 3623 0 277 | le 501 3450 668 3522 0 278 | m 668 3444 836 3519 0 279 | T 502 3255 554 3313 0 280 | M 556 3255 624 3310 0 281 | w 636 3255 692 3296 0 282 | u 696 3255 735 3310 0 283 | m 746 3255 864 3310 0 284 | u 875 3255 924 3310 0 285 | m 936 3255 993 3310 0 286 | m 1005 3255 1094 3310 0 287 | me 1107 3255 1274 3310 0 288 | W 1286 3255 1478 3310 0 289 | w 1490 3255 1590 3310 0 290 | w 1593 3235 1698 3296 0 291 | qu 1709 3235 2113 3314 0 292 | m 2116 3245 2259 3294 0 293 | m 2282 3255 2398 3310 0 294 | W 2410 3235 2556 3310 0 295 | w 2568 3255 2842 3310 0 296 | w 2854 3235 2985 3294 0 297 | w 2998 3255 3076 3310 0 298 | m 3086 3255 3155 3296 0 299 | m 3167 3255 3325 3310 0 300 | m 3339 3255 3436 3310 0 301 | m 3439 3255 3497 3294 0 302 | m 3510 3255 3579 3296 0 303 | fl 496 3038 544 3106 0 304 | w 551 3047 597 3102 0 305 | a 599 3047 651 3086 0 306 | t 653 3047 678 3098 0 307 | m 691 3046 888 3106 0 308 | T 502 2839 546 2898 0 309 | m 545 2839 636 2878 0 310 | W 657 2819 779 2894 0 311 | A 781 2839 813 2880 0 312 | M 827 2839 892 2880 0 313 | f 895 2819 928 2898 0 314 | m 922 2839 1118 2894 0 315 | m 1129 2839 1203 2878 0 316 | m 1214 2839 1303 2894 0 317 | p 1318 2819 1347 2881 0 318 | w 1350 2839 1437 2890 0 319 | m 1449 2839 1505 2878 0 320 | w 1525 2839 1570 2880 0 321 | a 1573 2839 1630 2878 0 322 | r 1633 2839 1656 2878 0 323 | m 1658 2839 1747 2894 0 324 | w 1760 2839 1828 2894 0 325 | m 1829 2839 1921 2890 0 326 | M 1932 2839 2021 2894 0 327 | f 2024 2819 2057 2898 0 328 | m 2054 2839 2165 2890 0 329 | a 2167 2839 2207 2878 0 330 | q 2228 2839 2255 2898 0 331 | f 2252 2819 2285 2898 0 332 | w 2297 2839 2342 2880 0 333 | e 2345 2839 2378 2878 0 334 | m 2390 2839 2498 2878 0 335 | W 2511 2839 2727 2894 0 336 | W 2732 2819 2884 2894 0 337 | wa 2897 2819 3118 2898 0 338 | , 3121 2829 3132 2849 0 339 | w 3154 2839 3199 2880 0 340 | e 3202 2839 3235 2878 0 341 | m 3248 2839 3355 2878 0 342 | r 3368 2839 3391 2878 0 343 | m 3394 2839 3498 2894 0 344 | m 3497 2839 3559 2878 0 345 | m 3571 2839 3689 2894 0 346 | r 503 2734 526 2773 0 347 | m 528 2714 644 2789 0 348 | m 657 2734 770 2775 0 349 | w 791 2734 836 2775 0 350 | e 838 2734 871 2773 0 351 | w 885 2734 946 2773 0 352 | e 948 2734 981 2773 0 353 | m 993 2714 1146 2789 0 354 | fi 1167 2733 1217 2793 0 355 | m 1219 2714 1335 2789 0 356 | m 1348 2734 1461 2775 0 357 | , 1465 2724 1476 2744 0 358 | m 1496 2714 1672 2789 0 359 | w 1694 2734 1739 2775 0 360 | e 1742 2734 1775 2773 0 361 | w 1789 2734 1850 2773 0 362 | e 1852 2734 1885 2773 0 363 | m 1897 2734 1998 2789 0 364 | m 2011 2734 2109 2789 0 365 | a 2113 2724 2154 2773 0 366 | W 2176 2734 2293 2789 0 367 | W 2304 2734 2397 2773 0 368 | b 2418 2734 2447 2789 0 369 | m 2448 2734 2597 2789 0 370 | w 2609 2734 2670 2773 0 371 | e 2672 2734 2705 2773 0 372 | w 2719 2734 2764 2775 0 373 | m 2767 2734 2823 2773 0 374 | m 2828 2714 2957 2789 0 375 | m 2970 2734 3085 2773 0 376 | v 3089 2734 3115 2775 0 377 | m 3119 2714 3323 2789 0 378 | 0 3344 2734 3396 2793 0 379 | w 3402 2734 3459 2773 0 380 | m 3478 2714 3603 2775 0 381 | m 3615 2734 3722 2773 0 382 | M 502 2630 603 2685 0 383 | m 615 2630 703 2671 0 384 | m 715 2630 804 2685 0 385 | me 818 2610 1062 2689 0 386 | m 1074 2610 1183 2685 0 387 | 0 1204 2630 1256 2689 0 388 | w 1262 2630 1319 2669 0 389 | w 1338 2630 1429 2669 0 390 | a 1431 2630 1463 2671 0 391 | m 1475 2630 1582 2669 0 392 | m 1595 2630 1695 2685 0 393 | m 1709 2630 1834 2685 0 394 | W 1852 2630 1941 2685 0 395 | u 1955 2630 1981 2671 0 396 | m 1985 2630 2124 2685 0 397 | q 2135 2610 2192 2689 0 398 | w 2204 2630 2296 2669 0 399 | m 2317 2630 2391 2685 0 400 | a 2396 2630 2467 2685 0 401 | m 2479 2630 2610 2671 0 402 | . 2605 2630 2615 2640 0 403 | T 502 2526 554 2584 0 404 | M 556 2526 677 2581 0 405 | N 690 2526 740 2585 0 406 | M 747 2526 843 2581 0 407 | H 854 2526 904 2585 0 408 | W 910 2526 1024 2581 0 409 | th 501 2318 618 2377 0 410 | qu 631 2298 802 2373 0 411 | de 815 2298 1202 2377 0 412 | m 1206 2318 1282 2373 0 413 | m 1292 2318 1410 2373 0 414 | m 1421 2318 1479 2373 0 415 | w 1492 2318 1584 2357 0 416 | M 1603 2318 1778 2369 0 417 | g 1782 2298 1821 2357 0 418 | w 1834 2318 1879 2359 0 419 | e 1882 2318 1915 2357 0 420 | m 1929 2318 2028 2373 0 421 | e 2033 2318 2066 2357 0 422 | m 2077 2318 2226 2373 0 423 | W 2237 2318 2317 2373 0 424 | w 2319 2318 2381 2357 0 425 | m 2396 2298 2523 2360 0 426 | m 2525 2318 2697 2373 0 427 | u 2700 2298 2755 2373 0 428 | p 2769 2298 2798 2360 0 429 | r 2801 2318 2824 2357 0 430 | m 2827 2318 3001 2373 0 431 | W 3011 2298 3198 2373 0 432 | f 3213 2298 3246 2377 0 433 | r 3242 2318 3265 2357 0 434 | m 3267 2318 3454 2373 0 435 | q 3466 2298 3523 2377 0 436 | w 3534 2298 3592 2360 0 437 | m 3594 2308 3728 2373 0 438 | f 493 2194 526 2273 0 439 | r 522 2214 545 2253 0 440 | m 547 2214 734 2269 0 441 | d 746 2194 803 2273 0 442 | m 814 2204 1118 2269 0 443 | W 1141 2214 1257 2269 0 444 | W 1268 2214 1357 2269 0 445 | p 1372 2194 1401 2256 0 446 | r 1404 2214 1427 2253 0 447 | m 1431 2214 1629 2269 0 448 | m 1643 2214 1734 2255 0 449 | a 1738 2214 1791 2253 0 450 | w 1809 2214 1869 2265 0 451 | p 1880 2194 1909 2256 0 452 | r 1912 2214 1935 2253 0 453 | m 1938 2214 2100 2269 0 454 | m 2113 2214 2266 2269 0 455 | g 2285 2194 2342 2273 0 456 | m 2352 2214 2502 2269 0 457 | M 502 2109 557 2168 0 458 | th 562 2109 729 2167 0 459 | w 731 2109 776 2150 0 460 | m 779 2109 874 2164 0 461 | q 501 1901 528 1960 0 462 | t 532 1901 557 1952 0 463 | u 569 1901 618 1956 0 464 | a 630 1901 672 1940 0 465 | w 685 1901 730 1942 0 466 | w 733 1901 800 1956 0 467 | - 797 1919 813 1924 0 468 | m 822 1901 971 1956 0 469 | n 975 1901 1014 1940 0 470 | f 1018 1881 1051 1960 0 471 | w 1046 1901 1136 1952 0 472 | m 1146 1901 1264 1956 0 473 | m 1274 1901 1422 1956 0 474 | p 1437 1881 1466 1943 0 475 | m 1468 1881 1561 1943 0 476 | w 1565 1901 1612 1956 0 477 | w 1626 1901 1671 1942 0 478 | m 1676 1901 1751 1956 0 479 | m 1761 1901 1900 1952 0 480 | w 1912 1901 1957 1942 0 481 | m 1961 1901 2058 1952 0 482 | w 2069 1901 2129 1952 0 483 | r 2138 1901 2161 1940 0 484 | m 2166 1901 2249 1956 0 485 | p 2264 1881 2293 1943 0 486 | m 2295 1881 2387 1943 0 487 | w 2391 1901 2439 1956 0 488 | m 2453 1901 2514 1940 0 489 | a 2516 1891 2557 1940 0 490 | m 2578 1881 2626 1956 0 491 | w 2628 1901 2696 1942 0 492 | f 2695 1881 2728 1960 0 493 | m 2724 1891 2853 1952 0 494 | m 2873 1901 3022 1956 0 495 | m 3036 1901 3168 1956 0 496 | m 3180 1901 3349 1956 0 497 | w 3360 1901 3420 1952 0 498 | w 3430 1901 3508 1956 0 499 | u 3516 1901 3562 1956 0 500 | . 3569 1901 3579 1911 0 501 | . 3585 1901 3595 1911 0 502 | me 503 1777 853 1852 0 503 | u 861 1797 910 1852 0 504 | m 922 1777 1019 1839 0 505 | w 1022 1797 1090 1852 0 506 | w 1094 1797 1142 1852 0 507 | qu 1154 1777 1671 1856 0 508 | w 1675 1797 1736 1838 0 509 | m 1749 1797 1910 1852 0 510 | ? 1922 1797 1968 1856 0 511 | r 1971 1797 1994 1836 0 512 | m 1996 1797 2196 1852 0 513 | m 2207 1797 2398 1852 0 514 | m 2410 1797 2484 1836 0 515 | m 2498 1797 2573 1836 0 516 | m 2583 1797 2805 1848 0 517 | b 2819 1797 2848 1852 0 518 | e 2849 1797 2882 1836 0 519 | m 2896 1797 3045 1852 0 520 | m 3048 1797 3120 1852 0 521 | w 3130 1797 3191 1848 0 522 | w 3200 1797 3278 1852 0 523 | m 3286 1797 3375 1852 0 524 | m 3378 1777 3468 1852 0 525 | . 3471 1797 3481 1807 0 526 | ® 502 1692 553 1752 0 527 | W 557 1673 750 1748 0 528 | fl 755 1684 803 1752 0 529 | m 810 1693 970 1748 0 530 | fi 501 1484 528 1543 0 531 | t 532 1484 557 1535 0 532 | u 569 1484 618 1539 0 533 | m 629 1464 763 1525 0 534 | w 774 1484 834 1535 0 535 | m 845 1484 969 1539 0 536 | m 982 1484 1099 1539 0 537 | u 1110 1484 1151 1539 0 538 | u 1162 1484 1211 1539 0 539 | m 1224 1464 1325 1543 0 540 | m 1316 1484 1437 1539 0 541 | w 1447 1484 1507 1535 0 542 | m 1518 1484 1593 1539 0 543 | a 1597 1484 1637 1523 0 544 | T 1659 1484 1711 1542 0 545 | m 1713 1484 1797 1539 0 546 | u 1808 1484 1857 1539 0 547 | m 1870 1484 1984 1539 0 548 | me 2002 1484 2271 1539 0 549 | m 2284 1484 2492 1539 0 550 | q 2504 1464 2561 1543 0 551 | m 2571 1464 2751 1539 0 552 | w 2763 1484 2808 1525 0 553 | m 2811 1484 2867 1523 0 554 | m 2872 1484 2938 1539 0 555 | . 2933 1484 2943 1494 0 556 | fl 2959 1475 3007 1543 0 557 | u 3014 1484 3051 1539 0 558 | W 3063 1464 3209 1539 0 559 | W 3220 1464 3399 1539 0 560 | w 3412 1484 3473 1523 0 561 | e 3475 1484 3508 1523 0 562 | W 3521 1464 3623 1543 0 563 | m 3614 1484 3734 1539 0 564 | w 501 1380 561 1431 0 565 | m 571 1380 745 1435 0 566 | a 750 1377 791 1419 0 567 | M 816 1380 932 1435 0 568 | wa 946 1360 1247 1435 0 569 | w 1260 1380 1320 1419 0 570 | e 1323 1380 1356 1419 0 571 | v 1369 1380 1395 1421 0 572 | a 1399 1380 1452 1419 0 573 | g 1455 1360 1494 1419 0 574 | m 1507 1360 1640 1421 0 575 | w 1651 1380 1712 1431 0 576 | w 1720 1360 1816 1431 0 577 | W 504 1256 635 1335 0 578 | m 631 1276 778 1331 0 579 | T 502 1068 554 1126 0 580 | M 556 1068 624 1123 0 581 | W 638 1068 868 1123 0 582 | U 879 1068 923 1119 0 583 | W 926 1048 1107 1123 0 584 | u 1120 1068 1169 1123 0 585 | m 1182 1068 1273 1119 0 586 | m 1284 1068 1372 1123 0 587 | w 1385 1048 1449 1110 0 588 | p 1453 1048 1482 1110 0 589 | r 1485 1068 1508 1107 0 590 | m 1510 1068 1683 1123 0 591 | m 1696 1068 1813 1123 0 592 | u 1824 1068 1877 1107 0 593 | m 1881 1048 2018 1123 0 594 | qu 2033 1048 2204 1123 0 595 | b 2218 1068 2247 1123 0 596 | w 2250 1068 2330 1123 0 597 | p 2343 1048 2372 1110 0 598 | w 2374 1048 2467 1110 0 599 | w 2471 1068 2519 1123 0 600 | b 2533 1068 2562 1123 0 601 | m 2566 1068 2624 1119 0 602 | m 2634 1068 2723 1123 0 603 | m 2735 1068 2922 1123 0 604 | w 2935 1068 2995 1109 0 605 | a 2999 1068 3052 1107 0 606 | M 3070 1068 3188 1123 0 607 | b 3201 1068 3230 1123 0 608 | g 3232 1048 3271 1107 0 609 | m 3283 1068 3372 1123 0 610 | m 3384 1048 3530 1123 0 611 | p 3544 1048 3573 1110 0 612 | w 3575 1048 3668 1110 0 613 | w 3672 1068 3726 1123 0 614 | M 502 964 557 1023 0 615 | w 562 964 623 1003 0 616 | m 624 964 701 1019 0 617 | l 713 950 768 1022 0 618 | m 751 964 892 1019 0 619 | fi 910 963 960 1023 0 620 | m 962 944 1065 1019 0 621 | 3 1085 948 1115 1023 0 622 | r 1122 964 1145 1003 0 623 | . 1148 964 1158 974 0 624 | -------------------------------------------------------------------------------- /deeplearning-with-caffe/Neural-Networks-with-Caffe-on-the-GPU.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "*
[www.joyofdata.de](http://blog.joyofdata.de) - [@joyofdata](https://twitter.com/joyofdata) - [github.com/joyofdata](https://github.com/joyofdata)
*" 8 | ] 9 | }, 10 | { 11 | "cell_type": "markdown", 12 | "metadata": {}, 13 | "source": [ 14 | "**
More information you will find here: [Neural Networks with Caffe on the GPU](http://www.joyofdata.de/blog/neural-networks-with-caffe-on-the-gpu)
**" 15 | ] 16 | }, 17 | { 18 | "cell_type": "markdown", 19 | "metadata": {}, 20 | "source": [ 21 | "---" 22 | ] 23 | }, 24 | { 25 | "cell_type": "markdown", 26 | "metadata": {}, 27 | "source": [ 28 | "

Training Multi-Layer Neural Network with Caffe

" 29 | ] 30 | }, 31 | { 32 | "cell_type": "code", 33 | "execution_count": 2, 34 | "metadata": { 35 | "collapsed": false 36 | }, 37 | "outputs": [], 38 | "source": [ 39 | "import subprocess\n", 40 | "import platform\n", 41 | "\n", 42 | "sys.path.append(\"/home/ubuntu/caffe/python/\")\n", 43 | "import caffe\n", 44 | "caffe.set_mode_gpu()\n", 45 | "import lmdb\n", 46 | "\n", 47 | "from sklearn.cross_validation import StratifiedShuffleSplit\n", 48 | "import pandas as pd\n", 49 | "import numpy as np\n", 50 | "\n", 51 | "import matplotlib.pyplot as plt\n", 52 | "%matplotlib inline" 53 | ] 54 | }, 55 | { 56 | "cell_type": "markdown", 57 | "metadata": {}, 58 | "source": [ 59 | "#Status Quo" 60 | ] 61 | }, 62 | { 63 | "cell_type": "code", 64 | "execution_count": 3, 65 | "metadata": { 66 | "collapsed": false, 67 | "scrolled": true 68 | }, 69 | "outputs": [ 70 | { 71 | "name": "stdout", 72 | "output_type": "stream", 73 | "text": [ 74 | "OS: Linux-3.13.0-49-generic-x86_64-with-Ubuntu-14.04-trusty\n", 75 | "Python: 2.7.6 (default, Mar 22 2014, 22:59:56) \n", 76 | "CUDA: Cuda compilation tools, release 7.0, V7.0.27\n", 77 | "LMDB: 0.9.14\n" 78 | ] 79 | } 80 | ], 81 | "source": [ 82 | "print \"OS: \", platform.platform()\n", 83 | "print \"Python: \", sys.version.split(\"\\n\")[0]\n", 84 | "print \"CUDA: \", subprocess.Popen([\"nvcc\",\"--version\"], stdout=subprocess.PIPE).communicate()[0].split(\"\\n\")[3]\n", 85 | "print \"LMDB: \", \".\".join([str(i) for i in lmdb.version()])" 86 | ] 87 | }, 88 | { 89 | "cell_type": "markdown", 90 | "metadata": {}, 91 | "source": [ 92 | "#Load Data from CSV and Trasform" 93 | ] 94 | }, 95 | { 96 | "cell_type": "markdown", 97 | "metadata": {}, 98 | "source": [ 99 | "The CSV is assumed to be the training data from the [\"Otto Group Product Classification Challenge\"](https://www.kaggle.com/c/otto-group-product-classification-challenge) at Kaggle. It contains 95 columns:\n", 100 | "- [0] id (discarded)\n", 101 | "- [1..93] features (integer values)\n", 102 | "- [94] label (9 categories - `Class_1,..,Class_9`)" 103 | ] 104 | }, 105 | { 106 | "cell_type": "code", 107 | "execution_count": 4, 108 | "metadata": { 109 | "collapsed": false 110 | }, 111 | "outputs": [], 112 | "source": [ 113 | "df = pd.read_csv(\"train.csv\", sep=\",\")\n", 114 | "features = df.ix[:,1:-1].as_matrix()\n", 115 | "labels = df.ix[:,-1].as_matrix()" 116 | ] 117 | }, 118 | { 119 | "cell_type": "code", 120 | "execution_count": 5, 121 | "metadata": { 122 | "collapsed": true 123 | }, 124 | "outputs": [], 125 | "source": [ 126 | "vec_log = numpy.vectorize(lambda x: log(x+1))\n", 127 | "vec_int = numpy.vectorize(lambda str: int(str[-1])-1)" 128 | ] 129 | }, 130 | { 131 | "cell_type": "code", 132 | "execution_count": 6, 133 | "metadata": { 134 | "collapsed": true 135 | }, 136 | "outputs": [], 137 | "source": [ 138 | "features = vec_log(features)\n", 139 | "labels = vec_int(labels)" 140 | ] 141 | }, 142 | { 143 | "cell_type": "markdown", 144 | "metadata": {}, 145 | "source": [ 146 | "#Stratified Split for Training and Testing" 147 | ] 148 | }, 149 | { 150 | "cell_type": "code", 151 | "execution_count": 7, 152 | "metadata": { 153 | "collapsed": false 154 | }, 155 | "outputs": [], 156 | "source": [ 157 | "sss = StratifiedShuffleSplit(labels, 1, test_size=0.02, random_state=0)\n", 158 | "sss = list(sss)[0]" 159 | ] 160 | }, 161 | { 162 | "cell_type": "code", 163 | "execution_count": 8, 164 | "metadata": { 165 | "collapsed": false 166 | }, 167 | "outputs": [], 168 | "source": [ 169 | "features_training = features[sss[0],]\n", 170 | "labels_training = labels[sss[0],]\n", 171 | "\n", 172 | "features_testing = features[sss[1],]\n", 173 | "labels_testing = labels[sss[1],]" 174 | ] 175 | }, 176 | { 177 | "cell_type": "markdown", 178 | "metadata": {}, 179 | "source": [ 180 | "#Load Data into LMDB" 181 | ] 182 | }, 183 | { 184 | "cell_type": "code", 185 | "execution_count": 9, 186 | "metadata": { 187 | "collapsed": true 188 | }, 189 | "outputs": [], 190 | "source": [ 191 | "# http://deepdish.io/2015/04/28/creating-lmdb-in-python/\n", 192 | "def load_data_into_lmdb(lmdb_name, features, labels=None):\n", 193 | " env = lmdb.open(lmdb_name, map_size=features.nbytes*2)\n", 194 | " \n", 195 | " features = features[:,:,None,None]\n", 196 | " for i in range(features.shape[0]):\n", 197 | " datum = caffe.proto.caffe_pb2.Datum()\n", 198 | " \n", 199 | " datum.channels = features.shape[1]\n", 200 | " datum.height = 1\n", 201 | " datum.width = 1\n", 202 | " \n", 203 | " if features.dtype == np.int:\n", 204 | " datum.data = features[i].tostring()\n", 205 | " elif features.dtype == np.float: \n", 206 | " datum.float_data.extend(features[i].flat)\n", 207 | " else:\n", 208 | " raise Exception(\"features.dtype unknown.\")\n", 209 | " \n", 210 | " if labels is not None:\n", 211 | " datum.label = int(labels[i])\n", 212 | " \n", 213 | " str_id = '{:08}'.format(i)\n", 214 | " with env.begin(write=True) as txn:\n", 215 | " txn.put(str_id, datum.SerializeToString())" 216 | ] 217 | }, 218 | { 219 | "cell_type": "code", 220 | "execution_count": 10, 221 | "metadata": { 222 | "collapsed": false 223 | }, 224 | "outputs": [], 225 | "source": [ 226 | "load_data_into_lmdb(\"/home/ubuntu/data/train_data_lmdb\", features_training, labels_training)\n", 227 | "load_data_into_lmdb(\"/home/ubuntu/data/test_data_lmdb\", features_testing, labels_testing)" 228 | ] 229 | }, 230 | { 231 | "cell_type": "markdown", 232 | "metadata": {}, 233 | "source": [ 234 | "#Check Content of LMDB" 235 | ] 236 | }, 237 | { 238 | "cell_type": "code", 239 | "execution_count": 11, 240 | "metadata": { 241 | "collapsed": false 242 | }, 243 | "outputs": [], 244 | "source": [ 245 | "# http://research.beenfrog.com/code/2015/03/28/read-leveldb-lmdb-for-caffe-with-python.html\n", 246 | "def get_data_for_case_from_lmdb(lmdb_name, id):\n", 247 | " lmdb_env = lmdb.open(lmdb_name, readonly=True)\n", 248 | " lmdb_txn = lmdb_env.begin()\n", 249 | "\n", 250 | " raw_datum = lmdb_txn.get(id)\n", 251 | " datum = caffe.proto.caffe_pb2.Datum()\n", 252 | " datum.ParseFromString(raw_datum)\n", 253 | "\n", 254 | " feature = caffe.io.datum_to_array(datum)\n", 255 | " label = datum.label\n", 256 | "\n", 257 | " return (label, feature)" 258 | ] 259 | }, 260 | { 261 | "cell_type": "code", 262 | "execution_count": 12, 263 | "metadata": { 264 | "collapsed": false 265 | }, 266 | "outputs": [ 267 | { 268 | "data": { 269 | "text/plain": [ 270 | "(2, array([[[ 0. ]],\n", 271 | " \n", 272 | " [[ 0. ]],\n", 273 | " \n", 274 | " [[ 0. ]],\n", 275 | " \n", 276 | " [[ 0. ]],\n", 277 | " \n", 278 | " [[ 0. ]],\n", 279 | " \n", 280 | " [[ 0.69314718]],\n", 281 | " \n", 282 | " [[ 0.69314718]],\n", 283 | " \n", 284 | " [ ... ],\n", 285 | " \n", 286 | " [[ 0. ]],\n", 287 | " \n", 288 | " [[ 0.69314718]],\n", 289 | " \n", 290 | " [[ 0. ]]]))" 291 | ] 292 | }, 293 | "execution_count": 12, 294 | "metadata": {}, 295 | "output_type": "execute_result" 296 | } 297 | ], 298 | "source": [ 299 | "get_data_for_case_from_lmdb(\"/home/ubuntu/data/train_data_lmdb/\", \"00012345\")" 300 | ] 301 | }, 302 | { 303 | "cell_type": "markdown", 304 | "metadata": {}, 305 | "source": [ 306 | "#Training the Model" 307 | ] 308 | }, 309 | { 310 | "cell_type": "code", 311 | "execution_count": 13, 312 | "metadata": { 313 | "collapsed": false 314 | }, 315 | "outputs": [], 316 | "source": [ 317 | "proc = subprocess.Popen(\n", 318 | " [\"/home/ubuntu/caffe/build/tools/caffe\",\"train\",\"--solver=config.prototxt\"], \n", 319 | " stderr=subprocess.PIPE)\n", 320 | "res = proc.communicate()[1]\n", 321 | "\n", 322 | "# http://nbviewer.ipython.org/github/BVLC/caffe/blob/master/examples/hdf5_classification.ipynb\n", 323 | "# or\n", 324 | "# caffe.set_mode_gpu()\n", 325 | "# solver = caffe.get_solver(\"config.prototxt\")\n", 326 | "# solver.solve()" 327 | ] 328 | }, 329 | { 330 | "cell_type": "code", 331 | "execution_count": 14, 332 | "metadata": { 333 | "collapsed": false 334 | }, 335 | "outputs": [ 336 | { 337 | "name": "stdout", 338 | "output_type": "stream", 339 | "text": [ 340 | "libdc1394 error: Failed to initialize libdc1394\n", 341 | "I0508 12:19:01.337918 2310 caffe.cpp:113] Use GPU with device ID 0\n", 342 | "I0508 12:19:01.502816 2310 caffe.cpp:121] Starting Optimization\n", 343 | "I0508 12:19:01.502984 2310 solver.cpp:32] Initializing solver from parameters: \n", 344 | "test_iter: 100\n", 345 | "test_interval: 10000\n", 346 | "base_lr: 0.01\n", 347 | "display: 10000\n", 348 | "max_iter: 100000\n", 349 | "lr_policy: \"inv\"\n", 350 | "gamma: 0.0001\n", 351 | "power: 0.75\n", 352 | "momentum: 0.9\n", 353 | "weight_decay: 0.0005\n", 354 | "solver_mode: GPU\n", 355 | "net: \"model_train_test.prototxt\"\n", 356 | "I0508 12:19:01.503021 2310 solver.cpp:70] Creating training net from net file: model_train_test.prototxt\n", 357 | "I0508 12:19:01.503921 2310 net.cpp:257] The NetState phase (0) differed from the phase (1) specified by a rule in layer simple\n", 358 | "I0508 12:19:01.503988 2310 net.cpp:257] The NetState phase (0) differed from the phase (1) specified by a rule in layer accuracy\n", 359 | "I0508 12:19:01.504057 2310 net.cpp:42] Initializing net from parameters: \n", 360 | "name: \"otto\"\n", 361 | "state {\n", 362 | " phase: TRAIN\n", 363 | "}\n", 364 | "layer {\n", 365 | " name: \"otto\"\n", 366 | " type: \"Data\"\n", 367 | " top: \"data\"\n", 368 | " top: \"label\"\n", 369 | " include {\n", 370 | " phase: TRAIN\n", 371 | " }\n", 372 | " data_param {\n", 373 | " source: \"train_data_lmdb\"\n", 374 | " batch_size: 64\n", 375 | " backend: LMDB\n", 376 | " }\n", 377 | "}\n", 378 | "layer {\n", 379 | " name: \"ip1\"\n", 380 | " type: \"InnerProduct\"\n", 381 | " bottom: \"data\"\n", 382 | " top: \"ip1\"\n", 383 | " inner_product_param {\n", 384 | " num_output: 30\n", 385 | " weight_filler {\n", 386 | " type: \"xavier\"\n", 387 | " }\n", 388 | " bias_filler {\n", 389 | " type: \"constant\"\n", 390 | " value: 0\n", 391 | " }\n", 392 | " }\n", 393 | "}\n", 394 | "layer {\n", 395 | " name: \"relu1\"\n", 396 | " type: \"ReLU\"\n", 397 | " bottom: \"ip1\"\n", 398 | " top: \"ip1\"\n", 399 | "}\n", 400 | "layer {\n", 401 | " name: \"ip2\"\n", 402 | " type: \"InnerProduct\"\n", 403 | " bottom: \"ip1\"\n", 404 | " top: \"ip2\"\n", 405 | " inner_product_param {\n", 406 | " num_output: 9\n", 407 | " weight_filler {\n", 408 | " type: \"xavier\"\n", 409 | " }\n", 410 | " bias_filler {\n", 411 | " type: \"constant\"\n", 412 | " value: 0\n", 413 | " }\n", 414 | " }\n", 415 | "}\n", 416 | "layer {\n", 417 | " name: \"loss\"\n", 418 | " type: \"SoftmaxWithLoss\"\n", 419 | " bottom: \"ip2\"\n", 420 | " bottom: \"label\"\n", 421 | " top: \"loss\"\n", 422 | "}\n", 423 | "I0508 12:19:01.504134 2310 layer_factory.hpp:74] Creating layer otto\n", 424 | "I0508 12:19:01.505414 2310 net.cpp:84] Creating Layer otto\n", 425 | "I0508 12:19:01.505437 2310 net.cpp:338] otto -> data\n", 426 | "I0508 12:19:01.505470 2310 net.cpp:338] otto -> label\n", 427 | "I0508 12:19:01.505489 2310 net.cpp:113] Setting up otto\n", 428 | "I0508 12:19:01.505575 2310 db.cpp:34] Opened lmdb train_data_lmdb\n", 429 | "I0508 12:19:01.505663 2310 data_layer.cpp:67] output data size: 64,93,1,1\n", 430 | "I0508 12:19:01.505764 2310 net.cpp:120] Top shape: 64 93 1 1 (5952)\n", 431 | "I0508 12:19:01.505779 2310 net.cpp:120] Top shape: 64 (64)\n", 432 | "I0508 12:19:01.505791 2310 layer_factory.hpp:74] Creating layer ip1\n", 433 | "I0508 12:19:01.505807 2310 net.cpp:84] Creating Layer ip1\n", 434 | "I0508 12:19:01.505818 2310 net.cpp:380] ip1 <- data\n", 435 | "I0508 12:19:01.505838 2310 net.cpp:338] ip1 -> ip1\n", 436 | "I0508 12:19:01.505857 2310 net.cpp:113] Setting up ip1\n", 437 | "I0508 12:19:01.506310 2310 net.cpp:120] Top shape: 64 30 (1920)\n", 438 | "I0508 12:19:01.506335 2310 layer_factory.hpp:74] Creating layer relu1\n", 439 | "I0508 12:19:01.506350 2310 net.cpp:84] Creating Layer relu1\n", 440 | "I0508 12:19:01.506360 2310 net.cpp:380] relu1 <- ip1\n", 441 | "I0508 12:19:01.506367 2310 net.cpp:327] relu1 -> ip1 (in-place)\n", 442 | "I0508 12:19:01.506378 2310 net.cpp:113] Setting up relu1\n", 443 | "I0508 12:19:04.415382 2310 net.cpp:120] Top shape: 64 30 (1920)\n", 444 | "I0508 12:19:04.415416 2310 layer_factory.hpp:74] Creating layer ip2\n", 445 | "I0508 12:19:04.415432 2310 net.cpp:84] Creating Layer ip2\n", 446 | "I0508 12:19:04.415446 2310 net.cpp:380] ip2 <- ip1\n", 447 | "I0508 12:19:04.415457 2310 net.cpp:338] ip2 -> ip2\n", 448 | "I0508 12:19:04.415477 2310 net.cpp:113] Setting up ip2\n", 449 | "I0508 12:19:04.415506 2310 net.cpp:120] Top shape: 64 9 (576)\n", 450 | "I0508 12:19:04.415524 2310 layer_factory.hpp:74] Creating layer loss\n", 451 | "I0508 12:19:04.416088 2310 net.cpp:84] Creating Layer loss\n", 452 | "I0508 12:19:04.416102 2310 net.cpp:380] loss <- ip2\n", 453 | "I0508 12:19:04.416110 2310 net.cpp:380] loss <- label\n", 454 | "I0508 12:19:04.416121 2310 net.cpp:338] loss -> loss\n", 455 | "I0508 12:19:04.416137 2310 net.cpp:113] Setting up loss\n", 456 | "I0508 12:19:04.416153 2310 layer_factory.hpp:74] Creating layer loss\n", 457 | "I0508 12:19:04.416234 2310 net.cpp:120] Top shape: (1)\n", 458 | "I0508 12:19:04.416247 2310 net.cpp:122] with loss weight 1\n", 459 | "I0508 12:19:04.416277 2310 net.cpp:167] loss needs backward computation.\n", 460 | "I0508 12:19:04.416283 2310 net.cpp:167] ip2 needs backward computation.\n", 461 | "I0508 12:19:04.416293 2310 net.cpp:167] relu1 needs backward computation.\n", 462 | "I0508 12:19:04.416298 2310 net.cpp:167] ip1 needs backward computation.\n", 463 | "I0508 12:19:04.416331 2310 net.cpp:169] otto does not need backward computation.\n", 464 | "I0508 12:19:04.416337 2310 net.cpp:205] This network produces output loss\n", 465 | "I0508 12:19:04.416350 2310 net.cpp:447] Collecting Learning Rate and Weight Decay.\n", 466 | "I0508 12:19:04.416360 2310 net.cpp:217] Network initialization done.\n", 467 | "I0508 12:19:04.416365 2310 net.cpp:218] Memory required for data: 41732\n", 468 | "I0508 12:19:04.416591 2310 solver.cpp:154] Creating test net (#0) specified by net file: model_train_test.prototxt\n", 469 | "I0508 12:19:04.416620 2310 net.cpp:257] The NetState phase (1) differed from the phase (0) specified by a rule in layer otto\n", 470 | "I0508 12:19:04.416688 2310 net.cpp:42] Initializing net from parameters: \n", 471 | "name: \"otto\"\n", 472 | "state {\n", 473 | " phase: TEST\n", 474 | "}\n", 475 | "layer {\n", 476 | " name: \"simple\"\n", 477 | " type: \"Data\"\n", 478 | " top: \"data\"\n", 479 | " top: \"label\"\n", 480 | " include {\n", 481 | " phase: TEST\n", 482 | " }\n", 483 | " data_param {\n", 484 | " source: \"test_data_lmdb\"\n", 485 | " batch_size: 100\n", 486 | " backend: LMDB\n", 487 | " }\n", 488 | "}\n", 489 | "layer {\n", 490 | " name: \"ip1\"\n", 491 | " type: \"InnerProduct\"\n", 492 | " bottom: \"data\"\n", 493 | " top: \"ip1\"\n", 494 | " inner_product_param {\n", 495 | " num_output: 30\n", 496 | " weight_filler {\n", 497 | " type: \"xavier\"\n", 498 | " }\n", 499 | " bias_filler {\n", 500 | " type: \"constant\"\n", 501 | " value: 0\n", 502 | " }\n", 503 | " }\n", 504 | "}\n", 505 | "layer {\n", 506 | " name: \"relu1\"\n", 507 | " type: \"ReLU\"\n", 508 | " bottom: \"ip1\"\n", 509 | " top: \"ip1\"\n", 510 | "}\n", 511 | "layer {\n", 512 | " name: \"ip2\"\n", 513 | " type: \"InnerProduct\"\n", 514 | " bottom: \"ip1\"\n", 515 | " top: \"ip2\"\n", 516 | " inner_product_param {\n", 517 | " num_output: 9\n", 518 | " weight_filler {\n", 519 | " type: \"xavier\"\n", 520 | " }\n", 521 | " bias_filler {\n", 522 | " type: \"constant\"\n", 523 | " value: 0\n", 524 | " }\n", 525 | " }\n", 526 | "}\n", 527 | "layer {\n", 528 | " name: \"accuracy\"\n", 529 | " type: \"Accuracy\"\n", 530 | " bottom: \"ip2\"\n", 531 | " bottom: \"label\"\n", 532 | " top: \"accuracy\"\n", 533 | " include {\n", 534 | " phase: TEST\n", 535 | " }\n", 536 | "}\n", 537 | "layer {\n", 538 | " name: \"loss\"\n", 539 | " type: \"SoftmaxWithLoss\"\n", 540 | " bottom: \"ip2\"\n", 541 | " bottom: \"label\"\n", 542 | " top: \"loss\"\n", 543 | "}\n", 544 | "I0508 12:19:04.416759 2310 layer_factory.hpp:74] Creating layer simple\n", 545 | "I0508 12:19:04.416776 2310 net.cpp:84] Creating Layer simple\n", 546 | "I0508 12:19:04.416787 2310 net.cpp:338] simple -> data\n", 547 | "I0508 12:19:04.416798 2310 net.cpp:338] simple -> label\n", 548 | "I0508 12:19:04.416811 2310 net.cpp:113] Setting up simple\n", 549 | "I0508 12:19:04.416862 2310 db.cpp:34] Opened lmdb test_data_lmdb\n", 550 | "I0508 12:19:04.416890 2310 data_layer.cpp:67] output data size: 100,93,1,1\n", 551 | "I0508 12:19:04.416952 2310 net.cpp:120] Top shape: 100 93 1 1 (9300)\n", 552 | "I0508 12:19:04.416966 2310 net.cpp:120] Top shape: 100 (100)\n", 553 | "I0508 12:19:04.416972 2310 layer_factory.hpp:74] Creating layer label_simple_1_split\n", 554 | "I0508 12:19:04.416990 2310 net.cpp:84] Creating Layer label_simple_1_split\n", 555 | "I0508 12:19:04.416999 2310 net.cpp:380] label_simple_1_split <- label\n", 556 | "I0508 12:19:04.417007 2310 net.cpp:338] label_simple_1_split -> label_simple_1_split_0\n", 557 | "I0508 12:19:04.417021 2310 net.cpp:338] label_simple_1_split -> label_simple_1_split_1\n", 558 | "I0508 12:19:04.417035 2310 net.cpp:113] Setting up label_simple_1_split\n", 559 | "I0508 12:19:04.417049 2310 net.cpp:120] Top shape: 100 (100)\n", 560 | "I0508 12:19:04.417060 2310 net.cpp:120] Top shape: 100 (100)\n", 561 | "I0508 12:19:04.417067 2310 layer_factory.hpp:74] Creating layer ip1\n", 562 | "I0508 12:19:04.417076 2310 net.cpp:84] Creating Layer ip1\n", 563 | "I0508 12:19:04.417083 2310 net.cpp:380] ip1 <- data\n", 564 | "I0508 12:19:04.417091 2310 net.cpp:338] ip1 -> ip1\n", 565 | "I0508 12:19:04.417104 2310 net.cpp:113] Setting up ip1\n", 566 | "I0508 12:19:04.417143 2310 net.cpp:120] Top shape: 100 30 (3000)\n", 567 | "I0508 12:19:04.417160 2310 layer_factory.hpp:74] Creating layer relu1\n", 568 | "I0508 12:19:04.417172 2310 net.cpp:84] Creating Layer relu1\n", 569 | "I0508 12:19:04.417179 2310 net.cpp:380] relu1 <- ip1\n", 570 | "I0508 12:19:04.417186 2310 net.cpp:327] relu1 -> ip1 (in-place)\n", 571 | "I0508 12:19:04.417198 2310 net.cpp:113] Setting up relu1\n", 572 | "I0508 12:19:04.417255 2310 net.cpp:120] Top shape: 100 30 (3000)\n", 573 | "I0508 12:19:04.417268 2310 layer_factory.hpp:74] Creating layer ip2\n", 574 | "I0508 12:19:04.417278 2310 net.cpp:84] Creating Layer ip2\n", 575 | "I0508 12:19:04.417286 2310 net.cpp:380] ip2 <- ip1\n", 576 | "I0508 12:19:04.417295 2310 net.cpp:338] ip2 -> ip2\n", 577 | "I0508 12:19:04.417307 2310 net.cpp:113] Setting up ip2\n", 578 | "I0508 12:19:04.417325 2310 net.cpp:120] Top shape: 100 9 (900)\n", 579 | "I0508 12:19:04.417338 2310 layer_factory.hpp:74] Creating layer ip2_ip2_0_split\n", 580 | "I0508 12:19:04.417347 2310 net.cpp:84] Creating Layer ip2_ip2_0_split\n", 581 | "I0508 12:19:04.417369 2310 net.cpp:380] ip2_ip2_0_split <- ip2\n", 582 | "I0508 12:19:04.417377 2310 net.cpp:338] ip2_ip2_0_split -> ip2_ip2_0_split_0\n", 583 | "I0508 12:19:04.417392 2310 net.cpp:338] ip2_ip2_0_split -> ip2_ip2_0_split_1\n", 584 | "I0508 12:19:04.417400 2310 net.cpp:113] Setting up ip2_ip2_0_split\n", 585 | "I0508 12:19:04.417410 2310 net.cpp:120] Top shape: 100 9 (900)\n", 586 | "I0508 12:19:04.417418 2310 net.cpp:120] Top shape: 100 9 (900)\n", 587 | "I0508 12:19:04.417423 2310 layer_factory.hpp:74] Creating layer accuracy\n", 588 | "I0508 12:19:04.417459 2310 net.cpp:84] Creating Layer accuracy\n", 589 | "I0508 12:19:04.417474 2310 net.cpp:380] accuracy <- ip2_ip2_0_split_0\n", 590 | "I0508 12:19:04.417480 2310 net.cpp:380] accuracy <- label_simple_1_split_0\n", 591 | "I0508 12:19:04.417489 2310 net.cpp:338] accuracy -> accuracy\n", 592 | "I0508 12:19:04.417498 2310 net.cpp:113] Setting up accuracy\n", 593 | "I0508 12:19:04.417511 2310 net.cpp:120] Top shape: (1)\n", 594 | "I0508 12:19:04.417521 2310 layer_factory.hpp:74] Creating layer loss\n", 595 | "I0508 12:19:04.417528 2310 net.cpp:84] Creating Layer loss\n", 596 | "I0508 12:19:04.417537 2310 net.cpp:380] loss <- ip2_ip2_0_split_1\n", 597 | "I0508 12:19:04.417543 2310 net.cpp:380] loss <- label_simple_1_split_1\n", 598 | "I0508 12:19:04.417556 2310 net.cpp:338] loss -> loss\n", 599 | "I0508 12:19:04.417563 2310 net.cpp:113] Setting up loss\n", 600 | "I0508 12:19:04.417574 2310 layer_factory.hpp:74] Creating layer loss\n", 601 | "I0508 12:19:04.417726 2310 net.cpp:120] Top shape: (1)\n", 602 | "I0508 12:19:04.417742 2310 net.cpp:122] with loss weight 1\n", 603 | "I0508 12:19:04.417750 2310 net.cpp:167] loss needs backward computation.\n", 604 | "I0508 12:19:04.417757 2310 net.cpp:169] accuracy does not need backward computation.\n", 605 | "I0508 12:19:04.417764 2310 net.cpp:167] ip2_ip2_0_split needs backward computation.\n", 606 | "I0508 12:19:04.417768 2310 net.cpp:167] ip2 needs backward computation.\n", 607 | "I0508 12:19:04.417773 2310 net.cpp:167] relu1 needs backward computation.\n", 608 | "I0508 12:19:04.417779 2310 net.cpp:167] ip1 needs backward computation.\n", 609 | "I0508 12:19:04.417785 2310 net.cpp:169] label_simple_1_split does not need backward computation.\n", 610 | "I0508 12:19:04.417790 2310 net.cpp:169] simple does not need backward computation.\n", 611 | "I0508 12:19:04.417795 2310 net.cpp:205] This network produces output accuracy\n", 612 | "I0508 12:19:04.417800 2310 net.cpp:205] This network produces output loss\n", 613 | "I0508 12:19:04.417815 2310 net.cpp:447] Collecting Learning Rate and Weight Decay.\n", 614 | "I0508 12:19:04.417824 2310 net.cpp:217] Network initialization done.\n", 615 | "I0508 12:19:04.417829 2310 net.cpp:218] Memory required for data: 73208\n", 616 | "I0508 12:19:04.417873 2310 solver.cpp:42] Solver scaffolding done.\n", 617 | "I0508 12:19:04.417899 2310 solver.cpp:222] Solving otto\n", 618 | "I0508 12:19:04.417911 2310 solver.cpp:223] Learning Rate Policy: inv\n", 619 | "I0508 12:19:04.417919 2310 solver.cpp:266] Iteration 0, Testing net (#0)\n", 620 | "I0508 12:19:04.460979 2310 solver.cpp:315] Test net output #0: accuracy = 0.1831\n", 621 | "I0508 12:19:04.461011 2310 solver.cpp:315] Test net output #1: loss = 2.25925 (* 1 = 2.25925 loss)\n", 622 | "I0508 12:19:04.461773 2310 solver.cpp:189] Iteration 0, loss = 2.14817\n", 623 | "I0508 12:19:04.461799 2310 solver.cpp:204] Train net output #0: loss = 2.14817 (* 1 = 2.14817 loss)\n", 624 | "I0508 12:19:04.461817 2310 solver.cpp:464] Iteration 0, lr = 0.01\n", 625 | "I0508 12:19:09.527751 2310 solver.cpp:266] Iteration 10000, Testing net (#0)\n", 626 | "I0508 12:19:09.571025 2310 solver.cpp:315] Test net output #0: accuracy = 0.7784\n", 627 | "I0508 12:19:09.571063 2310 solver.cpp:315] Test net output #1: loss = 0.558455 (* 1 = 0.558455 loss)\n", 628 | "I0508 12:19:09.571552 2310 solver.cpp:189] Iteration 10000, loss = 0.577026\n", 629 | "I0508 12:19:09.571574 2310 solver.cpp:204] Train net output #0: loss = 0.577026 (* 1 = 0.577026 loss)\n", 630 | "I0508 12:19:09.571591 2310 solver.cpp:464] Iteration 10000, lr = 0.00594604\n", 631 | "I0508 12:19:14.722017 2310 solver.cpp:266] Iteration 20000, Testing net (#0)\n", 632 | "I0508 12:19:14.765653 2310 solver.cpp:315] Test net output #0: accuracy = 0.7919\n", 633 | "I0508 12:19:14.765692 2310 solver.cpp:315] Test net output #1: loss = 0.537067 (* 1 = 0.537067 loss)\n", 634 | "I0508 12:19:14.766103 2310 solver.cpp:189] Iteration 20000, loss = 0.632795\n", 635 | "I0508 12:19:14.766165 2310 solver.cpp:204] Train net output #0: loss = 0.632795 (* 1 = 0.632795 loss)\n", 636 | "I0508 12:19:14.766178 2310 solver.cpp:464] Iteration 20000, lr = 0.00438691\n", 637 | "I0508 12:19:19.922034 2310 solver.cpp:266] Iteration 30000, Testing net (#0)\n", 638 | "I0508 12:19:19.964999 2310 solver.cpp:315] Test net output #0: accuracy = 0.7859\n", 639 | "I0508 12:19:19.965039 2310 solver.cpp:315] Test net output #1: loss = 0.535475 (* 1 = 0.535475 loss)\n", 640 | "I0508 12:19:19.965441 2310 solver.cpp:189] Iteration 30000, loss = 0.697927\n", 641 | "I0508 12:19:19.965468 2310 solver.cpp:204] Train net output #0: loss = 0.697927 (* 1 = 0.697927 loss)\n", 642 | "I0508 12:19:19.965479 2310 solver.cpp:464] Iteration 30000, lr = 0.00353553\n", 643 | "I0508 12:19:25.167050 2310 solver.cpp:266] Iteration 40000, Testing net (#0)\n", 644 | "I0508 12:19:25.210865 2310 solver.cpp:315] Test net output #0: accuracy = 0.7933\n", 645 | "I0508 12:19:25.210904 2310 solver.cpp:315] Test net output #1: loss = 0.534498 (* 1 = 0.534498 loss)\n", 646 | "I0508 12:19:25.211313 2310 solver.cpp:189] Iteration 40000, loss = 0.352082\n", 647 | "I0508 12:19:25.211338 2310 solver.cpp:204] Train net output #0: loss = 0.352082 (* 1 = 0.352082 loss)\n", 648 | "I0508 12:19:25.211354 2310 solver.cpp:464] Iteration 40000, lr = 0.0029907\n", 649 | "I0508 12:19:30.322751 2310 solver.cpp:266] Iteration 50000, Testing net (#0)\n", 650 | "I0508 12:19:30.367033 2310 solver.cpp:315] Test net output #0: accuracy = 0.7888\n", 651 | "I0508 12:19:30.367086 2310 solver.cpp:315] Test net output #1: loss = 0.530166 (* 1 = 0.530166 loss)\n", 652 | "I0508 12:19:30.367511 2310 solver.cpp:189] Iteration 50000, loss = 0.586298\n", 653 | "I0508 12:19:30.367533 2310 solver.cpp:204] Train net output #0: loss = 0.586298 (* 1 = 0.586298 loss)\n", 654 | "I0508 12:19:30.367544 2310 solver.cpp:464] Iteration 50000, lr = 0.00260847\n", 655 | "I0508 12:19:35.499639 2310 solver.cpp:266] Iteration 60000, Testing net (#0)\n", 656 | "I0508 12:19:35.544010 2310 solver.cpp:315] Test net output #0: accuracy = 0.7936\n", 657 | "I0508 12:19:35.544049 2310 solver.cpp:315] Test net output #1: loss = 0.532958 (* 1 = 0.532958 loss)\n", 658 | "I0508 12:19:35.544478 2310 solver.cpp:189] Iteration 60000, loss = 0.490088\n", 659 | "I0508 12:19:35.544502 2310 solver.cpp:204] Train net output #0: loss = 0.490088 (* 1 = 0.490088 loss)\n", 660 | "I0508 12:19:35.544514 2310 solver.cpp:464] Iteration 60000, lr = 0.00232368\n", 661 | "I0508 12:19:40.707180 2310 solver.cpp:266] Iteration 70000, Testing net (#0)\n", 662 | "I0508 12:19:40.749495 2310 solver.cpp:315] Test net output #0: accuracy = 0.7839\n", 663 | "I0508 12:19:40.749534 2310 solver.cpp:315] Test net output #1: loss = 0.530616 (* 1 = 0.530616 loss)\n", 664 | "I0508 12:19:40.749927 2310 solver.cpp:189] Iteration 70000, loss = 0.350372\n", 665 | "I0508 12:19:40.749953 2310 solver.cpp:204] Train net output #0: loss = 0.350372 (* 1 = 0.350372 loss)\n", 666 | "I0508 12:19:40.749966 2310 solver.cpp:464] Iteration 70000, lr = 0.00210224\n", 667 | "I0508 12:19:45.909342 2310 solver.cpp:266] Iteration 80000, Testing net (#0)\n", 668 | "I0508 12:19:45.953330 2310 solver.cpp:315] Test net output #0: accuracy = 0.7882\n", 669 | "I0508 12:19:45.953367 2310 solver.cpp:315] Test net output #1: loss = 0.529338 (* 1 = 0.529338 loss)\n", 670 | "I0508 12:19:45.953785 2310 solver.cpp:189] Iteration 80000, loss = 0.436605\n", 671 | "I0508 12:19:45.953809 2310 solver.cpp:204] Train net output #0: loss = 0.436605 (* 1 = 0.436605 loss)\n", 672 | "I0508 12:19:45.953819 2310 solver.cpp:464] Iteration 80000, lr = 0.0019245\n", 673 | "I0508 12:19:51.088989 2310 solver.cpp:266] Iteration 90000, Testing net (#0)\n", 674 | "I0508 12:19:51.134217 2310 solver.cpp:315] Test net output #0: accuracy = 0.787\n", 675 | "I0508 12:19:51.134254 2310 solver.cpp:315] Test net output #1: loss = 0.525386 (* 1 = 0.525386 loss)\n", 676 | "I0508 12:19:51.134697 2310 solver.cpp:189] Iteration 90000, loss = 0.521645\n", 677 | "I0508 12:19:51.134722 2310 solver.cpp:204] Train net output #0: loss = 0.521645 (* 1 = 0.521645 loss)\n", 678 | "I0508 12:19:51.134732 2310 solver.cpp:464] Iteration 90000, lr = 0.00177828\n", 679 | "I0508 12:19:56.294564 2310 solver.cpp:334] Snapshotting to _iter_100001.caffemodel\n", 680 | "I0508 12:19:56.294857 2310 solver.cpp:342] Snapshotting solver state to _iter_100001.solverstate\n", 681 | "I0508 12:19:56.295253 2310 solver.cpp:248] Iteration 100000, loss = 0.353043\n", 682 | "I0508 12:19:56.295280 2310 solver.cpp:266] Iteration 100000, Testing net (#0)\n", 683 | "I0508 12:19:56.338987 2310 solver.cpp:315] Test net output #0: accuracy = 0.7866\n", 684 | "I0508 12:19:56.339017 2310 solver.cpp:315] Test net output #1: loss = 0.529087 (* 1 = 0.529087 loss)\n", 685 | "I0508 12:19:56.339030 2310 solver.cpp:253] Optimization Done.\n", 686 | "I0508 12:19:56.339035 2310 caffe.cpp:134] Optimization Done.\n", 687 | "\n" 688 | ] 689 | } 690 | ], 691 | "source": [ 692 | "print res" 693 | ] 694 | }, 695 | { 696 | "cell_type": "markdown", 697 | "metadata": {}, 698 | "source": [ 699 | "#Applying the Model" 700 | ] 701 | }, 702 | { 703 | "cell_type": "code", 704 | "execution_count": 15, 705 | "metadata": { 706 | "collapsed": true 707 | }, 708 | "outputs": [], 709 | "source": [ 710 | "net = caffe.Net(\"model_prod.prototxt\",\"./_iter_100001.caffemodel\", caffe.TEST)" 711 | ] 712 | }, 713 | { 714 | "cell_type": "code", 715 | "execution_count": 16, 716 | "metadata": { 717 | "collapsed": false 718 | }, 719 | "outputs": [ 720 | { 721 | "name": "stdout", 722 | "output_type": "stream", 723 | "text": [ 724 | "True \n", 725 | "{'prob': array([[ 0.00519855, 0.83611858, 0.05120391, 0.07174591, 0.0020012 ,\n", 726 | " 0.00854634, 0.0165364 , 0.00283596, 0.00581307]], dtype=float32)}\n" 727 | ] 728 | }, 729 | { 730 | "data": { 731 | "text/plain": [ 732 | "" 733 | ] 734 | }, 735 | "execution_count": 16, 736 | "metadata": {}, 737 | "output_type": "execute_result" 738 | }, 739 | { 740 | "data": { 741 | "image/png": "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\n", 742 | "text/plain": [ 743 | "" 744 | ] 745 | }, 746 | "metadata": {}, 747 | "output_type": "display_data" 748 | } 749 | ], 750 | "source": [ 751 | "l, f = get_data_for_case_from_lmdb(\"/home/ubuntu/data/test_data_lmdb/\", \"00001230\")\n", 752 | "out = net.forward(**{net.inputs[0]: np.asarray([f])})\n", 753 | "\n", 754 | "# if the index of the largest element matches the integer\n", 755 | "# label we stored for that case - then the prediction is right\n", 756 | "print np.argmax(out[\"prob\"][0]) == l, \"\\n\", out\n", 757 | "plt.bar(range(9),out[\"prob\"][0])" 758 | ] 759 | }, 760 | { 761 | "cell_type": "markdown", 762 | "metadata": {}, 763 | "source": [ 764 | "#Visualizing the Network Graph" 765 | ] 766 | }, 767 | { 768 | "cell_type": "code", 769 | "execution_count": 172, 770 | "metadata": { 771 | "collapsed": false 772 | }, 773 | "outputs": [ 774 | { 775 | "data": { 776 | "image/png": "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\n9L+L3U+l71LqegAAAABJRU5ErkJggg==\n", 777 | "text/plain": [ 778 | "" 779 | ] 780 | }, 781 | "metadata": {}, 782 | "output_type": "display_data" 783 | } 784 | ], 785 | "source": [ 786 | "from google.protobuf import text_format\n", 787 | "from caffe.draw import get_pydot_graph\n", 788 | "from caffe.proto import caffe_pb2\n", 789 | "from IPython.display import display, Image \n", 790 | "\n", 791 | "_net = caffe_pb2.NetParameter()\n", 792 | "f = open(\"model_prod.prototxt\")\n", 793 | "text_format.Merge(f.read(), _net)\n", 794 | "display(Image(get_pydot_graph(_net,\"TB\").create_png()))" 795 | ] 796 | }, 797 | { 798 | "cell_type": "markdown", 799 | "metadata": {}, 800 | "source": [ 801 | "#Visualizing the Weights" 802 | ] 803 | }, 804 | { 805 | "cell_type": "code", 806 | "execution_count": 192, 807 | "metadata": { 808 | "collapsed": false 809 | }, 810 | "outputs": [], 811 | "source": [ 812 | "# weights connecting the input with relu1\n", 813 | "arr = net.params[\"ip1\"][0].data" 814 | ] 815 | }, 816 | { 817 | "cell_type": "code", 818 | "execution_count": 222, 819 | "metadata": { 820 | "collapsed": false 821 | }, 822 | "outputs": [ 823 | { 824 | "data": { 825 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAksAAAFNCAYAAAAQDCuCAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xt8jvUfBvDr01aL0WQyLDklOeUYiRhFoSiKUqEkRSjS\nSYelUimSSlHkkGNRKZRTIxIScj6FUCYrC5Uy398fe5Ts+t7WtI39rvfr1avtcnt2737u536+tud6\nPuacg4iIiIhwp2X3DoiIiIiczLRYEhEREQmgxZKIiIhIAC2WRERERAJosSQiIiISQIslERERkQCZ\nvlgys6vMbJ2ZbTSzBzP760nmMrOiZvaZma02s1Vm1i2U5zezmWa2wcxmmFm+7N5XyTgzCzOzZWb2\nUehz3b85hJnlM7P3zGytma0xs5q6f3MOM3s4dH1eaWZjzSxC9++Jy9TFkpmFAXgVwFUAygG4yczK\nZubXlEz3J4D7nHPlAVwCoEvoPn0IwEzn3AUAZoc+l1NXdwBrABx5IzbdvznHywCmOefKArgIwDro\n/s0RzKw4gI4AqjrnKgIIA3AjdP+esMz+yVINAJucc1udc38CGA+geSZ/TclEzrldzrnloY/3A1gL\nIBZAMwAjQ5uNBHBt9uyhnCgzOxdAEwBvAbBQrPs3BzCzKACXOeeGA4Bz7pBzLhm6f3OKX5D6D9rc\nZhYOIDeA76H794Rl9mIpFsD2oz7fEcokBwj9K6YKgEUAYpxziaE/SgQQk027JSfuJQC9ABw+KtP9\nmzOUAPCjmb1tZl+b2ZtmFgndvzmCc+4nAP0BfIfURdJe59xM6P49YZm9WNIslRzKzPIAmASgu3Nu\n39F/5lJn6Oi+PwWZ2dUAdjvnluHvnyr9g+7fU1o4gKoABjvnqgI4gGN+JaP799RlZqUA3AugOIAi\nAPKY2S1Hb6P7N2Mye7G0E0DRoz4vitSfLskpzMxOR+pCabRz7oNQnGhmhUJ/XhjA7uzaPzkhlwJo\nZmZbAIwD0MDMRkP3b06xA8AO59yS0OfvIXXxtEv3b45QHcAXzrkk59whAJMB1ILu3xOW2YulrwCU\nNrPiZnYGgNYApmTy15RMZGYGYBiANc65gUf90RQA7UIftwPwwbF/V05+zrlHnHNFnXMlkPrC0DnO\nuVuh+zdHcM7tArDdzC4IRVcAWA3gI+j+zQnWAbjEzHKFrtVXILWoofv3BFnqT+Qy8QuYNQYwEKmv\nyh/mnHs2U7+gZCozqwNgHoBv8PePch8GsBjARADnAdgKoJVzbm927KP8N8ysHoCezrlmZpYfun9z\nBDOrhNQX758BYDOA25B6fdb9mwOY2QNIXRAdBvA1gDsA5IXu3xOS6YslERERkVOZ3sFbREREJIAW\nSyIiIiIBtFgSERERCZDhxZJmvomIiMj/gwy9wDs08209UmuJOwEsAXCTc27tUdvoleMiIiJyynDO\n0TfjDc/g7f018w0AzOzIzLe1/9iqa2i9tCgeqBkPACg8aDO9wZ3rStO89oWzaP7livo071OpF823\n/+O9Mf82dGR3mp/T7jueux9pvqrhxTS/btYYmn+46CaaN685jm//Kd/+7isH0HxCSmualwtbQ/MY\nJNJ80oRbaN6y9Tt/fbwmfjLKxbcAACxCTbr9NfiI5tXxFc0nohXNn8cDNB+Lm2nu25+5i66iedma\nX9N83dwqNB9Sry3NB6EbzUthE80/XMDvX0zicekBK2heDvz+/XAFv33L9wfNXyrW9a+Pp8d/hcbx\n1QEAr6Ez3T4cKTSvjOU0H7ftVprfWWwwzafgGpqfD349uRNDad714Cs0PyOCH4cGmEPz0cm30XxI\nVAeab0Ypmh9CGM1HHOC3f1nk5zSfvrMJzTH+TBrf0vPNvz5eET8FleKbAQB+Qy66/QeJfJTY6zF3\n0zwXfqN5XuyjeTW3lOZF6+2hOV7icatqI2n+BS6l+WXgx3MxatD8RdxP8+te/oTmV3d/l+Yfb+PH\ns0axL2i+ZHVdmk8pfwXNl6L6Xx9/Fj8f9ePrAAD2IS/dfgza0LwtRtP8PVxP84r4hu/nhzfS/LXm\n/DxPQgGa90l6nOZ//n4GzRvFfkrzGSs8I2or03USgIz/Gk4z30REROT/QkZ/spS+X7Etik/9/44E\nIDYBODcug19ORERE5D+0JAH4KiFdm2Z0sZS+mW+hX71poZSznRNXNrt3QTLR+XFFsnsXJBPFxJXJ\n7l2QTFQ87rzs3oWT18Vxqf8dMeRJ76YZ/TXcv5v5poVSjqbFUs5WWoulHK2QFks5Wgktlv4TGR53\ncryZb2bmqh5O++K5JOMv3LoK/AVyd+F1mlfZtorv1x7+w7Le1XrTvB34CwJLb9vKb381v/0JjZvR\nvNUa/sLmc8rzF5AnJUbT/PAh/kLQS2MX0HzWgYY07xo5iOZ7wL+u74W7d3vul/7oSfNH8AzNi2Mb\nzc9bwF9In7KOH4c+HfgL+4v+46V1fzvk+aHqBM8Ly30FgSvBX0C41FWn+ZfteDGh2ajxNO/n+Lty\ndDX+QuWlKdVovnt2MZqfczk/DwuE8eM/DfyFxBvAn3B9Lxgue0wX5IgPwF/42tHzgu26nhfo+r5u\nfiTR/DrPXNHfEUHz5xIfpnn1GF5Y8H1fMdN/ofn8xlVp7nt81XX8ONx34xs0f24CL7YsBT9/Js3l\nRQ/bxp8/FrTl+/8w+GjQBYm1ab66YHma3228CLAKFfn2nutVn2l8f+5qwl9BXgbraV4V/AXqP4D/\nQ6M7BtL8GTxK810oRPPhuJ3mn6IRzZ/FIzQviN009xVzWmEizfceyEfzapH8+Pgep0u21aJ5lWKL\nad7e8zwehkM0n+E5Ph9am/+8DQfn3HQA0zP690VEREROBXoHbxEREZEAWiyJiIiIBNBiSURERCSA\nFksiIiIiATL8Au/0eMfSjjR4C3fQbceCj2P4FFfSvHux/jQfdIiPw2jieS36c+CtFkw4ncauHt+8\n9Xd8LkV8ed5mqgH+qv7BMXycRGH8QPNt4C2nyFW8xXZxzXk0L+sZk7HYMy7kFdxD8w24gOaJnjZH\n3Rm8PfRcIz4uZHxt3jpshBk0b40JNK+FhTT3nSf9PGNW6iOB5nltP82njORjOwq24dvXHMvPk5kr\n+HHoVIm3bE6P+JPmu8Py0LwH+BidiskraR4Txds0+bCXb+8Zr+O7Hwt89ivN763Pv9+VqEDzPzzt\nNt/jcRz4mIZFMfxx0RP8uuT7vlaV5GOSannGrAxBJ5pfNG0jzXs1epXmC1GZ5n3387YUHuPx9fP4\nOIxrPe1CXxtubUH+9iOlG6Z9+z4AmPPz1TQv+tUGmj/Rrh/NZ4/i40LeWHEfzc+rxNtw3w3mbdCm\nnd+jeeKkEjS/bQNvxfZ4mLeJ/c8LxWleGvz4PLzI08479DTN91birbf9Pc6heZGh39M8ydPCfrfY\ndTS/YdrHNL+5yViafwx+nnyVwtvKQfSTJREREZEAWiyJiIiIBNBiSURERCSAFksiIiIiAbRYEhER\nEQmQ4dlwx71hMzfQ3Zkm75nI2yK1Yng7af5w3la46fa3aZ4AXldbgho0983cqT5mNc3L3vw1zdeu\n5rOQLM8fNH+pWFeazwL/fqcuvZ7mVavNp/kQ3EXzeMTTfDcK0ryhp8XzzGDezjjz5p9oXj6KH8+G\nmEXzcZ525HcLeOukRe0xNPd5d1Fbmv95Id8+Yu/vNL+7GG8bRWMPzcehDc2Lua00P98209zXNkpA\nHM0d6Lgj/Ag+q3HYKn5+hvXiLUvM+IbG56bw2U9hnpmDvtlbvvbfjZX4dWCrpw30B3jLtQOG0bzL\nh/z2U2L5jMLrqvPz0Ne+XAg+A2s/8tLc18qsPJcft7A8/DhfWm02zSegNc1XOj5zbYilvcYDQAXw\n2Z2j0I7mtcFnXE4cybcf37Y5zVuunkbz8AV8RthVnd6n+awkfh3uEv0azQds5LNH3yvdlOa+Vtow\ndKD5UvD2lm+mZxUsp7nvcRHmDtP8yxf48+njD/DW5FLHZwvuM34++2a3LUiqQ/M9efj1akgEb4ne\nP4Nfn8s2WkbztVbNOxtOP1kSERERCaDFkoiIiEgALZZEREREAmixJCIiIhJAiyURERGRAJnahot3\naZsb8aufp9tfXf5dmk9dxFtgfWr2orlvBtPZ+JnmT7gnaT6++200XzKIz5x6Co/S/BrwWTYdd75F\n8xdje9J8I0rTfNxB3hr7pX8Mzas8wlsnecFnk83bydsQTWOn0nw5KtHc5w7w43CBpxWVC7yV5msJ\nFfTMIJufchnN64R9TvMPV/DjjHx85prt52MXY8ttovmO3vz+tQr88flMmx40981aGph4L819M84u\n3sbbIl3Oe5nme8FnRW22UjT3tXjOB2//+dpz7TGC5tev4Oen/c6P55CavB3pe9z5WoRh4K2ieBdP\n8/Oe+JHmV/XhLa1PXuMzsyyZf1+rHuHHfwTa8+09M/UeBZ8R9pRnaNytGEXzzTif5rnwG82fPsiv\nq0kHYmk++2zeorqy+1ya+67n36MwzT8Gn+3YBnw2ma991gS8tVdgwAGaV+/BZ3p2xus0H4y7af71\nUn58DPz8+e18fh27PorPsMsNPsMxGkk0/wKX0vx88Ouk7zhfP5E/z/7UMjfNK4bxGZc77AK14URE\nREQyQoslERERkQBaLImIiIgE0GJJREREJAB/9VY6mdlWAL8ASAHwp3OOzxQREREROUWdUBvOzLYA\nqOacSzMQzMxcnEv7iv+7Pa/eT/H8kOuQZ5ZTu9UTaX5J+c9o/uXc+jS/sx5v9wyewVtp4TG8/fRu\nJd6S8M2qm4SWNPe1LapsXEfz+aX5LJ66S5fQ/KZqw2nua23kw16ab0dRmlf2zCSaD97CeAn30fz6\nxPdofvj3M2heoNgumu9Zz/fzkzL8fvGZiFY0r4HFNI/AwX+1fU/HZybeC35+XtU7geZ1+35K83nr\nr6R5Sm4+4+zNorfQfJjjs6uWtK5L8wcnxtP8uZ0P07xOLG8jLk7i/w5LiI6jeeOD02me/DGfBVmp\n5Zc0z4t9NF+w+XKaX1iKn/+5wVtOq5PL89uJ4m3QqY7PGotdzGcytqvJr7dzPTME64DPmrwe/PF4\nmqeluNgzi3MjLqD5E+Ct5HKzt9Dc12r0jPrEh1Ub0vxNz2y7wviB5kPXd6N59Pk7af7T/CI0X1ev\nOM3LJa6hecrePDQ/t8xGmu+Yy1ucVevx+/dB9KP5HQd4W3nfXD5LtFQTPhOwBzzXtyR+fcsXzZ93\nIhy/ru6ox7/fovP4DL784I+XFVYrU9twfEKniIiISA5wooslB2CWmX1lZh3/ix0SEREROZmc0GuW\nANR2zv1gZucAmGlm65xzf/0cfUv8O39tmC/uIpwdd9EJfjkRERGRE7c/4WvsT/g6Xdue0GLJOfdD\n6P8/mtn7AGoA+GuxVCKev+5BREREJDvliauKPHFV//o88clh3m0z/Gs4M8ttZnlDH0cCaASAv4e4\niIiIyCkqw204MysB4MgAo3AAY5xzzx715+4pl7ZRthRV02SAf6ZbEU8rYTL4jCRf22LhZt6G61Xq\nKZq/uO0hmscU20HzZzyz4dagHM2rYinN53nac8Wwjea+lpmvzeFru3RKGkLzW6NH0/wgImi+EhVp\nXhy81XIr3qH5PXiF5n+k8K97XRifpVXD8fbZXa+MpHndbrxNthu8/XEevqN5c3xI8wcP8NmIFSJ5\ni8TXqivmttI8t/EZW+s9j4suGEzzz1wczV+twGcyNljFZ7HVNH78S3lmwCV4Wlr7wNtAbcHPzy0o\nQfNX0JXm8Yj/V/mOxHNpPi2mCc0fA7/OFMb3NPfxtcz6k2stANz44hSad+7F20lDdt5F8x6xfPsB\nk3vT/IYWfDbcMlSmeeIBXmNbHslnTV6c8hXNR4fdSvOWybzNtziKz0Z8wNMOOwjexi0M3sb1XZ9v\nAJ+FWgX8V0K/gc84+whX0zzF80ujc8Gfv4ZM4bMjOzUbSPMZaETzb1fzdmfp8ito7nOZ53nKd/4X\ncfxxtMWK03xrEr8+/FkgytuGy/Cv4ZxzWwDPmS8iIiKSQ+gdvEVEREQCaLEkIiIiEkCLJREREZEA\nWiyJiIiIBDih2XCBN2zm2rvX0uSvHOSzdQZG8Ffj+2aTJXraSZvBZ8SMW3AbzaMv4e2AH78/j+ZP\nFn2A5kvBZ7QV8bRdtqEYzcu5tTTvfx9vnZz27WGaF5vCZ8l9t7oMzd8ufyPNb13HWyThyYdo3rsm\n3884zKX5CvC2ywS0pvlA8PMkAbztOBqe9/rynPbrNlSheY8yz9A8DnwWYRSSaV5vBp/ZN7VRA5p3\nAJ/N9AiepfkF4LOQnsJjNL8PL9HcNyswzPFZYI2Mt1l7emZCXQY+A66U4y251j15q8v2e+7Idjye\nWZu3k14Ab/n5ZhfeC94SCvPMSvtkNW/v9i7PHy+twWdf+lqWW4by1u2Nd75Nc1878uux/PhUa+OZ\n2Tc3juYN6/H9DPccnxmLmtO8SM1NNN8+nV/HWjTm7dokFKD5k3iC5r/gLJq/6rrQfOYlfP/vX8Rb\nkPMdP85LKvMZi6VX8DZZd8/syDngswvngd9+SgqfEfnzJj7b7sUy/Dg085yf1+EDmnf1tJ591yuf\nOCTQ/IMD19L88shZNP/Q2mTqbDgRERGRHEuLJREREZEAWiyJiIiIBNBiSURERCSAFksiIiIiATK1\nDYfT0jYfiqbwdkNFzwzeDuBTgH0zbobiTppXxnKad0zmbZEWUbyN8j14O+AevEpzX0suCdE034e8\nNC/h+Gy18uAzxZ42PqvuRdxP8x897cKnUngr4dGwp2num1VUAltp7pudlwu/0vxmjKX5Hs/xzIt9\nNO+0gM8UCw/nLb9PavKZfZ09s9XKgrcaffe7rx3ma9V9CN6+2e+ZofYz8tHcN7PMN4OplWemVdOp\nc2juzqTFElgeft1ZVPMimq92fObUbYPH0/z0G3+h+cXRvI3YAwNo/iUuoXlT8Fl4Gz1t3JsP8PO2\ndiSfgdUSk2hewfN4X4UKNPddVw95Jl35Ho8vp3Sn+Q/7i9L8xSjeWvXNiLwAG2n+sed64ruet0ic\nTPOCMYk0T1zKZ4SVrsbbZ6PRlubXO94armp8BuhWz+xCXxt0qfHnEd9143zw51nfbNDcnuvtVPBZ\nh3038+vGmQV+pvnvW/PTvEcl3jIu6Zkd+eABPrPPPPXmvR8VpvnVN/Lr2HRrqTaciIiISEZosSQi\nIiISQIslERERkQBaLImIiIgE0GJJREREJACvRPxH7j30fJosj6edVArf0nwRatLc1yrytZ98r/Z/\nMorPZjqASJr7Wk4vg7dFfO2DiZN5q6J4Cz7TrY7x27ln4nCav9GKD8d6DffQ3DfD7q2wO2jeYtp0\nmj/UhM9aemY3b8/dX5C3Kgas5vfLZ7Ob0vzdbrw1MwA9aL6qdkWazwSf2eSbofYW+PEZ4RlOdg0+\novkMNKK57zz33Y5vNpzPO57Zebc4PmOraW3eeouYzlswPaP4bLiNntlky1GZ5omIobnN5i2YSV1a\n8Bwtae6b1ehrjTVJ5m24y6L443RIbt7SXR7Gj8OhFD4b0XeeNHd89tZ14dfTvE/Kepr/hlw0bx82\nguYTovjx3A7ekgsDb5v+htz/6nZme2afbY4pSfOXPTMlf6nGZ8D52qC1dn5J8xmxDWl+Bg7SfDn4\nDModdi7NfdeBfOCPO1+b0nf++FrbvtlzG0vx89Y3y3VrpeI0X+Z5vEcjieZxkQk0L4wf+P5cw/NW\nntmLQfSTJREREZEAWiyJiIiIBNBiSURERCSAFksiIiIiAY67WDKz4WaWaGYrj8rym9lMM9tgZjPM\njM9SEBERETnFHXc2nJldBmA/gFHOuYqhrB+APc65fmb2IICznXMPHfP3nI05nOb2rm7DZ7Lc5Jn5\nNQm8zTF51M00d5U8s6h28u9zSRM+U2mWp20x3TMrx9dKuBRf0Hws+P7vSOFtiKfC+Ky3qY63wKZN\n5i0VdyE/PsXK8xbeYc96uj54K2oZqtLc187wtU764HGav4T7PF+Xt0t87cXJffjxT2kSRvO21YfQ\nfAUq0fxyzKb5F7iU5ks2X0bz70rxmX2jcSvNy2ENzQd62kClPDOY2oPPTBzteIuzsfF2ZIsVPI+6\ncBfN60Uk0Nw3M3G/8+TGZ+T52jq+2Y5D0Inm8xZdSfM3a/J24R3rx9DcMxINONuTe9hUfn27+Zm3\naJ7XeGvYdx3uj540L+d5fPVP4tvfGs1nMvrO27sPvEHzFyP57c8Eb6VVA5/Rdgj88T4bV9C8uGfG\n5dRF/HkqbG/a+agA4DkNAX75R57KP9L8m0je6vXdX4c93++rW3rR/PESD9Hc97y8dim//mMPj33n\n7e9P8f1cFMVvv95QPvPx/Du/oXkRT3turjXO+Gw459znQJqVQDMAI0MfjwRw7fFuR0RERORUlNHX\nLMU4546McU4EPG+CIiIiInKKO+E3pXTOOTOjP0tzk+L//qRsHKxc3Il+OREREZETtjfhG+xN4L+q\nO1ZGF0uJZlbIObfLzAoD2M02spbxGbx5ERERkcyTL+4i5Iu76K/Ptz3peW0hMv5ruCnAX/Mc2gHg\n77UvIiIicoo77k+WzGwcgHoACpjZdgCPA3gOwEQz6wBgK4BW9C//mTa6Gh/TTT/0vEb8TgyleeO2\nvGUzAu1pHlaJtxJ8s3Imer6lu/E6zQejM80rYiXNfa2cUmG8ndRlM58B90KprjTf0LI0zQvxHwJi\n7le83fNhdX58fDPFfPdvE0yjeVVPS2U6GtN8YhK/Xw7t4K2otpVG0vybx3iLJHwyn101ojqf1ZWA\nOJrnc/z+bRxen+YLN/GWYq6kn2geHx1P80WOz1Kc2/sqml/TtwvNPwU/H3xtvjd7dKN59wHP0fwm\njKP5YNxN8ykzbqT5kEa8nbcTsTT33V8TPI/3hUm1aO5rvX0E3k7FCh7f3uo1mg9fwe8X7OBxgWe2\n03xMTz678OIB82juu3+3HixO8+0RfHZbwWh+ndnjmXG2EPw4x0Qm0vzR3Xzm4A8FC9N8PcrQ3Hcd\n9s3Iu9ozkzFsNb9uPHI7bzG/epBft5P38HfhaR75Ic2fxmM0981S3O14uzbsfN6GviuFX8/hK9HX\neJLGd6bw7+u0Rmkb8wBwvY2nuW+m2+ktf6F5b/SleYqnFTiXpqmOu1hyzt3k+SPerRQRERHJQfQO\n3iIiIiIBtFgSERERCaDFkoiIiEgALZZEREREApzwm1IGubDdsjRZXvBXrZ8G/qr45Z7ZWw9NGUTz\nAs14K+Rs8FbRlfiU5r6ZYm0PjKL5p5G8PbTDM+znBxSh+SLwNtOtpXgrcBg60HzT8ItoftvtPWg+\npnoLmq9BOZp/lHQNzftH85lEY9GG5kXB76/H575Ac7vwV5q3qMTfH+NPnEHzfcbbc9Eted3I187z\n7X8S8tP8Xk+LpEOJV2j+GXh7rm4ibzO1KsjbIu4r3rbz3b95wWeHrVp/Mc0xMInG8wbwmXevJPI2\n0AMx/WjesNEUmvtm5DV3vD00rzt/nLYdxGeQdYzmj7uO096h+SNNePtpZavVNF8B/jj9ohKfdRhV\nKZnmFyXyN9b7rv85NP8K1Wn+Cu6hedcIfn52HMSPQ7duz9N8mudx5DvfeoGfDzsL8uunb6anT1JK\nAZr/vJW36n4oxfPI1vz877v0aZqfV209zZvH8nfhGT2Xzyh8qx6fcbkMlWl+rfHbL30ojuZLUY3m\na9fwGW3nHOLH883N/HmwfCnehvbN4DsNvNX+556zaL49mrc1fc/7QfSTJREREZEAWiyJiIiIBNBi\nSURERCSAFksiIiIiAbRYEhEREQlgzvmGvJzgDZs5LE972w0q8Vkzuz2zbMI8r35fsegSmuevvpPm\nyXuiaN4v5gGab0Fxmm8Hf3X9+8N4K6F6B95aWp7I2y5uT26arylfguaROEDzC5J52+LJqCdoPs7T\nVvPNQhp44D6ah4fzGUm1IhbS/JMJ19HcXcjbWz0r8XbJC1se53mJfzf7rAw20Dw/eNulX9KDND87\n+mea3+pG0zzF+KyifeCtvYOIoPle8BlMZR1vd040PhPtUnxB8/Fzb+N53eY0H2j30tw3G24tyv6r\n/SkFPkvRNyMyxfEC8PfGW05lwB9HvutDCU+Lx+d7Tyt2+gHeGns48lmaz/Ccz3MWNaH5MzV5K/Zz\n8PZiZSyn+fuemZ43YyzNpzm+P0turkvz8WP5eeVr1RXHNpr3WcCP25zafCbdQHSn+fme863/YN6C\nrNV5Ds2jPdeTOCTQ/P5BfIbgLd3epLlvxl8JfEvzmYv4ca5bk7fGamIRzS/HbJr7WtuHPDPaLsBG\nmr8D/jzbGJ/QfDFq0HxD0gU0/6NAPjjn6JOPfrIkIiIiEkCLJREREZEAWiyJiIiIBNBiSURERCSA\nFksiIiIiATJ1NtyQSm3TZA+n8FZCubA1NF+w9Aqaf1qTtyfuAZ9hdEXMLJr7Xi3/KHjr6k7wWVEt\nOvAZSUXwA83zxeyleYEY3pL4DHE07zJnOM1faMBnb+0FbwX6Zu4sB2/t7d/LW1o3xvKW04TJ7Wn+\ndGs+S26Ea0fzAVG9af5R8tU0/xWRNN+dVJDmF+VfRfO+xfn5UGXbApo/A96OafALb0deE/U+zS/D\n5zSfBf64KI4tNF9hfMaib0ZSScdbP+Pe4C3FGxvw+/3GlAk0n4SWNJ83l7e6Uurx1ozPSlSk+cKv\n+ay9c6rxGX8G3hYem8Lboz3D+tN8+Bzeymxa/z2a7+/KZ7rFDU+guW/G38U159Lc19p7GPz6XH/B\nlzS3ZH58NjVZTPODxluc74zhsyl9s8lGzbiL5o0bTab51NoNaL4RpWkeB37ceix6neY9O/Prg2/G\nWZcF/LrdsTafeYryPP4evMWZD7yN65vBt6Umb6OPcO1pXro3n6E54im+/aFDfKmxz/M8EhvDW+3P\n4yGadz3In/eTNxWiOc789+8CoJ8siYiIiATQYklEREQkgBZLIiIiIgG0WBIREREJcNzFkpkNN7NE\nM1t5VBZDNQTaAAAgAElEQVRvZjvMbFnov6sydzdFREREssdxZ8OZ2WUA9gMY5ZyrGMqeALDPOTcg\n4O+5Ru6DNPmv4LPPfC7wzOp6J+kWvn00337HwXNpvjW8OM2bhE2jeVNMpfmj256j+c3FRtL8UvAW\nlW8mzsfgba+LwVsnSzwtv2Wedttu8HZYPvDWnu9+XLGzMs2LxW6lua9t1BjTad7IzaD5IqtJ83G4\nieYxSKR5LvxGc/BxQZj3SiOav9WNzzB6FE/RfNf6kjRP2cBbYC9fcyfN56MOzfegAM27gM+c+tbx\nWYQPNX2Z5r2n8vbfUOvE92cnb3vdWoQ/Xka/wm9ndTd+3Mpv4zPdxhe7nua+WXLXYArNr8WHNO8J\n3ob7Fblo/iweoXlzcu0EgM0f8Zbf7mZ5aN4ZvL21AXw21iPoS/Mujp8nP750Hs1L9eCt0iHg96Ov\nHfnGZD6DMrbFJprfi4E077Wat6XmlufXyfqJCTS/J+ZVmvv2/2xPK23Rfj7bNLIbbyV/OZy3WT/y\nPC9UxgqaTwSfBZngaVv/OJHfvy/ewNudpY0//y70zKp7etozNG/emLdop4bz4zw1hbcd7/ac/3H4\njOYjrXPGZ8M55z4H6D3Onz1EREREcpATec1SVzNbYWbDzIyPOhcRERE5xWX0TSlfB9An9PFTAPoD\n6HDsRpvi/36juvxxFZA/jv8IWURERCQr7UrYgF0J/FeHx8rQYsk5t/vIx2b2FoCP2Hbnx/PXi4iI\niIhkp0JxF6BQ3N+v31vxJH+tMpDBX8OZ2dHvsX4dgJW+bUVEREROZelpw40DUA9AAQCJAJ4AEAeg\nMgAHYAuATs65xGP+nhvh0r7yPj/47LNx4LOWKnrWYRPQmuaJnlaXb9bP5CQ+k+jPx86iecvBfAZc\nL7xAc18by9f26utpx8wbxWdm1Wk7k+Z3YzDNfbPSfDPy6mA+zX3f1/N4kOaVpvEfdb7ZmLcaO3bi\nx7nP0F40983GKgPeivLNXKuWspTmP4WdTfOSm/nsvwolv6L56rjqNN84N5bmH7traH7fZ2/Q/OX6\nvCXXLeJNmluJwzT/an0Fmp/u/qR5pab8/p06lbdUmjzI2yg1+yXQ/C3cQXNfiy0/fqL5k0lP0Lxz\nNH+8+FpOy8Bbn508syN93t/MH0cLS/HW6kJXi+bdRvH7N+yKAzT/LrYozfuDz2ocuP5hmmMXj++s\nx1uT+8Fbe+8M6kjzft3uoflKXETzsYvSvBoEAHBXzZf+1f5cgoU097W6rgVvL/7maUH6THA30nyp\n8fOhNr6g+ZhkPltzQhQ/n29LfJvmb8fcRvN2O0fRHFvPpPFdl/Lj/8YTvO3YsQ+fkVfTLaJ5OeOz\nZQt5ZrPOweU072DjvG244/4azjnHHs18CqCIiIhIDqN38BYREREJoMWSiIiISAAtlkREREQCaLEk\nIiIiEuC4bbgM37CZu8kNS5PPSOGztMLC+EycOCTQfDt4m6MlJtF8JXi7Jx7xND/v+z00r1V4Ds2X\ntKtL846j+Kv6fS2/ruvfonnJMqtp3g389veCv6l6/wO87fJi5P00/wi8jRWBgzT3zZJb7vhsoyUJ\n9Wj+SVwczZvWmU3zuxbwtsVK8DdCPez5d0IRfE9zXyvw3p289XN7bNpzHwA+8rTbzrTfad7c07Kp\nhq9p3jmZz/B6/qyHaN5tCm9RNW42meafdrmW5tNfi6P5B8a33+xK0fx6e4/mvtl2vcfy8ZTN2oyn\neVmso/lC8JbZyhR+/nQM48etJL6l+WxP+2bixLY0f6TV4zS/Gh/TfKC7l+bvjua3P68tb2U6zxSr\noZ6ZbtXA26Mp4DMNey3gs9Weqd2D5vuQl+Y+vq8bf+BJmj8VyWca+lpsjcBnU/qeXwp42t9DwVur\npT2zQScl89b2pCg+69DXbk5EDM0rYznNt6I4zSt4nr9eRVea58U+mp/h/qB5extB82Fp3/saAFDQ\nM+szAvz2D+IMmp/QbDgRERGR/2daLImIiIgE0GJJREREJIAWSyIiIiIBtFgSERERCZCpbbgtLu2c\nthLr+avWbynD2yW+V9HP8rRLmuEjmg9Y35vmz5XpRvOHVvCW2W0X8RlSw6/sQvMzxiXTvGU0b+1F\ng7fwimMbzZ8+yNscrSIm0tzXIlyKajS/xnM8xybzmVZXRn1K85fAZwCtQ1man+FpMcS9xmcDhaXw\nNiVq8rhQTd5aSpxSgua9m/HzZyxupvkVmEVzX5vGN4MsDPz7CsMhmvvuX1+LpCt4O+kyN4/m99/C\nz//CY/jxHIjuNPftp6/9tBX8ftnszqf5l6/H0Xx85+Y0H+w603xeaz6TsdfEPjSfhiY0/xW5aR7j\nafE8jL40vx8v0vxa9yHNn23I97PGrASaF/YMe/vV0w77zfN9fbmtDs1ji/HrWCcMofkXnllsn+xs\nTPPXYu+m+R+IoPkm8Famr0UV7Wm37fbMJPVdx2pgMc1vWM/bjgvL8FmEtRbwFlvd2vw67NtP3/m5\nO/kcmjeJ4rNNfcdt1E989l905E6aF4jgz4NlsZbvD6bSvLqnrXkudtC8iO1VG05EREQkI7RYEhER\nEQmgxZKIiIhIAC2WRERERAJosSQiIiISIFPbcNe6MWnyczxtr3cP3kDzWhELaT59BZ+Vk6s4bytU\ni+KztHyzzHwzca53fHbVY9fzlkrbSbzlsQ5laP4E+AwjX5upCH6geRKiaf49itC8AlbRfPzBG2k+\nJILPiup0kH+/d0e8TvMZaEjzUo63q94N562Quin8OOTGrzRfg3I0rwnetrsUX9A8Crzt+AruoXmy\nZ2bfPZ5WWo+x/Lh1b/MczX1tnTvAZw5u8bTMam/mLZJXSvJWy923jKB53BjemhmFW2ney9P2GpPc\njuan87sL4KcJlhTkM7wGg7eomji+/13tFZr7Wk6+WZDtMYLmr3v2ZxN4++/z33n7bF9u3jbqd/ht\nmk9EK5r7zv+vwGfM+b7fUtjM9wcP0PxeDKT5QU+7bZVnRptv9pnvuvcObqH5XkTRPA5zae6bVTcG\nbWjuaxfuXMDv9ydq85mPvu9rG4rRvBl4m7JiMr8fW0dNoHldfE5z3/XW9zxbCSto/gF4m3XFLv6A\nP9w8kua9F/F289P2rNpwIiIiIhmhxZKIiIhIAC2WRERERAJosSQiIiISIHCxZGZFzewzM1ttZqvM\nrFsoz29mM81sg5nNMDP+qlURERGRU1xgG87MCgEo5JxbbmZ5ACwFcC2A2wDscc71M7MHAZztnHvo\nmL/rPnWXpbnNvniEfq3zsYnmvtk6vlfRH0I4zWctvYbmN1fjLaFqnpkyn7ireN71OpoPfrU9zR86\n8DzNR0W2pXlnvEZz32yy+jsTaJ4nH5+1lzfyF5r72j3lPDN6HGiRAM9tfoLmFs5nnDUrxmfnTZnP\n23l96vSi+QHH2xDPPcBbh7aNPx5aTEzb7ASAP3AGzX0z4FqCf1++vAi+p3kez8zEzZ62VHmspnkd\nzKf5i7if5h0wjObdJw2leYuW/Lg9jGf5/iTzNs2FUetp7mtv+dp2fVc/TfNV5fmMMN+Mtlz4nebj\nN7enOXh5CGEdDtC8ZAxvje1HHpq3x0iaF3dbaJ5ivKX1M/LT3NcOWze4Cs1f7MxnZU5Aa5ovXlGP\n5lbgN5o3jeUz1GYl85mhF0XxVteSOXVp/kQD3jJr5/hxLtmat3EnTGxG84/RlOajdraneY1YXvv0\ntQ6TPa29iz3X8/lI+1wN+NuLvtzXwl6JijR/P5E/b7qlvBWY/0re7vzud97ya517PM2n7ODXjdPO\nQ8bacM65Xc655aGP9wNYCyAWQDPgr0fnSKQuoERERERynHS/ZsnMigOoAmARgBjn3JFx2YkAYv7z\nPRMRERE5CfDfWR0j9Cu4SQC6O+f2mf39UyrnnDMz+ruL0fHb/vr4orgoVIrTS5tEREQk+yUsTP0v\nPY67WDKz05G6UBrtnPsgFCeaWSHn3C4zKwxgN/u7t8bz3yOKiIiIZKe4Wqn/HdGHv2E8gOO34QzA\nMABrnHNH38wUAEfmD7QD8MGxf1dEREQkJzjeT5ZqA7gFwDdmtiyUPQzgOQATzawDgK0Ar6SwJtvv\nOJN+ofbgs4rCcJjm/dGT5omel0/FVuNtu69RleZXYBbNf7GzaB5WJYXmAzwznipE/ruZRLsT+fe1\nL4a3Y4rH8hbM5i18dlLYabzdM7cQbyVUjOAtjN2e41+rJJ+dtLBLfZrnHsxbMEjkcXFspXmCxdG8\nUT8+C8k3i2oHzqX5mZ5W1Kue2XBvuLto/k3nmjSv+voCmkd7Ziz6WjC+GWQ1F3xD82m1m/Dbd/z2\n3e28Bbm+JZ+BeMVB/viaEdWI5nPAW07rcQHNfTO2ipbfQPPFqEHzmp72kO94rirFH183PTKO5r7r\nz4WetumA5B40LxzF21h3vT+K5g+3eJzmT696hua9bQDNS3fmM7xGe9qI7TytvSX5atF8ahF+HjZt\nO4fm3UbxlrHv8du8AX8eeTKJt3dz5eezJrGfx796zsMDnlZjh1jezva1UJ/3zNSrBj4LdQj49Wd7\nUlGaH9qal+b5K/NW2uVhs2num2lYNGY7zds0GUtzXzu+dSRvvSUciKN56aL8+Que1h5wnMWSc24+\n/D99uiLo74qIiIjkBHoHbxEREZEAWiyJiIiIBNBiSURERCSAFksiIiIiAQJnw53QDZu5eJf2lfrL\nUJlunw97ab4OZWneA7yd4WvJLdnMZ98ML9WG5rdP5O0VVOJxszL81fhFwV/tvwG8JeSb9dMKE2ne\nE/1pPn9pQ5oXrsZn+lQGb7XkBm9/tAFvK/wC3ha8bRo/nvUaf0rzO4y3QnxtiLWe82SeZ+bRZ9P4\nbKaXmvC2yBTw2YK+lo2vjTIhkc/GalFwMs1rg7fhejR/neb1p0yl+fwkfhzKRPOZa2/hDpp/jKtp\n/uSM52j+aqMO/+p2lnuuDz8OP4/ml9z+Gc33gbd48npm6kXgIM3fRnua1wWfYVcL6XyHu+PwzdLa\nnVKQ5j+u5cenTQXeopqwjc+UfLsYb7F9Aj4Tc8Lk9jTv2GIQzfeCvzFxVc8szt+Ri+a7XCGazwBv\nU27pVI7mi4ZexHPwdmpjTKP5g64fzX813oY76JkpeT3eo7mvrVkLX9L8rsG8dfhq59tpvhL8OLyx\nk7e5H47lMxPLgF9P6iGB5k/jMZr7ngfH4SaaLxzagOZ/tOYt3bZRw2k+0dpnbDaciIiIyP87LZZE\nREREAmixJCIiIhJAiyURERGRAFosiYiIiATI1DacDUk71+2sdny412/7eeuhVTRvgVXHVzS/AHz2\nU3fPzK+8jrdjvo6tQ/Ordr5P809GXUdzO4cf3/eb8HZJs+UzaQ5PfH+vp2g+YGlvmpestprm+fAz\nzbeDt2wKeGaTrdvJW2k3xPL70Tfb6GXcS/MRB9vTvFUEv/1JKS1p3v20l2n+xPu81RJej58nh2bz\n1tWiVrxdUhK8jfgsHqG5zyzHpw3VN94OW4pqNE/4qjHNw5MO8S98Jj+fD48Mo/mTw/n962s/xSOe\n5l+P5I/Hm9rxVstniKP5rtklaW5L+ff12gO30bzz3BE0b1yPtxoLeoYaFnQ/0vyFDnx2G3iJDVac\nz9B02/i/h89p8B3ND6fw7Uudxs/bxTXr0bznoqdp3j+cz7az73hrCfv5LNEzC/1E8zuj3qT5oAUP\n0jzlPH7eFiu6juY1PLMCJ/XjMz2juu+i+b69/Lrhfj+d5h2L8fbrsETeNs2Vh8/WLBPJvy9fe9f3\nOGoAfp158eD9NC8evpXmLcMm0TwaSTR/9QCfuflAJL9uf+Ca03xpb94OxrOmNpyIiIhIRmixJCIi\nIhJAiyURERGRAFosiYiIiATQYklEREQkQKa24R5yaRsdPyE/3b4RZtD8FXSl+by+V/IvXIHHlzTj\nr94PB2/9JHzqaQlN5ds/M4jPpDvD8ZlTvT57lea1Gsyh+QjPjKrvPG21m8BnsdXFPJr/Cj7DqA7m\n07zfQd5yqhbBW4q+GXnhSKF5gqeFcTU+prlvdlIuz2y7z5Pq0vzPYXy2XXTPHTSfEMZnvfnO80Pg\n7ZulqE7zMeCzCxNnlKB5l0Yv0Nx3/H/z3O/xm/mst6KlNtJ829wLaV6pHp9d9cXBS2neIYK3297d\nzNtGg0rdSfMwz+M6DLw1ttJz4YjwzCLsP/RRmnfvyI/boA68jXXj8Ldp3t6NoPkXxo9bn6XP0nxA\nNT7bazYup3nCgTianx+5ieYL9vOW4h15eCtt3AQ+m6xkK97S/fbN8jSvcOcSmp/hmfFXxtOSvtfT\nkr5kPZ+V2aUMf3xVdnz7jt+8Q/ORlVrR3NdaHXmwHc2vjuDXQ18rPD4xnuZxMfz5MQkFaB7jaXde\n4JkNlwg+y++TA7wV3iqSt5s/BX/e33uAzxyMOJOfD4+extua9502RG04ERERkYzQYklEREQkgBZL\nIiIiIgG0WBIREREJELhYMrOiZvaZma02s1Vm1i2Ux5vZDjNbFvqPv0pLRERE5BQX2IYzs0IACjnn\nlptZHgBLAVwLoBWAfc65AQF/113qZqXJG2A23X4lKtI8L/bT3NdS+R6Fae5r232Aa2leE4tovsaV\no/luK0jzwvie5r52hm8/78NLNM/jOT4LRzWgeVzb6TSfM7cpzevU40PpeoG3QiaCtzzygs9WW4Sa\nNM/tabF9Obw+zfO320nzW8J4G2WCZz9993sUkmm+ALwNdJqn5bdpPZ8Zd0OZUTT3zUjaDX6+VfXM\neHo6mc8KrBHFW0VLD/BWToFIPhNwBhrR/GHwltaj4DMNq8zgs6sKNdxC88RXeCvwzHZ8dljEmfy6\nUSxiG81952GKp9WYD3tpPnNCM5pPbc0fpx3wFs19MxN95+ck8NmIvlaRr+VUw/O42IgLaH4O+My7\nOJdA847z+OO0ez3eLjwXvJ36uefxOGXajTQf0qQtzRuAt5I7YBjNvwWfOdgUU2k+Ffx6ew5209z3\nfFcZy2nuO2/PBJ8Zt8TTJm6OD2gejydpfh744+h28JZrl21DaX53sVdoXgsLaf4xrqZ5Wayl+Vrw\nGaYTrb23DRdO/0aIc24XgF2hj/eb2VoAsaE/9kw+FBEREck50v2aJTMrDqAKgCNvnNLVzFaY2TAz\n429yICIiInKKC/zJ0hGhX8G9B6B76CdMrwPoE/rjpwD0B9Dh2L/3XfzIvz6OiquEqLjKJ7zDIiIi\nIidqd8Ja7E7gv/o/1nEXS2Z2OoBJAN5xzn0AAM653Uf9+VsAPmJ/97x4/q6jIiIiItmpYFxZFIz7\n+/VLa5780Lvt8dpwBmAYgDXOuYFH5Ue/ivo6ACszurMiIiIiJ7PjteHqAJgH4BsARzZ8BMBNACqH\nsi0AOjnnEo/5u+5F1znNbfZazWei3Vyetz8K4weav7D6MZrnLc5bGB0ieYthYL+HaZ6rE28htYya\nTPM4JNDcN7PM1wLzzRSrh7k0/w25aF7SfUvzF75OO68PAEpVW0VzX/ugjGcG0BrwtmA0eIvqUnxB\nc1/bZTR4e2UHzqX5Hzid5nfjDZrfMJbPWmrYZgrNfW2Re5Nepnnb6NE097U4P5lxHc2rNFpA80hP\nC2ak57iVS15D8/pRCTT3zd7ytUs2DqpE82e69aD5WMdn4a1682Ka+2aEVQOfUdgSk2i+D3lpflvS\nCJr/vv1smt9QmbcafS3gczyPi5/Bb79rEm8J3RbNZ8zV81yXvgCfMeebBeZrez0E3la7E7zlFIkD\nNPe1eq/EpzT3tfmSPNdPXxvrd8/1sxT4LLxNKE1zX6u6DcbQ/Mkxz9M8rDpv0Rr48/RzZbrR3Hf/\n+q63v4DPxOzbh89Qq/84b/ld45ndOQ430XzJVD6j8+mmfNbqY5++SPNDH3t+ScYPD5qWfo/m061l\nhttw88F/+sT75yIiIiI5jN7BW0RERCSAFksiIiIiAbRYEhEREQmgxZKIiIhIgHS9KWXGb/xQmuzi\n8vPotuXAWznbUZTmT5TnLbYUz/qvsOOtOt+bHvzen7cqruiTdt4dALT9/l2aDyjCWz+tMJF/XZxJ\n8xloSPM/EEHzyZ/dTPPnGvB6wNfgs8AWg7eQfC2V0z0zjB4aMIjmg8sfpvmhhfzU/Da+FM0reWYk\nzcHlNG8xkncUJrdrTPOn8CjN71nEWzZuD58GNGxSF5ojjrddKrXlM7k2HChD88K5+SzC82vy/FAT\nfpzXxPOZa2VnbKV5eHneZnq8G3+czkU9mo+2W2ge1ZHPPis5dxfNN1TgM8s2R59P8wVLr6D5VdXe\np/lb0fzxlYRomldx/Pys3ZrP8ss/js86rBG9mOYXO94KvLk63/8uS/lsx/Gb2/PbL/U5zReiFs2L\neGZidsZgmv8MPgTC9/j1zearB/780ncab3VF1uNtxDyRfJZlcnIUzTtF8fafr82d60o+u9Cm8evA\nh2359X8z+Pk8ZSdv50XE8utzAuJo3umxgTR/o8d9NF/yFG9/l43kM9pGNuUzOm9LHEFzx79dvDTo\nLprvNX5/NcE0mgc11/STJREREZEAWiyJiIiIBNBiSURERCSAFksiIiIiAbRYEhEREQkQOBvuhG7Y\nzPV196bJP8dldPu84O2Dip66WgwSab4MVWi+AnxGVVPHZ9xMQgua7zDezrsUfFZXIgrR/Ffkprmv\n5eHLfTPpLvfMotoA3hL6CNfQ/Bp89K/2Z6+n1XKZ422aa2bydmH4iLRNSgDoNbYPzX2zh3yz7Xzt\nj4LYTfPV66vT/IUy99B8MNLORQSAYa4DzYfanTSPAm+BfYyraV4U22m+x/GW1uYZFWn+yZW8rXbF\nFn6eh63hM622NI3h24O3IPviEZq/sbk7zV8tdQfNfS2hbShGcwfeXvRdNzb8dBHN78zPW59jk/n5\n2fes3jR/7NenaJ438heat8dImm92vD1aznj7eAFq03xOYgOaD43h5+0uz3VvHS6k+cgtvM10W4nX\naJ6A+jQ/Hxtp/jZup3nFg/z5pWIEz33XkxfX81mlt5R5k+YtwGeMRnhmL/qeN/slPkDzl2J4W20V\nKtDc1+K8HPz6vNqVp/ku4zMuz3C8hTc+nD+Obkz5hua+dnxxbKV5DfD26ECkXZsAwLdWwTsbTj9Z\nEhEREQmgxZKIiIhIAC2WRERERAJosSQiIiISQIslERERkQCZ2oZr5UakycPAWzO+2XDnYgfNb9/5\nNs1rx86nua9tt9zTdhmKf9dOKoAkmvtedV/Q0+bzvXq/+U7eSpscex3NW2zms2/ql+J5uOd+KeyZ\n8bTc0zrcjzw0r4JlNL8Hr9K8kOMzv6r8wmdpVY5aQfPnwdsivrbU7SvG0fy+Sn1p/noyb/HcEMVn\nBY7e2Y7mr8by9twY8Flpz4C3qHwzuT5Ac5r/5mll5sKvNH9oKW973VBtFM0vA29B/oEzaH7QM+vQ\n1+7s57l/fefh9O285dql6Is0P83zuBifwtttXcNeobmvxfMA+tG8XCK/Hv456yya976Zzy707f9z\niXxmX+48/H7vFclnyY0EP58re2Y1+mbAXeG5f3tve57mbxa7jeZrUZbmi8FnlvlakNHgM+OqeL6v\nQSl85mZ0GL+dSM/jK7/neWRhMp/BNzqqLc3now7N82EvzX0tv6tWzKX5uZV8rUN+vzScwZ+Xn23I\nW66fGJ/R+UEKn3nXOIxPdVuezJ/fq0Xx55H51khtOBEREZGMyJLF0u4EPnFYcob9CXyVLjnD5gT+\n013JGdwC/tM/yRm2J3yb3buQI2TRYmldVnwZySZaLOVs3ybszO5dkEzkvtBiKSfbocXSf0K/hhMR\nEREJoMWSiIiISIBMbcNlyg2LiIiIZAJfGy7TFksiIiIiOYF+DSciIiISQIslERERkQBaLImIiIgE\n0GJJREREJIAWSyIiIiIBtFgSERERCaDFkoiIiEgALZZEREREAmixJCIiIhJAiyURERGRAFosiYiI\niATQYklEREQkgBZLIiIiIgG0WBIREREJoMWSiIiISAAtlkREREQCaLEkIiIiEkCLJREREZEAWiyJ\niIiIBNBiSURERCSAFksiIiIiAbRYEhEREQmgxZKIiIhIAC2WRERERAJosSQiIiISQIslERERkQBa\nLImIiIgE0GJJREREJIAWSyIiIiIBtFgSERERCaDFkoiIiEgALZZEREREAmixJCIiIhJAiyURERGR\nAFosiYiIiATQYklEREQkgBZLIiIiIgG0WBIREREJoMWSiIiISAAtlkREREQCaLEkIiIiEkCLJRER\nEZEAWiyJiIiIBNBiSURERCSAFksiIiIiAbRYEhEREQmgxZKIiIhIAC2WRERERAJosSQiIiISQIsl\nERERkQBaLImIiIgE0GJJREREJIAWSyIiIiIBtFgSERERCaDFkoiIiEgALZZEREREAmixJCIiIhJA\niyURERGRAFosiYiIiATQYklEREQkgBZLIiIiIgG0WBIREREJoMWSiIiISAAtlkREREQCaLEkIiIi\nEkCLJREREZEAWiyJiIiIBNBiSURERCSAFksiIiIiAbRYEhEREQmgxZKIiIhIAC2WRERERAJosSQi\nIiISQIslERERkQBaLImIiIgE0GJJREREJIAWSyIiIiIBtFgSERERCaDFkoiIiEgALZZEREREAmix\nJCIiIhJAiyURERGRAOGZdcNm5jLrtkVERET+a845Y3mmLZZSxR/1JU4nX/LYzPc5y473d0/09o/3\n9Y53ex5H7oYwz00cffPH2+bYP0/PNuFk2/R+nczal4zsE8sysk++//+bffnH3wn9GyE85R//Py3s\nUOqnp6d+Hnbkz4/6OCw8tM2Rz08L/R9HbYsjWWhbpByT//PPg7f5N9vyr/dv9imz9z+cfp1/s///\n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\nJMD/ADuXR3FORZJCAAAAAElFTkSuQmCC\n", 826 | "text/plain": [ 827 | "" 828 | ] 829 | }, 830 | "metadata": {}, 831 | "output_type": "display_data" 832 | } 833 | ], 834 | "source": [ 835 | "fig = plt.figure(figsize=(10,10))\n", 836 | "ax = fig.add_subplot(111)\n", 837 | "fig.colorbar(cax, orientation=\"horizontal\")\n", 838 | "cax = ax.matshow(arr, interpolation='none')\n" 839 | ] 840 | }, 841 | { 842 | "cell_type": "code", 843 | "execution_count": 230, 844 | "metadata": { 845 | "collapsed": false 846 | }, 847 | "outputs": [ 848 | { 849 | "data": { 850 | "image/png": "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\n", 851 | "text/plain": [ 852 | "" 853 | ] 854 | }, 855 | "metadata": {}, 856 | "output_type": "display_data" 857 | } 858 | ], 859 | "source": [ 860 | "_ = plt.hist(arr.tolist(), bins=20)" 861 | ] 862 | } 863 | ], 864 | "metadata": { 865 | "kernelspec": { 866 | "display_name": "Python 2", 867 | "language": "python", 868 | "name": "python2" 869 | }, 870 | "language_info": { 871 | "codemirror_mode": { 872 | "name": "ipython", 873 | "version": 2 874 | }, 875 | "file_extension": ".py", 876 | "mimetype": "text/x-python", 877 | "name": "python", 878 | "nbconvert_exporter": "python", 879 | "pygments_lexer": "ipython2", 880 | "version": "2.7.6" 881 | } 882 | }, 883 | "nbformat": 4, 884 | "nbformat_minor": 0 885 | } 886 | --------------------------------------------------------------------------------