Hi ,
I have implemented KNN in nim. as of now I am storing the distance for a test
point from each train point which I wont keep in future as this is memory
consuming. I am new to NIM. I am mor eof R and python guy and have faced
serious issues with static typing.
Just want to understand what you guys think about the code.
Below is code
import csvtools
import times,macros
var fileName = "mtcars.csv"
type
mtcars = object
mpg : float64
cyl : float64
disp : float64
hp : int
drat : float64
wt : float64
qsec : float64
vs : int
am : int
gear : int
carb : int
const cols : seq[string] =
@["mpg","cyl","disp","hp","drat","wt","qsec","vs","am","gear","carb"]
echo cols
macro dif :stmt =
result = newStmtList()
var str : string
for col in cols:
str = "result." & col & "=x." & col & "-y." & col
result.add parseStmt(str)
macro sqrm :stmt =
result = newStmtList()
var str : string
for col in cols:
str = "result." & col & "=x." & col & "*x." & col
result.add parseStmt(str)
macro difsqrsmm :stmt =
result = newStmtList()
var str : string
for col in cols:
str = "result=result + float(x." & col & ")"
result.add parseStmt(str)
echo result.repr
proc `-` (x:mtcars,y: mtcars): mtcars =
dif()
proc sqr (x:mtcars): mtcars =
sqrm()
proc difsqrsm (x:mtcars): float =
difsqrsmm()
proc distance (x:mtcars,y: mtcars): float =
var dif = x - y
dif = sqr(dif)
result = difsqrsm(dif)
var
mtrw : seq[mtcars] = @[]
for mtcar in csv[mtcars](fileName, skipHeader = true):
#echo mtcar
for i in 1..100_000:
mtrw.add(mtcar)
echo mtrw.high
var test = mtrw[0..31]
var train = mtrw[32..mtrw.high]
mtrw = @[]
var dist : float
var k : int
k = 5
var eknn : seq[float]
var knn : seq[seq[float]] = @[]
let t0 = epochTime()
for tst in test:
eknn = @[]
for trn in train:
dist = distance(tst, trn)
eknn.add(dist)
#echo eknn
knn.add(eknn)
echo epochTime() - t0
#echo knn