library(data.table)
expit <- function(x)
{
y <- 1/(1+exp(-x))
return(y)
}
train <- function(X, Y, m=100, num_iterations=2000,
learning_rate=1e-2)
{
n = dim(X)[1]
p = dim(X)[2]
sigma = .1;
alpha = matrix(rnorm(p*m)*sigma, nrow=p)
beta = matrix(rnorm(m)*sigma, nrow=m)
for(i in 1:num_iterations)
{
layer_0 = X
layer_1 = expit(layer_0%*%alpha )
layer_2 = expit(layer_1%*%beta)
layer_2_err = layer_2 - Y
layer_2_delta = layer_2_err*layer_2*(1-layer_2)
layer_1_err = layer_2_delta%*%t(beta)
layer_1_delta = layer_1_err*layer_1*(1-layer_1)
beta = beta - learning_rate*t(layer_1)%*%layer_2_delta
alpha = alpha - learning_rate*t(layer_0)%*%layer_1_delta
}
model = list(beta,alpha)
return(model)
}
accuracy <- function(p, y)
{
return(mean((p > 0.5) == (y == 1)))
}
getAccuracy <- function(model,X,Y)
{
beta = model[[1]]
alpha = model[[2]]
layer_1 = expit(X%*%alpha)
layer_2 = expit(layer_1%*%beta)
return(accuracy(layer_2, Y))
}
library(data.table)
load_digits <- function(subset=NULL, normalize=TRUE) {
df <- fread("digits.csv")
df <- as.matrix(df)
if (length(subset)>0) {
c <- dim(df)[2]
l_col <- df[,c]
index = NULL
for (i in 1:length(subset)){
number = subset[i]
index = c(index,which(l_col == number))
}
sort(index)
df = df[index,]
}
digits = df[,-1]
labels = df[,c]
if (normalize == TRUE) {
digits = digits - min(digits)
digits = digits/max(digits)}
for (i in 1:length(subset)) {
labels[labels == subset[i]] = i-1
}
return(list(digits, labels))
}
split_samples <- function(digits,labels) {
num_samples <- dim(digits)[1]
num_training <- round(num_samples*0.7)
indices = sample(1:num_samples, size = num_samples)
training_idx <- indices[1:num_training]
testing_idx <- indices[-(1:num_training)]
return (list(digits[training_idx,], labels[training_idx],
digits[testing_idx,], labels[testing_idx]))
}
result = load_digits(subset=c(3, 5), normalize=TRUE)
digits = result[[1]]
labels = result[[2]]
result = split_samples(digits,labels)
training_digits = result[[1]]
training_labels = result[[2]]
testing_digits = result[[3]]
testing_labels = result[[4]]
length(training_digits)
length(testing_digits)
model1 = train(training_digits, training_labels)
trainingaccuracy = getAccuracy(model1, training_digits, training_labels)
testingaccuracy = getAccuracy(model1, testing_digits, testing_labels)