Category: Математика

24
Окт
2020

Как найти два числа, если известно их НОД и НОК?

Входные данные
В первой строке дано натуральное число
A
— НОД некоторых двух натуральных чисел(
1

A

10000
).
Во второй строке дано натуральное число
B
— НОК некоторых двух натуральных чисел(
1

B

10000
).
Выходные данные
Выведите дв…

23
Окт
2020

Как получить число s из суммы последовательности элементов n не импортируя библиотеки с комбинаторики

у меня есть n чисел и число s которое надо получить складывая любые элементы последовательности из n чисел с друг другом , как подсчитать сколько таких сумм равных s существует в последовательности из n чисел.
Вот мой вариант кода
n , s =…

23
Окт
2020

Как получить число s из суммы последовательности элементов n не импортируя библиотеки с комбинаторики

у меня есть n чисел и число s которое надо получить складывая любые элементы последовательности из n чисел с друг другом , как подсчитать сколько таких сумм равных s существует в последовательности из n чисел.
Вот мой вариант кода
n , s =…

23
Окт
2020

Как получить число s из суммы последовательности элементов n не импортируя библиотеки с комбинаторики

у меня есть n чисел и число s которое надо получить складывая любые элементы последовательности из n чисел с друг другом , как подсчитать сколько таких сумм равных s существует в последовательности из n чисел.
Вот мой вариант кода
n , s =…

09
Окт
2020

Прошедшая в форме вебинара онлайн-лекция была посвящена комбинаторике. Просмотрев ее, вы усвоите важные для изучения других разделов математики понятия, а для закрепления теоретической базы научитесь решать комбинаторные задачи.

Благодаря обучению в онлайн-формате, наш курс позволит освоить математические основы науки об анализе данных всем желающим. Опытные преподаватели проводят занятия по вторниками и субботам в 19:00 (по Москве). Первая лекция уже доступна на YouTube, доступ к полному курсу можно получить по записи.

Учебная программа подойдет не только новичкам в IT, но и действующим профессионалам, которые хотят подтянуть математическую подготовку. Продолжительность обучения — 5 месяцев, а программа ориентируется на требования для поступления в школу анализа данных Яндекса. Стоимость — от 5 350 руб. в месяц. Набор слушателей продолжается до 10 октября.

08
Окт
2020

У меня задание сделать код js для высчитывания примера, ниже мой код

в нем ошибка ибо мне не выдаёт значение в (document.write),на код с временем можно не смотреть, он рабочий, буду признателен помощи)

<HTML>
<HEAD>
<TITLE>1</TITLE>
<noscript>
Ваш браузер не поддерживае…

07
Окт
2020

Нейронные сети не так уж сложно реализовать, если знать, как моделируется каждый нейрон, что такое функция потери и алгоритм обратного распространения ошибки (backpropagation). Статья также демонстрирует обучение нейронной сети.

Статья публикуется в переводе, автор оригинального текста Victor Zhou.

***

Пишем нейросеть на Python с нуля

Термин “нейронные сети” сейчас можно услышать из каждого утюга, и многие верят, будто это что-то очень сложное. На самом деле нейронные сети совсем не такие сложные, как может показаться! Мы разберемся, как они работают, реализовав одну сеть с нуля на Python.

Эта статья предназначена для полных новичков, не имеющих никакого опыта в машинном обучении. Поехали!

1. Составные элементы: нейроны

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

Внутри нейрона происходят три операции. Сначала значения входов умножаются на веса:

x1→x1∗w1, x2→x2∗w2

Затем взвешенные входы складываются, и к ним прибавляется значение порога b:

x1∗w1+x2∗w2+b

Наконец, полученная сумма проходит через функцию активации:

уу=f(x1∗w1+x2∗w2+b)

Функция активации преобразует неограниченные значения входов в выход, имеющий ясную и предсказуемую форму. Одна из часто используемых функций активации – сигмоида:

Сигмоида
Сигмоида

Сигмоида выдает результаты в интервале (0, 1). Можно представить, что она «упаковывает» интервал от минус бесконечности до плюс бесконечности в (0, 1): большие отрицательные числа превращаются в числа, близкие к 0, а большие положительные – к 1.

Простой пример

Допустим, наш двухвходовой нейрон использует сигмоидную функцию активации и имеет следующие параметры:

w=[0,1] b=4

w=[0, 1] – это всего лишь запись w1=0, w2=1 в векторном виде. Теперь зададим нашему нейрону входные данные: x=[2, 3]. Мы используем скалярное произведение векторов, чтобы записать формулу в сжатом виде:

(w⋅x)+b=((w1∗x1)+(w2∗x2))+b=0∗2+1∗3+4=7
y=f(w⋅x+b)=f(7)=0.999

Наш нейрон выдал 0.999 при входах x=[2, 3]. Вот и все! Процесс передачи значений входов дальше, чтобы получить выход, называется прямой связью (feed forward).

Пишем код для нейрона

Настало время написать свой нейрон! Мы используем NumPy, популярную и мощную расчетную библиотеку для Python, которая поможет нам с вычислениями:

        import numpy as np

def sigmoid(x):
  # Наша функция активации: f(x) = 1 / (1 + e^(-x))
  return 1 / (1 + np.exp(-x))

class Neuron:
  def __init__(self, weights, bias):
    self.weights = weights
    self.bias = bias

  def feedforward(self, inputs):
    # Умножаем входы на веса, прибавляем порог, затем используем функцию активации
    total = np.dot(self.weights, inputs) + self.bias
    return sigmoid(total)

weights = np.array([0, 1]) # w1 = 0, w2 = 1
bias = 4                   # b = 4
n = Neuron(weights, bias)

x = np.array([2, 3])       # x1 = 2, x2 = 3
print(n.feedforward(x))    # 0.9990889488055994
    

Узнаете эти числа? Это тот самый пример, который мы только что рассчитали! И мы получили тот же результат – 0.999.

2. Собираем нейронную сеть из нейронов

Нейронная сеть – это всего лишь несколько нейронов, соединенных вместе. Вот как может выглядеть простая нейронная сеть:

У этой сети два входа, скрытый слой с двумя нейронами (h1 и h2) и выходной слой с одним нейроном (o1). Обратите внимание, что входы для o1 – это выходы из h1 и h2. Именно это создает из нейронов сеть.

Замечание
Скрытый слой – это любой слой между входным (первым) слоем сети и выходным (последним). Скрытых слоев может быть много!

Пример: прямая связь

Давайте используем сеть, изображенную выше, и будем считать, что все нейроны имеют одинаковые веса w=[0, 1], одинаковые пороговые значения b=0, и одинаковую функцию активации – сигмоиду. Пусть h1, h2 и o1 обозначают выходные значения соответствующих нейронов.

Что получится, если мы подадим на вход x=[2, 3]?

h1=h2=f(w⋅x+b)=f((0∗2)+(1∗3)+0)=f(3)=0.9526o1=f(w⋅[h1,h2]+b)=f((0∗h1)+(1∗h2)+0)=f(0.9526)=0.7216

Если подать на вход нашей нейронной сети x=[2, 3], на выходе получится 0.7216. Достаточно просто, не правда ли?

Нейронная сеть может иметь любое количество слоев, и в этих слоях может быть любое количество нейронов. Основная идея остается той же: передавайте входные данные по нейронам сети, пока не получите выходные значения. Для простоты мы будем использовать сеть, показанную выше, до конца статьи.

Пишем код нейронной сети

Давайте реализуем прямую связь для нашей нейронной сети. Напомним, как она выглядит:

        import numpy as np

# ... вставьте сюда код из предыдущего раздела

class OurNeuralNetwork:
  '''
  Нейронная сеть с:
    - 2 входами
    - скрытым слоем с 2 нейронами (h1, h2)
    - выходным слоем с 1 нейроном (o1)
  Все нейроны имеют одинаковые веса и пороги:
    - w = [0, 1]
    - b = 0
  '''
  def __init__(self):
    weights = np.array([0, 1])
    bias = 0

    # Используем класс Neuron из предыдущего раздела
    self.h1 = Neuron(weights, bias)
    self.h2 = Neuron(weights, bias)
    self.o1 = Neuron(weights, bias)

  def feedforward(self, x):
    out_h1 = self.h1.feedforward(x)
    out_h2 = self.h2.feedforward(x)

    # Входы для o1 - это выходы h1 и h2
    out_o1 = self.o1.feedforward(np.array([out_h1, out_h2]))

    return out_o1

network = OurNeuralNetwork()
x = np.array([2, 3])
print(network.feedforward(x)) # 0.7216325609518421
    

Мы снова получили 0.7216! Похоже, наша сеть работает.

3. Обучаем нейронную сеть (часть 1)

Допустим, у нас есть следующие измерения:

Имя Вес (в фунтах) Рост (в дюймах) Пол
Алиса 133 (54.4 кг) 65 (165,1 см) Ж
Боб 160 (65,44 кг) 72 (183 см) М
Чарли 152 (62.2 кг) 70 (178 см) М
Диана 120 (49 кг) 60 (152 см) Ж

Давайте обучим нашу нейронную сеть предсказывать пол человека по его росту и весу.

Мы будем представлять мужской пол как 0, женский – как 1, а также сдвинем данные, чтобы их было проще использовать:

Имя Вес (минус 135) Рост (минус 66) Пол
Алиса -2 -1 1
Боб 25 6 0
Чарли 17 4 0
Диана -15 -6 1
Замечание
Я выбрал величину сдвигов (135 и 66), чтобы числа выглядели попроще. Обычно сдвигают на среднее значение.

Потери

Прежде чем обучать нашу нейронную сеть, нам нужно как-то измерить, насколько “хорошо” она работает, чтобы она смогла работать “лучше”. Это измерение и есть потери (loss).

Мы используем для расчета потерь среднюю квадратичную ошибку (mean squared error, MSE):

MSE=1n∑i=1n(ytrue−ypred)2

Давайте рассмотрим все используемые переменные:

  • n – это количество измерений, в нашем случае 4 (Алиса, Боб, Чарли и Диана).
  • y представляет предсказываемое значение, Пол.
  • ytrue – истинное значение переменной (“правильный ответ”). Например, для Алисы ytrue будет равна 1 (женский пол).
  • ypred – предсказанное значение переменной. Это то, что выдаст наша нейронная сеть.

(ytrue-ypred)2 называется квадратичной ошибкой. Наша функция потерь просто берет среднее значение всех квадратичных ошибок – поэтому она и называется средней квадратичной ошибкой. Чем лучшими будут наши предсказания, тем меньшими будут наши потери!

Лучшие предсказания = меньшие потери.

Обучение нейронной сети = минимизация ее потерь.

Пример расчета потерь

Предположим, что наша сеть всегда возвращает 0 – иными словами, она уверена, что все люди мужчины. Насколько велики будут наши потери?

Имя ytrue ypred (ytrue-ypred)2
Алиса 1 0 1
Боб 0 0 0
Чарли 0 0 0
Диана 1 0 1
MSE=14(1+0+0+1)=0.5

Пишем функцию средней квадратичной ошибки

Вот небольшой кусок кода, который рассчитает наши потери. Если вы не понимаете, почему он работает, прочитайте в руководстве NumPy про операции с массивами.

        import numpy as np

def mse_loss(y_true, y_pred):
  # y_true и y_pred - массивы numpy одинаковой длины.
  return ((y_true - y_pred) ** 2).mean()

y_true = np.array([1, 0, 0, 1])
y_pred = np.array([0, 0, 0, 0])

print(mse_loss(y_true, y_pred)) # 0.5
    

Отлично. Идем дальше!

4. Обучаем нейронную сеть (часть 2)

Теперь у нас есть четкая цель: минимизировать потери нейронной сети. Мы знаем, что можем изменять веса и пороги нейронов, чтобы изменить ее предсказания, но как нам делать это таким образом, чтобы минимизировать потери?

Внимание: математика!
Этот раздел использует частные производные по нескольким переменным. Если вы плохо знакомы с дифференциальным исчислением, можете просто пропускать математические формулы.

Для простоты давайте представим, что в нашем наборе данных только одна Алиса.

Имя Вес (минус 135) Рост (минус 66) Пол
Алиса -2 -1 1

Тогда средняя квадратичная ошибка будет квадратичной ошибкой только для Алисы:

MSE=11∑i=11(ytrue−ypred)2=(ytrue−ypred)2=(1−ypred)2

Другой метод – это рассматривать функцию потерь как функцию от весов и порогов. Давайте отметим все веса и пороги нашей нейронной сети:

Теперь мы можем записать функцию потерь как функцию от нескольких переменных:

L(w1,w2,w3,w4,w5,w6,b1,b2,b3)

Предположим, мы хотим отрегулировать w1. Как изменится значение потери L при изменении w1? На этот вопрос может ответить частная производная dL/dw1. Как мы ее рассчитаем?

Не падайте духом!
Здесь математика становится более сложной. Возьмите бумагу и ручку, чтобы не отставать – это поможет вам понять, что происходит.

Прежде всего, давайте перепишем эту частную производную через dypred/dw1, воспользовавшись цепным правилом:

∂L∂w1=∂L∂ypred∗∂ypred∂w1

Мы можем рассчитать dL/dypred, поскольку мы уже выяснили выше, что L=(1-ypred)2:

∂L∂ypred=∂(1−ypred)2∂ypred=−2(1−ypred)

Теперь давайте решим, что делать с dypred/dw1. Обозначая выходы нейронов, как прежде, h1, h2 и o1, получаем:

ypred=o1=f(w5h1+w6h2+b3)

Вспомните, что f() – это наша функция активации, сигмоида. Поскольку w1 влияет только на h1 (но не на h2), мы можем снова использовать цепное правило и записать:

∂ypred∂w1=∂ypred∂h1∗∂h1∂w1∂ypred∂h1=w5∗f′(w5h1+w6h2+b3)

Мы можем сделать то же самое для dh1/dw1, снова применяя цепное правило:

h1=f(w1x1+w2x2+b1)∂h1∂w1=x1∗f′(w1x1+w2x2+b1)

В этой формуле x1 – это вес, а x2 – рост. Вот уже второй раз мы встречаем f'(x) – производную сигмоидной функции! Давайте вычислим ее:

f(x)=11+e−xf′(x)=e−x(1+e−x)2=f(x)∗(1−f(x))

Мы используем эту красивую форму для f'(x) позже. На этом мы закончили! Мы сумели разложить dL/dw1 на несколько частей, которые мы можем рассчитать:

∂L∂w1=∂L∂ypred∗∂ypred∂h1∗∂h1∂w1

Такой метод расчета частных производных “от конца к началу” называется методом обратного распространения (backpropagation).

Уффф. Здесь было очень много символов, так что не страшно, если вы пока не все понимаете. Давайте покажем, как это работает, на практическом примере!

