class AdaBoost::WeakLearner
Public Class Methods
new(y_index)
click to toggle source
# File lib/adaboost/weak_learner.rb, line 5 def initialize(y_index) @y_index = y_index @analyzer = FeaturesAnalyzer.new(y_index) @classifiers_cache = [] end
Public Instance Methods
features_satistics(samples)
click to toggle source
# File lib/adaboost/weak_learner.rb, line 11 def features_satistics(samples) @analyzer.analyze(samples).statistics end
generate_weak_classifier(samples, weights)
click to toggle source
# File lib/adaboost/weak_learner.rb, line 15 def generate_weak_classifier(samples, weights) number_of_samples = samples.size if number_of_samples < 1 raise ArgumentError.new('At least one sample is needed to generate.') end number_of_features = @y_index sample_size = samples[0].size if number_of_features < 1 or sample_size < 2 or sample_size <= @y_index raise ArgumentError.new('At least 1 feature is needed to generate.') end classifiers = [] if Config::USE_RANDOM_WEAK_CLASSIFIERS classifiers = generate_random_classifiers(samples, number_of_features) else classifiers = generate_all_possible_classifiers(samples, number_of_features) end best_index = -1 best_error = Float::MAX classifiers.each_with_index do |classifier, i| classifier.error = 0.0 samples.each_with_index do |sample, j| y = sample[@y_index] if classifier.classify(sample).to_f != y classifier.increase_error(weights[j]) end end if classifier.error < best_error best_error = classifier.error best_index = i end end best = classifiers[best_index] if !Config::USE_RANDOM_WEAK_CLASSIFIERS classifiers.delete_at(best_index) end best end
Private Instance Methods
generate_all_possible_classifiers(samples, number_of_features)
click to toggle source
# File lib/adaboost/weak_learner.rb, line 67 def generate_all_possible_classifiers(samples, number_of_features) if @classifiers_cache.size == 0 matrix = [] 0.upto(number_of_features - 1) do matrix << [] end samples.each do |sample| 0.upto(number_of_features - 1) do |i| sample_value = sample[i] matrix[i] << sample_value end end matrix.each_with_index do |entry, i| entry = entry.uniq entry.each do |uniq_value| @classifiers_cache << WeakClassifier.new(i, uniq_value) end end end @classifiers_cache end
generate_random_classifiers(samples, number_of_features)
click to toggle source
# File lib/adaboost/weak_learner.rb, line 55 def generate_random_classifiers(samples, number_of_features) classifiers = [] statistics = features_satistics(samples) 0.upto(Config::NUMBER_OF_RANDOM_CLASSIFIERS - 1) do feature_number = rand(number_of_features) info = statistics[feature_number] split = rand * info.rng + info.min classifiers << WeakClassifier.new(feature_number, split) end classifiers end