Программирование на языке Ruby
Программирование на языке Ruby читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
def atan2_d(y,x) Math.atan2(у,x)/Math::RAD2DEGenddef atan2_g(y,x) Math.atan2(y, x)/Math::RAD2GRADend5.23. Неэлементарная тригонометрия
В ранних версиях Ruby не было функций
arcsinarccossinhcoshtanhMath5.24. Вычисление логарифмов по произвольному основанию
Чаще всего мы пользуемся натуральными логарифмами (по основанию е, часто натуральный логарифм обозначается как ln), иногда также десятичными (по основанию 10). Эти функции реализованы в методах
Math.logMath.log10В информатике, а в особенности в таких ее областях, как кодирование и теория информации, обычно применяются логарифмы по основанию 2. Например, так вычисляется минимальное число битов, необходимых для представления числа. Определим функцию с именем
log2def log2(x) Math.log(x)/Math.log(2)endЯсно, что обратной к ней является функция
2**xln xMath::Е**xMath.exp(x)Эта идея обобщается на любое основание. В том маловероятном случае, если вам понадобится логарифм по основанию 7, можно поступить так:
def log7(x) Math.log(x)/Math.log(7)endНа практике знаменатель нужно вычислить один раз и сохранить в виде константы.
5.25. Вычисление среднего, медианы и моды набора данных
Пусть дан массив x, вычислим среднее значение по всем элементам массива. На самом деле есть три общеупотребительные разновидности среднего значения. Среднее арифметическое — это то, что мы называем средним в обыденной жизни. Среднее гармоническое — это число элементов, поделенное на сумму обратных к ним. И, наконец, среднее геометрическое — это корень n-ой степени из произведения n значений. Вот эти определения, воплощенные в коде:
def mean(x) sum=0 x.each {|v| sum += v} sum/x.sizeenddef hmean(x) sum=0 x.each {|v| sum += (1.0/v)} x.size/sumenddef gmean(x) prod=1.0 x.each {|v| prod *= v} prod**(1.0/x.size)enddata = [1.1, 2.3, 3.3, 1.2, 4.5, 2.1, 6.6]am = mean(data) # 3.014285714hm = hmean(data) # 2.101997946gm = gmean(data) # 2.508411474Медианой набора данных называется значение, которое оказывается приблизительно в середине отсортированного набора (ниже приведен код для вычисления медианы). Примерно половина элементов набора меньше медианы, а другая половина — больше. Ясно, что такая статистика показательна не для всякого набора.
def median(x) sorted = x.sort mid = x.size/2 sorted[mid]enddata = [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 menddata = [7,7,7,4,4,5,4,5,7,2,2,3,3,7,3,4]puts mode(data) # 75.26. Дисперсия и стандартное отклонение
Дисперсия — это мера «разброса» значений из набора. (Здесь мы не различаем смещенные и несмещенные оценки.) Стандартное отклонение, которое обычно обозначается буквой σ, равно квадратному корню из дисперсии.
Data = [2, 3, 2, 2, 3, 4, 5, 5, 4, 3, 4, 1, 2]def variance(x) m = mean(x) sum = 0.0 x.each {|v| sum += (v-m)**2 } sum/x.sizeenddef sigma(x) Math.sqrt(variance(x))endputs variance(data) # 1.461538462puts sigma(data) # 1.20894105Отметим, что функция
variancemean5.27. Вычисление коэффициента корреляции
Коэффициент корреляции — одна из самых простых и полезных статистических мер. Он измеряет «линейность» набора, состоящего из пар (x, у), и изменяется от -1.0 (полная отрицательная корреляция) до +1.0 (полная положительная корреляция).