Пример. Считаем частную производную

Мы по-прежнему считаем, что наш набор данных состоит из одной Алисы:

Имя Вес (минус 135) Рост (минус 66) Пол
Алиса -2 -1 1

Давайте инициализируем все веса как 1, а все пороги как 0. Если мы выполним прямой проход по нейронной сети, то получим:

h1=f(w1x1+w2x2+b1)=f(−2+(−1)+0)=0.0474h2=f(w3x1+w4x2+b2)=0.0474o1=f(w5h1+w6h2+b3)=f(0.0474+0.0474+0)=0.524

Наша сеть выдает ypred=0.524, что находится примерно на полпути между Мужским полом (0) и Женским (1). Давайте рассчитаем dL/dw1:

∂L∂w1=∂L∂ypred∗∂ypred∂h1∗∂h1∂w1∂L∂ypred=−2(1−ypred)=−2(1−0.524)=−0.952∂ypred∂h1=w5∗f′(w5h1+w6h2+b3)=1∗f′(0.0474+0.0474+0)=f(0.948)(1−f(0.948))=0.249∂h1∂w1=x1∗f′(w1x1+w2x2+b1)=−2∗f′(−2+(−1)+0)=−2∗f(−3)∗(1−f(−3))=−0.0904∂L∂w1=−0.952∗0.249∗−0.0904=0.0214
Напоминаем:
Ранее мы получили формулу для производной сигмоиды f'(x)=f(x)(1-f(x))

Вот и все! Результат говорит нам, что при увеличении w1, функция ошибки чуть-чуть повышается.

Обучение: стохастический градиентный спуск

Теперь у нас есть все нужные инструменты для обучения нейронной сети! Мы используем алгоритм оптимизации под названием стохастический градиентный спуск (stochastic gradient descent), который определит, как мы будем изменять наши веса и пороги для минимизации потерь. Фактически, он заключается в следующей формуле обновления:

константаназываемаяскоростьюобученияw1←w1−η∂L∂w1η(eta) −константа, называемая скоростью обучения (learning rate).

Скорость обучения определяет, как быстро наша сеть учится. Все, что мы делаем – это вычитаем eta*dL/dw1 из w1:

  • Если dL/dw1 положительна, w1 уменьшится, что уменьшит L.
  • Если dL/dw1 отрицательна, w1 увеличится, что также уменьшит L.

Если мы сделаем то же самое для каждого веса и порога в сети, потери будут постепенно уменьшаться, и наша сеть будет выдавать более точные результаты.

Процесс обучения сети будет выглядеть примерно так:

  1. Выбираем одно наблюдение из набора данных. Именно то, что мы работаем только с одним наблюдением, делает наш градиентный спуск стохастическим.
  2. Считаем все частные производные функции потерь по всем весам и порогам (dL/dw1, dL/dw2и т.д.)
  3. Используем формулу обновления, чтобы обновить значения каждого веса и порога.
  4. Снова переходим к шагу 1.

Пишем код всей нейронной сети

Наконец настало время реализовать всю нейронную сеть.

Имя Вес (минус 135) Рост (минус 66) Пол
Алиса -2 -1 1
Боб 25 6 0
Чарли 17 4 0
Диана -15 -6
        import numpy as np

def sigmoid(x):
  # Сигмоидная функция активации: f(x) = 1 / (1 + e^(-x))
  return 1 / (1 + np.exp(-x))

def deriv_sigmoid(x):
  # Производная сигмоиды: f'(x) = f(x) * (1 - f(x))
  fx = sigmoid(x)
  return fx * (1 - fx)

def mse_loss(y_true, y_pred):
  # y_true и y_pred - массивы numpy одинаковой длины.
  return ((y_true - y_pred) ** 2).mean()

