class DataMining::KNearestNeighbor

k-Nearest Neighbor Classifier

Public Class Methods

new(training_data, k) click to toggle source

Find nearest neighbors class

Arguments:

training_data: (array of arrays, like [[:c1, value], [:c2, value] .. ])
k: (integer)
# File lib/data_mining/knn.rb, line 9
def initialize(training_data, k)
  @data = training_data.map { |i, v| DataMining::Point.new(i, v) }
  @k    = k
end

Public Instance Methods

classify(point) click to toggle source
# File lib/data_mining/knn.rb, line 14
def classify(point)
  count_classes(k_nearest_points(point)).max_by { |_, v| v }.first
end

Private Instance Methods

count_classes(points) click to toggle source
# File lib/data_mining/knn.rb, line 20
def count_classes(points)
  points.each_with_object(Hash.new(0)) do |p, o|
    o[p.id] += 1
  end
end
k_nearest_points(point) click to toggle source
# File lib/data_mining/knn.rb, line 26
def k_nearest_points(point)
  @data.sort_by do |item|
    euclidean_distance(item, DataMining::Point.new(point[0], point[1]))
  end.take(@k)
end