All Downloads are FREE. Search and download functionalities are using the official Maven repository.

fregata.metrics.classification.AreaUnderRoc.scala Maven / Gradle / Ivy

The newest version!
package fregata.metrics.classification

import java.util.Random
import fregata._

/**
 * Created by takun on 16/6/1.
 */
object AreaUnderRoc {

  def of(it:Iterable[(Num, Num)]):Double = {

    val rs = it.toArray
    val rd = new Random(System.currentTimeMillis())

    for(i <-0 until rs.length){
      rs(i) = (rs(i)._1 + rd.nextFloat()*0.00001f, rs(i)._2)
    }

    scala.util.Sorting.quickSort(rs)(scala.math.Ordering.by[(Double, Double), Double](_._1))

    if(rs(0)._1 == rs(rs.length-1)._1){
      return 0.5;
    }


    val ranks = new Array[Double](rs.length);
    var M:Long = 0;
    var c = 0;

    for(i <- 0 until rs.length){
      ranks(i) = i+1;
      if(rs(i)._2==1.0f){
        M += 1;
      }
    }

    if(M==ranks.length||M==0){
      return 0.5;
    }

    var sum:Double = ranks(0);

    c = 1;
    var s = -1;
    for(i <- 1 until rs.length){
      if(rs(i-1)._1==rs(i)._1){
        if(s == -1){
          s = i-1;
        }
        sum += ranks(i);
        c += 1;
      }else if(c>1){
        for(j <- s until (s+c)){
          ranks(j) = sum / c;
        }
        c = 1;
        s = -1;
        sum = ranks(i);
      }else{
        sum = ranks(i);
      }
    }
    var pRankNum:Double = 0.0;
    for(i <- 0 until ranks.length){
      if(rs(i)._2 == 1.0f){
        pRankNum += ranks(i);
      }
    }

    pRankNum -= M*(M+1)/2

    return pRankNum/(M*(ranks.length-M))
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy