Приложение для линейной регрессии
Простое приложение для линейной регрессии
Проиллюстрируем разработку приложения для ввода данных и построения графика, позволяющее получить тренд и скопировать формулу линейной функции, аппроксимирующей их.
Запуск и остановка приложения
В папке с примером располагается файл app.jl
, который содержит код минимального приложения для построения тренда по пользовательским данным. График позволяет визуально оценить корректность аппроксимации, а для дальнейших манипуляций пользователь получает уравнение в виде функции f(x) = a*x + b
, которое можно вставить в терминал или кодовую ячейку и выполнить как элемент пользовательской программы.
В этом примере мы не пользуемся пространством переменных Engee или управлением моделями (всё это доступно через библиотеку using Engee
). Мы лишь покажем, как интегрировать код серверного приложения на Julia с HTML кодом веб-страницы.
Вы можете запустить приложение и получить ссылку, по которой его можно открыть в отдельном окне (пока "серверная часть" на Julia остается активной).
genie_app = engee.genie.start("$(@__DIR__)/app.jl", log_file="log.txt");
display("text/html", """<a href="$(string(genie_app.url))" target="_blank">Открыть в отдельном окне</a>""")
Для остановки приложения в целях отладки или просто для перезапуска нужна следующая команда, которую нужно раскомментировать чтобы выполнить:
engee.genie.stop("$(@__DIR__)/app.jl");
Код пустого Engee-приложения
Давайте разберем, из чего состоит такая программа. Минимальное содержание файла app.jl
приведено ниже.
using GenieFramework
@app begin
#
end
function ui()
[
h1("Линейная регрессия")
]
end
@page("/", ui)
Мы видим начало приложения, где на макете приложения ui()
есть заголовок, а пустая секция @app
не содержит реактивных переменных и функций.
Минимальное приложение, выводящее график
Следующий шаг в разработке состоит в наполнении макета пользовательскими элементами управления, а секцию @app
- реактивными переменными функциями, привязанными к обновлению элементов GUI или самих реактивных переменных:
using GenieFramework, PlotlyBase
# Начальные демонстрационные данные
const TEST_VEC_X = -10:10
const TEST_VEC_Y = (-10:10).^2 + 10 .* rand(21) .- 5
@app begin
@in x_data = ""
@in y_data = ""
@out message = "Введите данные"
@out plot_data = [scatter(x=TEST_VEC_X, y=TEST_VEC_Y, mode="markers", name="Данные")]
end
function ui()
[
h1("Линейная регрессия"),
textfield("X данные (через запятую)", :x_data),
textfield("Y данные (через запятую)", :y_data),
p("{{message}}"),
plot(:plot_data)
]
end
@page("/", ui)
Этот код пока что не делает ничего кроме отображения тестовых данных, но в нём уже есть реактивные переменные. Инструментарий Engee берет на себя обновление значений этих переменных на клиентской и на серверной стороне (следует учитывать, что на стороне клиентов выполняется приложение JavaScript, а на стороне сервера работает Julia).
Это приложение работает, но чтобы обновлять график, нам понадобятся функции проверки и обработки ввода (переводят строковый ввод в вектор значений), выполнения линейной регрессии (функция linear_regression
, основанная на методе a, b = A \ vec_y
), построения графика данных и тренда (create_plot_traces
) и функцию, которая объединяет эти три действия (update_plot_data
). Вы их найдете в файле app.jl
.
Заключение
Мы рассмотрели, как организовать минималистичное приложение с графиком, парой строковых параметров и строчкой для вывода статусного сообщения. Элементы легко поменять местами, а функциональность приложения легко дораборать, добавив код на Julia или привязав к приложению внешние библиотеки.