class OurNeuralNetwork:
  '''
  Нейронная сеть с:
    - 2 входами
    - скрытым слоем с 2 нейронами (h1, h2)
    - выходной слой с 1 нейроном (o1)

  *** DISCLAIMER ***:
  Следующий код простой и обучающий, но НЕ оптимальный.
  Код реальных нейронных сетей совсем на него не похож. НЕ копируйте его! 
  Изучайте и запускайте его, чтобы понять, как работает эта нейронная сеть.
  '''
  def __init__(self):
    # Веса
    self.w1 = np.random.normal()
    self.w2 = np.random.normal()
    self.w3 = np.random.normal()
    self.w4 = np.random.normal()
    self.w5 = np.random.normal()
    self.w6 = np.random.normal()

    # Пороги
    self.b1 = np.random.normal()
    self.b2 = np.random.normal()
    self.b3 = np.random.normal()

  def feedforward(self, x):
    # x is a numpy array with 2 elements.
    h1 = sigmoid(self.w1 * x[0] + self.w2 * x[1] + self.b1)
    h2 = sigmoid(self.w3 * x[0] + self.w4 * x[1] + self.b2)
    o1 = sigmoid(self.w5 * h1 + self.w6 * h2 + self.b3)
    return o1

  def train(self, data, all_y_trues):
    '''
    - data - массив numpy (n x 2) numpy, n = к-во наблюдений в наборе. 
    - all_y_trues - массив numpy с n элементами.
      Элементы all_y_trues соответствуют наблюдениям в data.
    '''
    learn_rate = 0.1
    epochs = 1000 # сколько раз пройти по всему набору данных 

    for epoch in range(epochs):
      for x, y_true in zip(data, all_y_trues):
        # --- Прямой проход (эти значения нам понадобятся позже)
        sum_h1 = self.w1 * x[0] + self.w2 * x[1] + self.b1
        h1 = sigmoid(sum_h1)

        sum_h2 = self.w3 * x[0] + self.w4 * x[1] + self.b2
        h2 = sigmoid(sum_h2)

        sum_o1 = self.w5 * h1 + self.w6 * h2 + self.b3
        o1 = sigmoid(sum_o1)
        y_pred = o1

        # --- Считаем частные производные.
        # --- Имена: d_L_d_w1 = "частная производная L по w1"
        d_L_d_ypred = -2 * (y_true - y_pred)

        # Нейрон o1
        d_ypred_d_w5 = h1 * deriv_sigmoid(sum_o1)
        d_ypred_d_w6 = h2 * deriv_sigmoid(sum_o1)
        d_ypred_d_b3 = deriv_sigmoid(sum_o1)

        d_ypred_d_h1 = self.w5 * deriv_sigmoid(sum_o1)
        d_ypred_d_h2 = self.w6 * deriv_sigmoid(sum_o1)

        # Нейрон h1
        d_h1_d_w1 = x[0] * deriv_sigmoid(sum_h1)
        d_h1_d_w2 = x[1] * deriv_sigmoid(sum_h1)
        d_h1_d_b1 = deriv_sigmoid(sum_h1)

        # Нейрон h2
        d_h2_d_w3 = x[0] * deriv_sigmoid(sum_h2)
        d_h2_d_w4 = x[1] * deriv_sigmoid(sum_h2)
        d_h2_d_b2 = deriv_sigmoid(sum_h2)

        # --- Обновляем веса и пороги
        # Нейрон h1
        self.w1 -= learn_rate * d_L_d_ypred * d_ypred_d_h1 * d_h1_d_w1
        self.w2 -= learn_rate * d_L_d_ypred * d_ypred_d_h1 * d_h1_d_w2
        self.b1 -= learn_rate * d_L_d_ypred * d_ypred_d_h1 * d_h1_d_b1

        # Нейрон h2
        self.w3 -= learn_rate * d_L_d_ypred * d_ypred_d_h2 * d_h2_d_w3
        self.w4 -= learn_rate * d_L_d_ypred * d_ypred_d_h2 * d_h2_d_w4
        self.b2 -= learn_rate * d_L_d_ypred * d_ypred_d_h2 * d_h2_d_b2

        # Нейрон o1
        self.w5 -= learn_rate * d_L_d_ypred * d_ypred_d_w5
        self.w6 -= learn_rate * d_L_d_ypred * d_ypred_d_w6
        self.b3 -= learn_rate * d_L_d_ypred * d_ypred_d_b3

      # --- Считаем полные потери в конце каждой эпохи
      if epoch % 10 == 0:
        y_preds = np.apply_along_axis(self.feedforward, 1, data)
        loss = mse_loss(all_y_trues, y_preds)
        print("Epoch %d loss: %.3f" % (epoch, loss))

# Определим набор данных
data = np.array([
  [-2, -1],  # Алиса
  [25, 6],   # Боб
  [17, 4],   # Чарли
  [-15, -6], # Диана
])
all_y_trues = np.array([
  1, # Алиса
  0, # Боб
  0, # Чарли
  1, # Диана
])

# Обучаем нашу нейронную сеть!
network = OurNeuralNetwork()
network.train(data, all_y_trues)
    
Код в сети
Вы можете запустить этот код и поиграть с ним самостоятельно. Он также доступен на GitHub.

По мере обучения сети ее потери постепенно уменьшаются:

Теперь мы можем использовать нашу сеть для предсказания пола:

        # Делаем пару предсказаний
emily = np.array([-7, -3]) # 128 фунтов (52.35 кг), 63 дюйма (160 см)
frank = np.array([20, 2])  # 155 pounds (63.4 кг), 68 inches (173 см)
print("Эмили: %.3f" % network.feedforward(emily)) # 0.951 - Ж
print("Фрэнк: %.3f" % network.feedforward(frank)) # 0.039 - М
    

Что теперь?

Вы сделали это! Давайте перечислим все, что мы с вами сделали:

  • Определили нейроны, составные элементы нейронных сетей.
  • Использовали сигмоидную функцию активации для наших нейронов.
  • Увидели, что нейронные сети – это всего лишь несколько нейронов, соединенных друг с другом.
  • Создали набор данных, в котором Вес и Рост были входными данными (или признаками), а Пол – выходным (или меткой).
  • Узнали о функции потерь и средней квадратичной ошибке (MSE).
  • Поняли, что обучение нейронной сети – это всего лишь минимизация ее потерь.
  • Использовали метод обратного распространения (backpropagation) для расчета частных производных.
  • Использовали стохастический градиентный спуск (SGD) для обучения нашей сети.

