- Оригинальный адрес:Can Machine Learning model simple Math functions?
- Оригинальный автор:Harsh Sahu
- Перевод с:Программа перевода самородков
- Постоянная ссылка на эту статью:GitHub.com/rare earth/gold-no…
- Переводчик:Minghao23
- Корректор:lsvih,zoomdong
Может ли машинное обучение моделировать простые математические функции?
Смоделируйте некоторые базовые математические функции с помощью машинного обучения
В последнее время стало обычной практикой применять машинное обучение к различным задачам. кажется, в каждомКривая технологического цикла 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)
результат
Большинство результатов производительности намного лучше среднего базового уровня. Рассчитанный средний R-квадрат равен70.83%,Мы можем сказать, что методы машинного обучения действительно могут эффективно моделировать эти простые математические функции..
Но благодаря этому эксперименту мы не только узнаем, может ли машинное обучение моделировать эти функции, но и понимаем, как различные методы машинного обучения работают с различными базовыми функциями.
Некоторые результаты удивительны (по крайней мере, для меня), некоторые разумны. В совокупности эти результаты подтверждают некоторые из наших предыдущих идей, а также предлагают новые.
В итоге мы можем сделать следующие выводы:
- Хотя линейная регрессия является простой моделью, она превосходит другие модели на линейно коррелированных данных.
- В большинстве случаев дерево решений
- В отличие от последних популярных на практике трендов, XGBoost (всего 2 результата из 6) не должен быть универсальным решением для всех типов табличных данных, нам все равно нужно честное сравнение каждой модели.
- Вопреки нашему предположению, линейные функции не всегда легко предсказать. Мы получили лучший агрегированный результат R-квадрата по логарифмической функции на уровне 92,98%.
- Влияние различных техник на разные базовые функции (относительно) очень различно, поэтому выбор техники для задачи должен пройти через идеальное мышление и экспериментирование.
Смотрите мой полный кодgithub.
Ставьте лайки, комментируйте и делитесь. Конструктивная критика и отзывы всегда приветствуются!
Если вы обнаружите ошибки в переводе или в других областях, требующих доработки, добро пожаловать наПрограмма перевода самородковВы также можете получить соответствующие бонусные баллы за доработку перевода и PR. начало статьиПостоянная ссылка на эту статьюЭто ссылка MarkDown этой статьи на GitHub.
Программа перевода самородковэто сообщество, которое переводит высококачественные технические статьи из Интернета сНаггетсДелитесь статьями на английском языке на . Охват контентаAndroid,iOS,внешний интерфейс,задняя часть,блокчейн,продукт,дизайн,искусственный интеллектЕсли вы хотите видеть более качественные переводы, пожалуйста, продолжайте обращать вниманиеПрограмма перевода самородков,официальный Вейбо,Знай колонку.