---
title: "Distance for NN"
author: "Juan Carlos Zambrano"
date: "Jul 04, 2016"
output:
  html_document:
    fig_height: 5
    fig_width: 7
    highlight: tango
    theme: readable
---

### Read:

Let''s load the required packages and read the data:

```{r, message = FALSE, warning = FALSE}
library(readr, quietly = TRUE)
library(dplyr, quietly = TRUE)
set.seed(2825)
train <- read_csv("../input/train.csv", progress = FALSE)
train <- mutate(train, hr24 = (time / 60) %% 24)
train$place_id <- as.character(train$place_id)
train$weekday = as.integer((train$time / (60 * 24)) %% 7)
train$month = as.integer((train$time / (60 * 24 * 30)) %% 12)
train$year = as.integer(train$time / (60 * 24 * 365))
train$day = as.integer((train$time / (60 * 24)) %% 365)
```

### Sample:

Let''s get a sample:

```{r}
delta.x <- 0.01
delta.y <- 0.01

GenerarTrainSmall <- function(tRain) {
    left_x <- as.numeric(sample(0:98, 1)) / 10
    up_y <- as.numeric(sample(0:98, 1)) / 10
    return(subset(tRain, x >= left_x & x <= (left_x + 0.2) & y >= up_y & y <= (up_y + 0.2)))
}

train_small <- GenerarTrainSmall(train)
#train_sample <- train_small[sample(nrow(train_small), trunc(nrow(train_small) * as.numeric(8) / 10)),]
train_sample <- train_small[train_small$time < 625000,]

test_sample <- filter(train_small, !(row_id %in% train_sample$row_id) & (place_id %in% unique(train_sample$place_id)))
test_sample <- mutate(test_sample, place_id = NULL)
test_sample <- filter(test_sample, x < (max(x) - delta.x) & x > (min(x) + delta.x) & y < (max(y) - delta.y) & y > (min(y) + delta.y))
remove(train)
print(paste("# place id:",length(unique(train_sample$place_id))))
print(paste("# train_small:",nrow(train_small),"train_sample",nrow(train_sample),"test_sample",nrow(test_sample)))
```


### Get distance:

In this matrix rows are test events and columns are train events

```{r}

factor_y = 50 
factor_x = 30 
factor_month = 0.5 
factor_time =2e-06  
factor_hr24 = 0.2 
factor_weekday = 0.3 
factor_accuracy = 2e-04 
factor_day = 0.0001 

Distancia2FB <- function(tEst, tRain) {    
	distancia <- (factor_y * (tEst$y[1] - tRain$y)) ^ 2 +
	(factor_x * (tEst$x[1] - tRain$x)) ^ 2 +
	(factor_hr24 * (pmin(abs(tEst$hr24[1] - tRain$hr24), (24 - abs(tEst$hr24[1] - tRain$hr24))))) ^ 2 +
	(factor_day * (pmin(abs(tEst$day[1] - tRain$day), (365 - abs(tEst$day[1] - tRain$day))))) ^ 2 +
	(factor_weekday * (pmin((abs(tEst$weekday[1] - tRain$weekday)), (7 - abs(tEst$weekday[1] - tRain$weekday))))) ^ 2 +
	(factor_month * (pmin((abs(tEst$month[1] - tRain$month)), (30 - abs(tEst$month[1] - tRain$month))))) ^ 2 +
	(factor_time * abs(tEst$time[1] - tRain$time)) ^ 2 +
	(factor_accuracy * (tEst$accuracy[1] - tRain$accuracy)) ^ 2
	return(distancia)
}

DistanciaMatFB <- function(tEst, tRain) {
	m = matrix(nrow=nrow(tEst),ncol=nrow(tRain))
	sapply(1:nrow(tEst), function(i) {
		m[i,] <<- Distancia2FB(tEst[i,], tRain)
	})
	rownames(m) <- tEst$row_id
	colnames(m) <- tRain$place_id
	return(m)
}

distance_matrix <- DistanciaMatFB(test_sample,train_sample)
dim(distance_matrix)
distance_matrix[1:3,1:3]
```

In this way, We can get a distance value that represent the true distance between 23:59 and 00:01.

My best wish of success for you.

Thanks for reading!