Перед вами – множество путей, на которых вас ждет масса нового и интересного:

Спасибо за внимание!

27
Сен
2020

Вычисление функций разложением в ряд Тейлора

Помогите, пожалуйста, решить проблему с вычислением функций разложением в ряд Тейлора. Первый столбец отвечает за значения аргумента, второй столбец за значения функции в точке. Третий столбец с неверными числами: там должны быть более точ…

26
Сен
2020

Разложение в ряд Тейлора функции(Python). Приближённое значение функции

Вроде бы ввожу правильное значение разложения в ряд Тейлора функции, а выдаёт не правильное значение. Подскажите, в чём проблема.
import math
from math import factorial
a=3.0
b=4.0
lich = 0
krok=(b-a)/10
lich=0

def f(x):
return 1/(1+(…

26
Сен
2020

Дано действительное число а(1<а<3) .Составить алгоритм, находящий среди чисел 1 , 1+1/2 , 1+1/2+1/3 , … первое, большее а

Язык C.
Не могу найти ошибку.
#include<stdio.h>
#include<math.h>
#include<locale.h>
void main()
{
setlocale(LC_ALL, "russian");
float a, s=0;
int i = 1;
printf("Введите число больше 1 и меньше 3…

25
Сен
2020

История Тима Хоппера – математика, который построил карьеру аналитика данных в сфере кибербезопасности.

Во вступительных публикациях серии мы писали о том, как можно изучить Data Science онлайн с нуля, а также о навыках, необходимых в профессии Data Scientist. В этом материале, подготовленном при поддержке Факультета Искусственного интеллекта онлайн-университета GeekBrains, мы перевели рассказ Тима Хоппера специалиста по анализу данных, разработчика программного обеспечения в области кибербезопасности и инженера машинного обучения. Тим изучал математику в колледже, а затем провел год в аспирантуре Университета Вирджинии. Сейчас он работает архитектором Data Science в DNT и ведет блог.

Перевод оригинального текста выполнен с сокращениями.

***

«Не было еще лучшего времени, чтобы стать математиком»

Во время моей учебы в колледже Business Week опубликовал статью, в которой говорилось: «не было еще лучшего времени, чтобы стать математиком». Тогда я видел огромное несоответствие между этим материалом и тем, чему меня учили на занятиях (а, значит, и теми, кого я считал математиками). Сталкиваясь с другими статьями, восхваляющими «век математиков», я все чаще задавался вопросом, знают ли их авторы, что на самом деле изучают студенты математических факультетов.

<a href="https://press.princeton.edu/sites/default/files/styles/hero_background/public/2019-09/SUB_Math_01_0.jpg?itok=dmWvu8Xm" target="_blank" rel="noopener noreferrer nofollow">Источник</a>
Источник

Небольшая предыстория обо мне

Пройденные мною в колледже курсы:

  • линейная алгебра;
  • дискретная математика;
  • дифференциальные уравнения (ОДУ и численные методы решения);
  • математическая статистика;
  • численные методы (линейное и квадратичное программирование);
  • общая алгебра;
  • теория чисел;
  • теория функций действительной переменной;
  • теория функций комплексной переменной;
  • общая топология.

Программа обучения также включала один семестр вводного курса по C++ и двух семестров физики для первокурсников. На протяжении года в аспирантуре я изучал анализ, алгебру и топологию. Моя курсовая работа была из области чистой математики, а домашние задания состояли из доказательств, выполненных ручкой на бумаге или оформленных в LaTeX.

Что такое Data Science?

Хотя моя текущая должность иногда и требует математических доказательств, я подозреваю, что это редкость среди специалистов по данным. Хотя проблема определения границ Data Science является трудной задачей (и я не буду пытаться ее здесь решать), кажется очевидным, что в моей учебной программе не хватало подготовки по многим областям науки о данных. Главными из них являются навыки программирования, практические аспекты работы со статистическими данными и опыт математического моделирования.

Программирование и инжиниринг

Программирование является ключевым навыком в Data Science. Как утверждал Дрю Конвей, «специалисту по обработке данных необязательно иметь ученую степень в области информатики, но он должен уметь манипулировать текстовыми файлами в командной строке, понимать векторизованные операции и думать алгоритмически. Эти навыки сделают из вас эксперта в вопросах работы с данными». Многие из моих однокурсников, кратко ознакомившиеся с C++ и время от времени использующие Mathematica для решения дифференциальных уравнений, не знали ничего о работе с файлами из командной строки, не говоря уже о том, чтобы написать простой скрипт для sed (потоковый текстовый редакторприм. переводчика).

Работа в сфере Data Science требует даже большего, чем просто решать проблемы с использованием программного кода. Как писал Трей Коузи, многие должности требуют навыков разработки программного обеспечения и владения инструментами написания повторно используемого кода – систем контроля версий и методов тестирования программного обеспечения. Хотя я учился в колледже программированию, некоторые необходимые мне сейчас в работе навыки, долго оставались для меня неизвестными.

Прикладная статистика

Мое краткое знакомство с математической статистикой было полезным для освоения машинного обучения, но в моей математической подготовке отсутствовали курсы, связанные с постановкой статистического эксперимента. При этом многие команды Data Science занимаются причинно-следственным выводом, проектированием экспериментов и их анализом. Об этих необходимых для Data Scientist навыках на математическом факультете я ничего не узнал. Более того, до написания курсовой работы, я бы даже не смог дать определение машинному обучению, которое является краеугольным камнем науки о данных. Я бы сказал, что искусственный интеллект – это системы исполнения бизнес-правил на Lisp и Prolog.

Прикладная математика

Те, кто изучал статистику, знают, что существует пропасть между пониманием статистики в теории и способностью эффективно применять статистические методы к повседневным задачам. Это лишь один из аспектов более серьезной проблемы: математическое (в том числе статистическое) моделирование является чрезвычайно сложной задачей, но в большинстве математических программ отсутствуют инструкции по эффективному моделированию реальных проблем. До сих пор определение проблемы в математических терминах одна из самых трудных задач, с которыми я сталкиваюсь. Уверен, что я в этом не одинок. Хотя сейчас я знаком с широким спектром математических моделей, редко бывает ясно, какая именно модель должна применяться в той или иной ситуации.

Подозреваю, что многие люди, даже технические специалисты, не уверены в том, что академическая математика выходит за рамки студенческих вычислений. Математики в основном работают с абстрактными структурами, которые редко имеют какое-либо отношение к наборам данных. Джон Д. Кук сделал аналогичные наблюдения об ограничениях дисциплин чистой и прикладной математики, назвав себя «очень прикладным математиком». Под очень прикладной математикой он понимает «готовность к “грязной” работе, необходимой, чтобы увидеть, как математика используется на практике. Это касается не только самой математики, но и консалтинга, менеджмента, маркетинга и т. д.» Эти навыки явно отсутствуют в большинстве учебных программ, с которыми я знаком.

Математика → Data Science

Математическое образование оставило меня совершенно неподготовленным к карьере в области Data Science. Поэтому вы могли бы спросить, как я получил работу аналитиком данных. Могу назвать несколько причин.

<a href="https://digitalsocietyschool.org/wp/wp-content/uploads/2018/09/data_track_banner.png" target="_blank" rel="noopener noreferrer nofollow">Источник</a>
Источник

Первая причина

Академическое изучение математики обеспечивает большую часть теоретических основ Data Science. Математика лежит в основе изучения машинного обучения, статистики, оптимизации, структур данных, анализа алгоритмов, архитектуры компьютеров и других важных аспектов Data Science. Знание математики позволяет быстрее овладеть каждой из этих областей. Например, изучение метода главных компонент будет значительно проще для человека с опытом в линейной алгебре. На метауровне обучение математике заставляет студентов тщательно обдумывать и решать сложные задачи эти навыки ценны во многих областях, в том числе и Data Science.

Вторая причина

Я невольно прошел ряд курсов, которые впоследствии сыграли важную роль в моем инструментарии Data Science. Например, текущая работа в области байесовского вывода стала возможной благодаря знанию линейной алгебры, численных методов, стохастических процессов, теории меры и математической статистики.

Третья причина

Я получил степень бакалавра по информатике. Это обеспечило прочную основу, когда я решил серьезно заняться развитием навыков программирования в 2010 г. Хотя мое академическое знакомство с компьютерными науками не дало навыков инженера-программиста, я окончил колледж с четким пониманием основных структур данных, анализа алгоритмов, теории сложности и нескольких языков программирования.

Четвертая причина

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

Пятая причина

Ненасытный интерес к компьютерам и решению задач сыграл ключевую роль в моем карьерном успехе. Страстно желая освоить программирование, я изучил PHP и SQL еще в средней школе (кстати, чтобы сделать фан-сайт Толкиена). Получив небольшие домашние задания по решению дифференциальных уравнений в Mathematica, я купил и прочитал книгу по программированию в Mathematica. В колледже и аспирантуре я часто пытался (иногда это удавалось) писать программы для решения домашних заданий, которые, как ожидали профессора, должны были решаться вручную. Эта любознательность снова и снова доказывала свою ценность: мне приходилось осваивать новые навыки и решать технические проблемы всех видов. Я с удовольствием принимаюсь за решение новых задач как на работе, так и в свободное время, вот уже пятнадцать лет.

Шестая причина

Мне посчастливилось найти работодателей, которые терпеливо обучали меня и давали свободу учиться самостоятельно. За два с половиной года профессиональной карьеры я изучил много нового и не думаю, что в ближайшее время остановлюсь. Как сказал Мэт Келси: «всегда будь уверен, что ты не самый умный человек в этой комнате». Я очень благодарен трем местам работы, где был окружен умными людьми, которые передали мне многие знания, и руководителям, которые доверяли мне достаточно, чтобы позволять разбираться во всем самостоятельно.

И наконец

Благодаря четырем с половиной годам участия в сообществе Data Science в Twitter, у меня была возможность общаться с одними из самых ярких умов в сфере Data Science (большинство этих людей я никогда не встречал лично), и построить социальную сеть, которая помогла мне найти текущую работу. Однако я больше всего хочу подчеркнуть педагогическую ценность твиттера. Каждый день я узнаю о выпуске новых программных инструментов, новых постах в блогах и размышлениях моих героев Data Science. Твиттер помогает понять, какие посты стоят времени, и благодаря ему я знаю о Theano, Scalding и dplyr.

Заключение

Тем, кто нанимает дата-сайентистов, стоит признать, что математика в том виде, в котором она преподается, может оказаться ненужной в работе команды. Многие люди с докторской степенью по математике не смогли бы определить линейную регрессию или фильтры Блума. В то же время получение математических специальностей учит думать и решать сложные задачи. Математики могут читать научные статьи и понимать новые проблемы быстрее, чем программисты. Получив дополнительное образование, они могут стать и отличными программистами.

Если вы все еще студент, у вас есть прекрасная возможность взять под контроль свой карьерный путь. Подумайте о занятиях по информатике (например, структуры данных, алгоритмы, разработка программного обеспечения, машинное обучение) и статистике (экспериментальный дизайн, анализ данных, Data Mining). Ваши математические знания станут востребованы при сочетании таких навыков, как программирование и машинное обучение. Не позволяйте курсовой работе быть пределом вашего образования. Так много еще предстоит узнать!

***

Желающим освоить профессию аналитика данных мы рекомендуем курс Data Science Факультета Искусственного интеллекта. Программа включает основательную математическую подготовку: введение в математический анализ, теорию вероятностей и математическую статистику, линейную алгебру и алгоритмы анализа данных. А также программирование и навыки практической работы в команде. Кроме того, онлайн-университет GeekBrains позволяет не только получить студентам необходимые знания, но и устроиться на работу.

24
Сен
2020

Интерполяция между тремя значениями на Java

Даны три значения типа double, например 5.0 (0.3), 20.0(0.8), 10.0(0.1)
Для каждого из трёх значений есть своя "глубина" (если так правильно выразиться). Это значение от 0.0 до 1.0. Чем значение глубины ближе к 1.0, тем это значе…

22
Сен
2020

Математическая задача

Есть задача, она выглядит так:

Я составил программу с помощью Math.pow, прошу помощи или совета от спецов.
Cам код выглядит так:
package zadaniyeb.java;

public class Main {

public static void main(String[] args) {

doubl…

17
Сен
2020

Сколько способов представить число, как сумму трех разных чисел (строго O(n))

Нужно посчитать сколько есть способов представить число, как сумму трех разных чисел.
Например число 8 можно представить двумя способами: 1 + 2 + 5 и 1 + 3 + 4.
А число 6 одним: 1+2+3.
Решение должно быть O(n).
Мне пока удалось только пос…

13
Сен
2020

Счастливый билет – 2

Решаю задачу
. Её суть в том, чтобы определить является ли билет счастливым. Билет счастливый, если число можно разделить на две части, таким образом, чтобы сумма цифр была равная.
Написал код:
n = input()
c = []
for i in list(str(n)):

09
Сен
2020

Краткое описание десяти основных алгоритмов на графах с визуализацией графов и примерами использования алгоритмов на практике.

Графы стали мощным средством моделирования и представ…

06
Сен
2020

Различение двух несложных мат. формул. путем проведения операции с yaw

Как различать две формулы, на выходе будет даваться точный результат с указанием какая это была формула.
// Возьмём как входное значение поворота игрока
double yaw = (Math.random() * ((150 – 30) + 1)) + 30;
// Возьмём стандартное значение …

06
Сен
2020

Разложить число на кратчайшую сумму квадратов

Задача: пользователь вводит число не больше чем 10 000 000, программа должна разложить число на сумму квадратов так, чтобы этих квадратов было минимальное количество
Пример:
34 = 25+9
35 = 25+9+1
32 = 16+16
39 = 25+9+4+1
Честно, питон знаю…

30
Авг
2020

Вращение точки с помощью матрицы поворота/углов Эйлера

Ниже представлены 3 функции, каждая из которых вращает две точки вокруг соответствующих осей. Точки поочередно вращаются вокруг осей X Y Z (Не думаю что порядок, впрочем, важен). Объект действительно вращается без деформаций, но оси вращен…

27
Авг
2020

Как можно сгенерировать список всех комбинаций цифр четырехзначного числа?

Как можно сгенерировать список всех комбинаций цифр четырехзначного числа?
Первый разряд может содержать 0. Есть 4 разряда, в каждом может стоять цифра от 0 до 9. Как я понимаю, это 10^4.
Как это можно реализовать?