├── 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 | 
6 | 
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 | 
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": "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\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 |
--------------------------------------------------------------------------------