summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Maunz <andreas@maunz.de>2011-07-19 16:28:12 +0200
committerAndreas Maunz <andreas@maunz.de>2011-07-19 16:28:12 +0200
commit5a86ca682633dc6865729a75be0046dff2460684 (patch)
treee9c913a565878159e42a93df19bbba8b0c06a06e
parentc6261ec85b8cf8d7c80b4718a927adeade1a127b (diff)
parent5d74d060687cb374269aa152c829ba28fbccf506 (diff)
Merge branch 'reg_conf' into development
-rw-r--r--lib/algorithm.rb54
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