summaryrefslogtreecommitdiff
path: root/lib/classification.rb
blob: 020294079045037022bba1219c2c41b5759a511a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
module OpenTox
  module Algorithm
    
    class Classification

      def self.weighted_majority_vote compound, params
        neighbors = params[:neighbors]
        weighted_sum = {}
        sim_sum = 0.0
        confidence = 0.0
        neighbors.each do |row|
          sim = row["tanimoto"]
          row["features"][params[:prediction_feature_id].to_s].each do |act|
            weighted_sum[act] ||= 0
            weighted_sum[act] += sim
          end
        end
        case weighted_sum.size
        when 1
          return {:value => weighted_sum.keys.first, :confidence => weighted_sum.values.first/neighbors.size.abs}
        when 2
          sim_sum = weighted_sum[weighted_sum.keys[0]]
          sim_sum -= weighted_sum[weighted_sum.keys[1]]
          sim_sum > 0 ? prediction = weighted_sum.keys[0] : prediction = weighted_sum.keys[1] 
          confidence = (sim_sum/neighbors.size).abs 
          return {:value => prediction,:confidence => confidence}
        else
          bad_request_error "Cannot predict more than 2 classes, multinomial classifications is not yet implemented. Received classes were: '#{weighted.sum.keys}'"
        end
      end
    end
  end
end