Может ли машинное обучение моделировать простые математические функции?

машинное обучение искусственный интеллект Программа перевода самородков Python
Может ли машинное обучение моделировать простые математические функции?

Может ли машинное обучение моделировать простые математические функции?

Смоделируйте некоторые базовые математические функции с помощью машинного обучения

В последнее время стало обычной практикой применять машинное обучение к различным задачам. кажется, в каждомКривая технологического цикла GartnerВсе новые технологии в Интернете включают машинное обучение, что является тенденцией. Эти алгоритмы рассматриваются как модели для самостоятельного понимания: разложите любой тип данных на строку функций, примените некоторые модели машинного обучения «черный ящик», решите каждую модель и выберите ту, которая дает лучший результат.

Но действительно ли машинное обучение может решить все проблемы? Или он подходит только для небольшого подмножества задач? В этом посте мы попытаемся ответить на более фундаментальный вопрос о том, может ли машинное обучение вывести те математические соотношения, которые часто возникают в повседневной жизни. Здесь я попытаюсь подобрать несколько основных функций, используя некоторые популярные методы машинного обучения, и посмотреть, могут ли эти алгоритмы идентифицировать и моделировать эти основные математические отношения.

Функции, которые мы попробуем:

  • Линейная функция
  • Экспоненциальная функция
  • Логарифмическая функция
  • Функция мощности
  • Модульная функция
  • Тригонометрические функции

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

  • XGBoost
  • Линейная регрессия
  • Регрессия опорных векторов (SVR)
  • Древо решений
  • случайный лес
  • Многослойный персептрон (нейронная сеть с прямой связью)

подготовка данных

Я оставлю зависимую переменную в качестве измерения 4 (нет причин выбирать именно это число). Итак, отношение между X (независимая переменная) и Y (зависимая переменная):

f :- функция, которую мы подойдем

Эпсилон: - Случайный шум (делает Y немного более реалистичным, так как в реальных данных всегда есть некоторый шум)

Каждый тип функции принимает ряд параметров. Эти параметры получаются путем генерации случайных чисел следующим образом:

numpy.random.normal()
numpy.random.randint()

randint() используется для получения аргумента степенной функции, чтобы значение Y не было особенно маленьким. normal() используется во всех остальных случаях.

Создайте независимую переменную (т.е. X):

function_type = 'Linear'

if function_type=='Logarithmic':
    X_train = abs(np.random.normal(loc=5, size=(1000, 4)))
    X_test = abs(np.random.normal(loc=5, size=(500, 4)))
else:
    X_train = np.random.normal(size=(1000, 4))
    X_test = np.random.normal(size=(500, 4))

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

Получите зависимую переменную (т.е. Y):

def get_Y(X, function_type, paras):
    X1 = X[:,0]
    X2 = X[:,1]
    X3 = X[:,2]
    X4 = X[:,3]
    if function_type=='Linear':
        [a0, a1, a2, a3, a4] = paras
        noise = np.random.normal(scale=(a1*X1).var(), size=X.shape[0])
        Y = a0+a1*X1+a2*X2+a3*X3+a4*X4+noise
    elif function_type=='Exponential':
        [a0, a1, a2, a3, a4] = paras
        noise = np.random.normal(scale=(a1*np.exp(X1)).var(), size=X.shape[0])
        Y = a0+a1*np.exp(X1)+a2*np.exp(X2)+a3*np.exp(X3)+a4*np.exp(X4)+noise
    elif function_type=='Logarithmic':
        [a0, a1, a2, a3, a4] = paras
        noise = np.random.normal(scale=(a1*np.log(X1)).var(), size=X.shape[0])
        Y = a0+a1*np.log(X1)+a2*np.log(X2)+a3*np.log(X3)+a4*np.log(X4)+noise
    elif function_type=='Power':
        [a0, a1, a2, a3, a4] = paras
        noise = np.random.normal(scale=np.power(X1,a1).var(), size=X.shape[0])
        Y = a0+np.power(X1,a1)+np.power(X2,a2)+np.power(X2,a2)+np.power(X3,a3)+np.power(X4,a4)+noise
    elif function_type=='Modulus':
        [a0, a1, a2, a3, a4] = paras
        noise = np.random.normal(scale=(a1*np.abs(X1)).var(), size=X.shape[0])
        Y = a0+a1*np.abs(X1)+a2*np.abs(X2)+a3*np.abs(X3)+a4*np.abs(X4)+noise
    elif function_type=='Sine':
        [a0, a1, b1, a2, b2, a3, b3, a4, b4] = paras
        noise = np.random.normal(scale=(a1*np.sin(X1)).var(), size=X.shape[0])
        Y = a0+a1*np.sin(X1)+b1*np.cos(X1)+a2*np.sin(X2)+b2*np.cos(X2)+a3*np.sin(X3)+b3*np.cos(X3)+a4*np.sin(X4)+b4*np.cos(X4)+noise
    else:
        print('Unknown function type')

    return Y


