Книга: Программирование на языке Ruby

5.25. Вычисление среднего, медианы и моды набора данных

5.25. Вычисление среднего, медианы и моды набора данных

Пусть дан массив x, вычислим среднее значение по всем элементам массива. На самом деле есть три общеупотребительные разновидности среднего значения. Среднее арифметическое — это то, что мы называем средним в обыденной жизни. Среднее гармоническое — это число элементов, поделенное на сумму обратных к ним. И, наконец, среднее геометрическое — это корень n-ой степени из произведения n значений. Вот эти определения, воплощенные в коде:

def mean(x)
 sum=0
 x.each {|v| sum += v}
 sum/x.size
end
def hmean(x)
 sum=0
 x.each {|v| sum += (1.0/v)}
 x.size/sum
end
def gmean(x)
 prod=1.0
 x.each {|v| prod *= v}
 prod**(1.0/x.size)
end
data = [1.1, 2.3, 3.3, 1.2, 4.5, 2.1, 6.6]
am = mean(data)  # 3.014285714
hm = hmean(data) # 2.101997946
gm = gmean(data) # 2.508411474

Медианой набора данных называется значение, которое оказывается приблизительно в середине отсортированного набора (ниже приведен код для вычисления медианы). Примерно половина элементов набора меньше медианы, а другая половина — больше. Ясно, что такая статистика показательна не для всякого набора.

def median(x)
 sorted = x.sort
 mid = x.size/2
 sorted[mid]
end
data = [7,7,7,4,4,5,4,5,7,2,2,3,3,7,3,4]
puts median(data) # 4

Мода набора данных — это наиболее часто встречающееся в нем значение. Если такое значение единственно, набор называется унимодальным, в противном случае — мультимодальным. Мультимодальные наборы более сложны, здесь мы их рассматривать не будем. Интересующийся читатель может обобщить и улучшить приведенный ниже код:

def mode(x)
 f = {}   # Таблица частот.
 fmax = 0 # Максимальная частота.
 m = nil  # Мода.
 x.each do |v|
  f[v] ||= 0
  f[v] += 1
  fmax,m = f[v], v if f[v] > fmax
 end
 return m
end
data = [7,7,7,4,4,5,4,5,7,2,2,3,3,7,3,4]
puts mode(data) # 7

Оглавление книги

Оглавление статьи/книги

Генерация: 1.383. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз