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
    
    
    
    
    

Reply via email to