if function_type=='Linear':
    paras = [0.35526578, -0.85543226, -0.67566499, -1.97178384, -1.07461643]
    Y_train = get_Y(X_train, function_type, paras)
    Y_test = get_Y(X_test, function_type, paras)
elif function_type=='Exponential':
    paras = [ 0.15644562, -0.13978794, -1.8136447 ,  0.72604755, -0.65264939]
    Y_train = get_Y(X_train, function_type, paras)
    Y_test = get_Y(X_test, function_type, paras)
elif function_type=='Logarithmic':
    paras = [ 0.63278503, -0.7216328 , -0.02688884,  0.63856392,  0.5494543]
    Y_train = get_Y(X_train, function_type, paras)
    Y_test = get_Y(X_test, function_type, paras)
elif function_type=='Power':
    paras = [2, 2, 8, 9, 2]
    Y_train = get_Y(X_train, function_type, paras)
    Y_test = get_Y(X_test, function_type, paras)
elif function_type=='Modulus':
    paras = [ 0.15829356,  1.01611121, -0.3914764 , -0.21559318, -0.39467206]
    Y_train = get_Y(X_train, function_type, paras)
    Y_test = get_Y(X_test, function_type, paras)
elif function_type=='Sine':
    paras = [-2.44751615,  1.89845893,  1.78794848, -2.24497666, -1.34696884, 0.82485303,  0.95871345, -1.4847142 ,  0.67080158]
    Y_train = get_Y(X_train, function_type, paras)
    Y_test = get_Y(X_test, function_type, paras)

Шум случайным образом выбирается из нормального распределения с нулевым средним значением. Я установил дисперсию шума равной дисперсии f(X), чтобы гарантировать, что «сигнал и шум» в наших данных сопоставимы, и что шум не теряется в сигнале, и наоборот.

тренироваться

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

model_type = 'MLP'

if model_type=='XGBoost':
    model = xgb.XGBRegressor()
elif model_type=='Linear Regression':
    model = LinearRegression()
elif model_type=='SVR':
    model = SVR()
elif model_type=='Decision Tree':
    model = DecisionTreeRegressor()
elif model_type=='Random Forest':
    model = RandomForestRegressor()
elif model_type=='MLP':
    model = MLPRegressor(hidden_layer_sizes=(10, 10))

model.fit(X_train, Y_train)

результат

Results

Большинство результатов производительности намного лучше среднего базового уровня. Рассчитанный средний R-квадрат равен70.83%,Мы можем сказать, что методы машинного обучения действительно могут эффективно моделировать эти простые математические функции..

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

Некоторые результаты удивительны (по крайней мере, для меня), некоторые разумны. В совокупности эти результаты подтверждают некоторые из наших предыдущих идей, а также предлагают новые.

В итоге мы можем сделать следующие выводы:

  • Хотя линейная регрессия является простой моделью, она превосходит другие модели на линейно коррелированных данных.
  • В большинстве случаев дерево решений
  • В отличие от последних популярных на практике трендов, XGBoost (всего 2 результата из 6) не должен быть универсальным решением для всех типов табличных данных, нам все равно нужно честное сравнение каждой модели.
  • Вопреки нашему предположению, линейные функции не всегда легко предсказать. Мы получили лучший агрегированный результат R-квадрата по логарифмической функции на уровне 92,98%.
  • Влияние различных техник на разные базовые функции (относительно) очень различно, поэтому выбор техники для задачи должен пройти через идеальное мышление и экспериментирование.

Смотрите мой полный кодgithub.


Ставьте лайки, комментируйте и делитесь. Конструктивная критика и отзывы всегда приветствуются!

Если вы обнаружите ошибки в переводе или в других областях, требующих доработки, добро пожаловать наПрограмма перевода самородковВы также можете получить соответствующие бонусные баллы за доработку перевода и PR. начало статьиПостоянная ссылка на эту статьюЭто ссылка MarkDown этой статьи на GitHub.


Программа перевода самородковэто сообщество, которое переводит высококачественные технические статьи из Интернета сНаггетсДелитесь статьями на английском языке на . Охват контентаAndroid,iOS,внешний интерфейс,задняя часть,блокчейн,продукт,дизайн,искусственный интеллектЕсли вы хотите видеть более качественные переводы, пожалуйста, продолжайте обращать вниманиеПрограмма перевода самородков,официальный Вейбо,Знай колонку.