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
|