How to teach R to copy your handwriting?
Hey. Welcome guys to whysrijit. This is the place, where we ask more whys to become wise.
Today we learn how to Make R learn your Handwriting?
We will demonstrate this by a simple example. But, before that let’s try to understand, let’s try to understand the process and then proceed towards the nitty-gritty.
- Your Sample Handwriting / Drawing — The Data for R algos.
- The Algorithm
- The Animation
Your Sample Handwriting / Drawing
Before jumping directly into the process, let’s try to understand the data, we need.
We don’t need the drawing / or handwriting pixels only. We need the way it is drawn.
More formally you need the sequence of the (x,y) coordinates that are drawn by your hand.
How, to get that? This was my most time-consuming part. You can get it here from this site. (You are welcome :p)
Let’s take an example. Let’s say, I want to draw a circle. I get the sequence of the clicks of my data from the above site. Save it to R and start working.
Now, you have the data and you have errors naturally, and there marches in Statistics. You can see the error in the data I collected. But don’t worry, the data is collected in a sequential form (as mentioned) in the data.
Now, you want to draw a circle through it like the following.
But, how do we draw the circle? That is where spline regression comes in.
But, regression is for estimating a function, but here it is not a function. Fuck!
Don’t worry. Mathematics is there. What is the definition of a curve?
A curve in 2 D is a function f: [0,1] →R², where f(t) = (a(t), b(t)).
Now, we are trying to estimate f(t), which is not a function from R →R.
So, here we will instead estimate a(t) and b(t) individually like the following.
The X coordinate estimation
The Y coordinate estimation
Now, we know how to estimate a function f: R →R by spline regression right?
Let’s move into the codes.
The Codes and the Animation
seq = 1:length(Data$x)
data = data.frame(seq,data$x,data$y)
x = data[,c(1,2)]
y = data[,c(1,3)]xfit <- gam(x ~ s(seq, bs="cr") , data=x)
#General Additive Model Regression using Cubic Splines
t = seq(1,length(x[,1]), length.out = 1000)
xpred = predict(xfit, data.frame(seq = t))yfit <- gam(y ~ s(seq, bs="cr") , data=y)
t = seq(1,length(y[,1]), length.out = 1000)
ypred = predict(yfit, data.frame(seq = t))newdata = data.frame(t,xpred,ypred)anim <-
ggplot(s_newdata, aes(xpred, ypred)) +
geom_path(size = 1, colour = "red")+
geom_point(colour = "blue", size = 2) +
labs(title = 'Drawing my Circle')+
animate(anim, nframes = 30, type="cairo")
Thanks for stopping by.
©Srijit Mukherjee 2020