diff options
author | Andreas Maunz <andreas@maunz.de> | 2011-07-19 16:28:12 +0200 |
---|---|---|
committer | Andreas Maunz <andreas@maunz.de> | 2011-07-19 16:28:12 +0200 |
commit | 5a86ca682633dc6865729a75be0046dff2460684 (patch) | |
tree | e9c913a565878159e42a93df19bbba8b0c06a06e | |
parent | c6261ec85b8cf8d7c80b4718a927adeade1a127b (diff) | |
parent | 5d74d060687cb374269aa152c829ba28fbccf506 (diff) |
Merge branch 'reg_conf' into development
-rw-r--r-- | lib/algorithm.rb | 54 |
1 files changed, 45 insertions, 9 deletions
diff --git a/lib/algorithm.rb b/lib/algorithm.rb index 34c80ab..cfca069 100644 --- a/lib/algorithm.rb +++ b/lib/algorithm.rb @@ -205,21 +205,17 @@ module OpenTox raise "No neighbors found." unless params[:neighbors].size>0 begin - props = params[:prop_kernel] ? get_props(params) : nil acts = params[:neighbors].collect { |n| act = n[:activity].to_f } sims = params[:neighbors].collect { |n| Algorithm.gauss(n[:similarity]) } - LOGGER.debug "Local MLR (Propositionalization / GSL)." prediction = mlr( {:n_prop => props[0], :q_prop => props[1], :sims => sims, :acts => acts} ) transformer = eval "OpenTox::Algorithm::Transform::#{params[:transform]["class"]}.new ([#{prediction}], #{params[:transform]["offset"]})" prediction = transformer.values[0] LOGGER.debug "Prediction is: '" + prediction.to_s + "'." - sims = params[:neighbors].collect{ |n| Algorithm.gauss(n[:similarity]) } # similarity values btwn q and nbors - conf = sims.inject{|sum,x| sum + x } - confidence = conf/params[:neighbors].size if params[:neighbors].size > 0 + params[:conf_stdev] = "false" if params[:conf_stdev].nil? + confidence = get_confidence({:sims => sims, :acts => acts, :neighbors => params[:neighbors], :conf_stdev => params[:conf_stdev]}) {:prediction => prediction, :confidence => confidence} - rescue Exception => e LOGGER.debug "#{e.class}: #{e.message}" end @@ -326,8 +322,8 @@ module OpenTox transformer = eval "OpenTox::Algorithm::Transform::#{params[:transform]["class"]}.new ([#{prediction}], #{params[:transform]["offset"]})" prediction = transformer.values[0] LOGGER.debug "Prediction is: '" + prediction.to_s + "'." - conf = sims.inject{|sum,x| sum + x } - confidence = conf/params[:neighbors].size + params[:conf_stdev] = "false" if params[:conf_stdev].nil? + confidence = get_confidence({:sims => sims, :acts => acts, :neighbors => params[:neighbors], :conf_stdev => params[:conf_stdev]}) {:prediction => prediction, :confidence => confidence} rescue Exception => e LOGGER.debug "#{e.class}: #{e.message}" @@ -492,6 +488,29 @@ module OpenTox prediction end + # Get confidence for regression, with standard deviation of neighbor activity if conf_stdev is set. + # @param[Hash] Required keys: :sims, :acts, :neighbors, :conf_stdev + # @return[Float] Confidence + def self.get_confidence(params) + if params[:conf_stdev] == "true" + sim_median = Algorithm.median(params[:sims]) + if sim_median.nil? + confidence = nil + else + standard_deviation = params[:acts].std_dev + confidence = (sim_median*Math.exp(-1*standard_deviation)).abs + if confidence.nan? + confidence = nil + end + end + else + conf = params[:sims].inject{|sum,x| sum + x } + confidence = conf/params[:neighbors].size + end + LOGGER.debug "Confidence is: '" + confidence.to_s + "'." + return confidence + end + # Get X and Y size of a nested Array (Matrix) def self.get_sizes(matrix) begin @@ -819,7 +838,24 @@ module OpenTox } max end - + + # Adds variance, mean and standard deviation calculation to Array class + module Variance + def sum(&blk) + map(&blk).inject { |sum, element| sum + element } + end + def mean + (sum.to_f / size.to_f) + end + def variance + m = mean + sum { |i| ( i - m )**2 } / (size-1).to_f + end + def std_dev + Math.sqrt(variance) + end + end + Array.send :include, Variance end end |